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

瀏覽器相容性

另見