MediaRecorder

Baseline 广泛可用 *

此特性已得到良好支持,可在多种设备和浏览器版本上使用。自 2021 年 4 月起,所有浏览器均已支持此特性。

* 此特性的某些部分可能存在不同级别的支持。

MediaRecorder 接口是 MediaStream Recording API 的一部分,提供了方便录制媒体的功能。它通过 MediaRecorder() 构造函数创建。

EventTarget MediaRecorder

构造函数

MediaRecorder()

创建一个新的 MediaRecorder 对象,需要传入一个要录制的 MediaStream。可以通过选项来设置容器的 MIME 类型(例如 "video/webm""video/mp4")以及音轨和视频轨的比特率,或者一个整体比特率。

实例属性

MediaRecorder.mimeType 只读

返回创建 MediaRecorder 对象时所选的录制容器的 MIME 类型。

MediaRecorder.state 只读

返回 MediaRecorder 对象的当前状态(inactiverecordingpaused)。

MediaRecorder.stream 只读

返回创建 MediaRecorder 对象时传入的流。

MediaRecorder.videoBitsPerSecond 只读

返回正在使用的视频编码比特率。这可能与构造函数中指定的比特率(如果已提供)不同。

MediaRecorder.audioBitsPerSecond 只读

返回正在使用的音频编码比特率。这可能与构造函数中指定的比特率(如果已提供)不同。

MediaRecorder.audioBitrateMode 只读 实验性

返回用于编码音轨的比特率模式。

静态方法

MediaRecorder.isTypeSupported()

一个静态方法,返回一个 truefalse 值,指示当前用户代理是否支持给定的 MIME 媒体类型。

实例方法

MediaRecorder.pause()

暂停媒体录制。

MediaRecorder.requestData()

请求一个包含到目前为止已接收到的(或自上次调用 requestData() 以来)数据的 Blob。调用此方法后,录制会继续,但在一个新的 Blob 中。

MediaRecorder.resume()

在暂停后恢复媒体录制。

MediaRecorder.start()

开始录制媒体;此方法可以选择性地传递一个 timeslice 参数,其值以毫秒为单位。如果指定了此参数,媒体将被捕获成该持续时间的独立块,而不是默认的将媒体录制成一个大的块。

MediaRecorder.stop()

停止录制,此时会触发一个包含最终已保存数据的 Blobdataavailable 事件。不再进行录制。

事件

使用 addEventListener() 或通过将事件监听器分配给此接口的 oneventname 属性来监听这些事件。

dataavailable

每当录制了 timeslice 毫秒的媒体时(或者,如果未指定 timeslice,则在整个媒体录制完成后),会定期触发。该事件类型为 BlobEvent,在其 data 属性中包含录制的媒体。

error

当发生导致录制停止的致命错误时触发。接收到的事件基于 MediaRecorderErrorEvent 接口,其 error 属性包含一个 DOMException,描述了发生的实际错误。

pause

媒体录制暂停时触发。

resume

媒体录制在暂停后恢复时触发。

start

媒体录制开始时触发。

stop

媒体录制结束时触发,可能是当 MediaStream 结束时,或在调用 MediaRecorder.stop() 方法后。

示例

js
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

浏览器兼容性

另见