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 原始碼)。