MediaRecorder
Baseline 广泛可用 *
MediaRecorder 接口是 MediaStream Recording API 的一部分,提供了方便录制媒体的功能。它通过 MediaRecorder() 构造函数创建。
构造函数
MediaRecorder()-
创建一个新的
MediaRecorder对象,需要传入一个要录制的MediaStream。可以通过选项来设置容器的 MIME 类型(例如"video/webm"或"video/mp4")以及音轨和视频轨的比特率,或者一个整体比特率。
实例属性
MediaRecorder.mimeType只读-
返回创建
MediaRecorder对象时所选的录制容器的 MIME 类型。 MediaRecorder.state只读-
返回
MediaRecorder对象的当前状态(inactive、recording或paused)。 MediaRecorder.stream只读-
返回创建
MediaRecorder对象时传入的流。 MediaRecorder.videoBitsPerSecond只读-
返回正在使用的视频编码比特率。这可能与构造函数中指定的比特率(如果已提供)不同。
MediaRecorder.audioBitsPerSecond只读-
返回正在使用的音频编码比特率。这可能与构造函数中指定的比特率(如果已提供)不同。
MediaRecorder.audioBitrateMode只读 实验性-
返回用于编码音轨的比特率模式。
静态方法
MediaRecorder.isTypeSupported()-
一个静态方法,返回一个
true或false值,指示当前用户代理是否支持给定的 MIME 媒体类型。
实例方法
MediaRecorder.pause()-
暂停媒体录制。
MediaRecorder.requestData()-
请求一个包含到目前为止已接收到的(或自上次调用
requestData()以来)数据的Blob。调用此方法后,录制会继续,但在一个新的Blob中。 MediaRecorder.resume()-
在暂停后恢复媒体录制。
MediaRecorder.start()-
开始录制媒体;此方法可以选择性地传递一个
timeslice参数,其值以毫秒为单位。如果指定了此参数,媒体将被捕获成该持续时间的独立块,而不是默认的将媒体录制成一个大的块。 MediaRecorder.stop()-
停止录制,此时会触发一个包含最终已保存数据的
Blob的dataavailable事件。不再进行录制。
事件
使用 addEventListener() 或通过将事件监听器分配给此接口的 oneventname 属性来监听这些事件。
dataavailable-
每当录制了
timeslice毫秒的媒体时(或者,如果未指定timeslice,则在整个媒体录制完成后),会定期触发。该事件类型为BlobEvent,在其data属性中包含录制的媒体。 error-
当发生导致录制停止的致命错误时触发。接收到的事件基于
MediaRecorderErrorEvent接口,其error属性包含一个DOMException,描述了发生的实际错误。 pause-
媒体录制暂停时触发。
resume-
媒体录制在暂停后恢复时触发。
start-
媒体录制开始时触发。
stop-
媒体录制结束时触发,可能是当
MediaStream结束时,或在调用MediaRecorder.stop()方法后。
示例
if (navigator.mediaDevices) {
console.log("getUserMedia supported.");
const constraints = { audio: true };
let chunks = [];
navigator.mediaDevices
.getUserMedia(constraints)
.then((stream) => {
const mediaRecorder = new MediaRecorder(stream);
record.onclick = () => {
mediaRecorder.start();
console.log(mediaRecorder.state);
console.log("recorder started");
record.style.background = "red";
record.style.color = "black";
};
stop.onclick = () => {
mediaRecorder.stop();
console.log(mediaRecorder.state);
console.log("recorder stopped");
record.style.background = "";
record.style.color = "";
};
mediaRecorder.onstop = (e) => {
console.log("data available after MediaRecorder.stop() called.");
const clipName = prompt("Enter a name for your sound clip");
const clipContainer = document.createElement("article");
const clipLabel = document.createElement("p");
const audio = document.createElement("audio");
const deleteButton = document.createElement("button");
const mainContainer = document.querySelector("body");
clipContainer.classList.add("clip");
audio.setAttribute("controls", "");
deleteButton.textContent = "Delete";
clipLabel.textContent = clipName;
clipContainer.appendChild(audio);
clipContainer.appendChild(clipLabel);
clipContainer.appendChild(deleteButton);
mainContainer.appendChild(clipContainer);
audio.controls = true;
const blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" });
chunks = [];
const audioURL = URL.createObjectURL(blob);
audio.src = audioURL;
console.log("recorder stopped");
deleteButton.onclick = (e) => {
const evtTgt = e.target;
evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode);
};
};
mediaRecorder.ondataavailable = (e) => {
chunks.push(e.data);
};
})
.catch((err) => {
console.error(`The following error occurred: ${err}`);
});
}
注意: 此代码示例灵感来自 Web Dictaphone 演示。为简洁起见,省略了一些行;请 参考源代码 以获取完整代码。
规范
| 规范 |
|---|
| MediaStream Recording # mediarecorder-api |
浏览器兼容性
加载中…
另见
- 使用 MediaStream Recording API
- Web Dictaphone:MediaRecorder + getUserMedia + Web Audio API 可视化演示,由 Chris Mills 制作(GitHub 源代码)。
- Recording a media element
- simpl.info MediaStream 录制演示,由 Sam Dutton 制作。
MediaDevices.getUserMedia()- OpenLang:HTML 视频语言实验室 Web 应用程序,使用 MediaDevices 和 MediaStream Recording API 进行视频录制(GitHub 源代码)。