使用 MediaRecorder 錄製音訊和視訊

快來開香檳、吃甜甜圈吧!目前「所有」都實作了 Chrome 功能,「最醒目」

想像一下,滑雪跑步記錄器可將影片與地理位置資料同步,或是超簡單的語音備忘錄應用程式,或是可讓你錄製影片並上傳至 YouTube 的小工具,而且這些功能都不需要外掛程式。

MediaRecorder API 可讓您透過網路應用程式錄製音訊和視訊。這項 API 現已支援 Firefox、Android 版 Chrome 和電腦版 Chrome。

按這裡試用。

Android Nexus 5X 上的 mediaRecorder 示範螢幕截圖

這個 API 很簡單,我會使用 WebRTC 範例存放區示範中的程式碼來說明。請注意,您只能從安全來源使用此 API:HTTPS 或 localhost。

首先,請使用 MediaStream 將 MediaRecorder 例項化。您可以選擇使用 options 參數指定所需的輸出格式:

var options = {mimeType: 'video/webm; codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);

MediaStream 可以來自下列來源:

  • getUserMedia() 呼叫。
  • WebRTC 通話的接收端。
  • 螢幕錄影畫面。
  • Web Audio,只要實作這個問題

對於 options,您可以指定 MIME 類型,並在日後指定音訊和影片的比特率

MIME 類型具有或多或少的特定值,結合容器和編解碼器。例如:

  • audio/webm
  • video/webm
  • video/webm;codecs=vp8
  • video/webm;codecs=vp9

使用靜態方法 MediaRecorder.isTypeSupported() 檢查是否支援 MIME 類型,例如在您將 MediaRecorder 例項化時:

var options;
if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {
    options = {mimeType: 'video/webm; codecs=vp9'};
} else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {
    options = {mimeType: 'video/webm; codecs=vp8'};
} else {
    // ...
}

如需 MediaRecorder 在 Chrome 中支援的 MIME 類型完整清單,請參閱這裡

接下來,請新增資料處理常式,並呼叫 start() 方法來開始記錄:

var recordedChunks = [];

var options = {mimeType: 'video/webm;codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start();

function handleDataAvailable(event) {
    if (event.data.size > 0) {
    recordedChunks.push(event.data);
    } else {
    // ...
    }
}

這個範例會將 Blob 新增至 recordedChunks 陣列,只要有資料可用。您可以選擇為 start() 方法提供 timeSlice 引數,用於指定每個 Blob 要擷取的媒體長度。

錄製完成後,請告知 MediaRecorder:

mediaRecorder.stop();

從已記錄的 Blob 陣列建立「super-Blob」,在影片元素中播放錄製的 Blob:

function play() {
    var superBuffer = new Blob(recordedChunks);
    videoElement.src =
    window.URL.createObjectURL(superBuffer);
}

或者,您可以透過 XHR 上傳至伺服器,或是使用 YouTube 等 API (請參閱下方的實驗版示範)。

下載作業可透過一些連結駭客手法完成:

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);
}

針對 API 和示範提供意見

在沒有外掛程式的情況下錄製音訊和影像,是網頁應用程式相對較新的功能,因此我們特別感謝您對 API 的意見回饋。

我們也想瞭解哪些使用情境對您而言最為重要,以及您希望我們優先改善哪些功能。請前往 crbug.com/262211 評論這篇文章或追蹤進度。

示範

應用程式

  • Paul Lewis 的 Voice Memos 應用程式現在支援 MediaRecorder,並為不支援 MediaRecorder 音訊的瀏覽器提供多重填充功能。

填充

  • Muaz Khan 的 MediaStreamRecorder 是用於錄製音訊和影片的 JavaScript 程式庫,與 MediaRecorder 相容。
  • Recorderjs 可透過 Web Audio API 節點錄製音訊。您可以在 Paul Lewis 的「語音備忘錄」應用程式中查看實際操作畫面。

瀏覽器支援

  • 預設為 Chrome 49 以上版本
  • Chrome 電腦版 47 和 48,已透過 chrome://flags 啟用實驗性網頁平台功能
  • Firefox 25 以上版本
  • Edge:'Under Consideration'

規格

w3c.github.io/mediacapture-record/MediaRecorder.html

API 資訊

developer.mozilla.org/en/docs/Web/API/MediaRecorder_API