--- title: MediaStream Recording API slug: Web/API/MediaStream_Recording_API tags: - API - Audio - Media - Media Capture and Streams - MediaStream Recording - MediaStream Recording API - NeedsTranslation - Overview - Reference - TopicStub - Video translation_of: Web/API/MediaStream_Recording_API ---
MediaStream Recording API 由一个主接口{{domxref("MediaRecorder")}}组成,这个接口负责的所有工作是从{{domxref("MediaStream")}}获取数据并将其传递给你进行处理。数据通过一系列{{event("dataavailable")}}事件传递,这些数据已经成为你创建 MediaRecorder
时所声明的格式。然后,您可以进一步处理数据,或者根据需要将其写入文件。
记录一个流的过程是非常容易的:
data
属性. 你可以强制 dataavailable
事件发生, 因此会给你传递最新的声音以至于可以让你过滤、保存或者做一些其他的事情。注意: 单单使用包含已经录制好媒体切片的{{domxref("Blob")}}s 将大可不能单独播放. 媒体在重放之前需要重新组装 .
如果在录制过程中出错, {{event("error")}} 事件将会传给MediaRecorder
. 你可以设置{{domxref("MediaRecorder.onerror", "onerror")}}去监听 error
事件.
例子中,我们使用Canvas 作为{{domxref("MediaStream")}}的源,在9秒后停止录音.
var canvas = document.querySelector("canvas"); // Optional frames per second argument. var stream = canvas.captureStream(25); var recordedChunks = []; console.log(stream); var options = { mimeType: "video/webm; codecs=vp9" }; mediaRecorder = new MediaRecorder(stream, options); mediaRecorder.ondataavailable = handleDataAvailable; mediaRecorder.start(); function handleDataAvailable(event) { console.log("data-available"); if (event.data.size > 0) { recordedChunks.push(event.data); console.log(recordedChunks); download(); } else { // ... } } function download() { var blob = new Blob(recordedChunks, { type: "video/webm" }); var url = URL.createObjectURL(blob); var a = document.createElement("a"); document.body.appendChild(a); a.style = "display: none"; a.href = url; a.download = "test.webm"; a.click(); window.URL.revokeObjectURL(url); } // demo: to download after 9sec setTimeout(event => { console.log("stopping"); mediaRecorder.stop(); }, 9000);
你也可以使用 MediaRecorder
对象的属性去决定录制过程的状态, 用 {{domxref("MediaRecorder.pause", "pause()")}} 和 {{domxref("MediaRecorder.resume", "resume()")}} 方法暂停或者继续媒体源的录制.
如果你需要检查一个特殊的MIME类型是否被支持,使用{{domxref("MediaRecorder.isTypeSupported()")}}.
如果你的目标是记录摄像头或麦克风输入,您可能希望在构建 MediaRecorder
之前检查可用的输入设备. 这时,你需要调用 {{domxref("MediaDevices.enumerateDevices", "navigator.mediaDevices.enumerateDevices()")}} 来得到可使用的媒体设备. 你可以检查此列表,发现潜在的设备,甚至在有需要的时候过滤掉设备.
在这块代码中, enumerateDevices()
被用来检查可利用的设备,找到那些音频输入设备, 创建{{HTMLElement("option")}} 元素,之后添加到{{HTMLElement("select")}}元素,代表输入源选择器 .
navigator.mediaDevices.enumerateDevices() .then(function(devices) { devices.forEach(function(device) { let menu = document.getElementById("inputdevices"); if (device.kind == "audioinput") { let item = document.createElement("option"); item.innerHTML = device.label; item.value = device.deviceId; menu.appendChild(item); } }); });
类似的代码可以用来让用户限制他们希望使用的设备。
更多关于MediaStream Recording API 的使用, 查看 Using the MediaStream Recording API, 这个显示了如何使用API来记录音频剪辑. 另一篇文章, Recording a media element, 介绍了如何从 {{HTMLElement("audio")}} 或{{HTMLElement("video")}} 元素 接收信息流和如何使用接收到的信息流(这个案例中,接收、存到硬盘)。
dataavailable
.Specification | Status | Comment |
---|---|---|
{{SpecName("MediaStream Recording", "#MediaRecorderAPI")}} | {{Spec2("MediaStream Recording")}} | Initial definition |