MediaRecorder: dataavailable 事件

Baseline 已廣泛支援

此特性已得到良好支援,可在多種裝置和瀏覽器版本上使用。自 2021 年 4 月起,所有瀏覽器均已支援此特性。

MediaRecorder 介面的 dataavailable 事件會在 MediaRecorder 將媒體資料傳遞給您的應用程式供其使用時觸發。資料以一個包含資料的 Blob 物件的形式提供。這發生在四種情況下:

  • 當媒體流結束時,任何尚未傳遞給您的 ondataavailable 處理程式的媒體資料都會以單個 Blob 的形式傳遞。
  • 當呼叫 MediaRecorder.stop() 時,自錄製開始或上一次 dataavailable 事件發生以來捕獲的所有媒體資料都將以 Blob 的形式傳遞;之後,捕獲將結束。
  • 當呼叫 MediaRecorder.requestData() 時,自錄製開始或上一次 dataavailable 事件發生以來捕獲的所有媒體資料都將被傳遞;然後建立一個新的 Blob,媒體捕獲將繼續寫入該 Blob。
  • 如果傳遞給啟動媒體捕獲的 MediaRecorder.start() 方法一個 timeslice 屬性,則每 timeslice 毫秒會觸發一個 dataavailable 事件。這意味著通常情況下,每個 Blob 都會有一個特定的時間長度(最後一個 Blob 可能較短,因為它會包含自上一個事件以來剩餘的所有資料)。所以,如果方法呼叫如下 — recorder.start(1000); — 那麼在每錄製一秒後,dataavailable 事件都會觸發,並且我們的事件處理程式將每秒被呼叫一次,傳入一個時長為一秒的媒體資料 Blob。您可以將 timesliceMediaRecorder.stop()MediaRecorder.requestData() 一起使用,以生成多個相同長度的 Blob 以及其他較短的 Blob。

注意: 與 Web API 中的其他時間值一樣,timeslice 並不精確,實際間隔可能會因其他待處理任務、瀏覽器功能(Safari 中暫停相機和麥克風)、瀏覽器特定行為(Chrome 在 Android 上錄製時鎖定螢幕會暫停 dataavailable 事件)或其他瀏覽器錯誤而延遲。這些情況也可能導致資料塊顯著增大。

因此,不要依賴 timeslice 和接收到的塊數來計算經過的時間,因為錯誤可能會累積。相反,請使用 Event.timeStamp 或類似方法維護一個單獨的計時器,記錄自開始以來的總經過時間。

包含媒體資料的 Blob 可在 dataavailable 事件的 data 屬性中找到。

語法

在諸如 addEventListener() 之類的方法中使用事件名稱,或設定事件處理程式屬性。

js
addEventListener("dataavailable", (event) => { })

ondataavailable = (event) => { }

事件型別

一個 BlobEvent。繼承自 Event

Event BlobEvent

示例

js
const chunks = [];

mediaRecorder.onstop = (e) => {
  console.log("data available after MediaRecorder.stop() called.");

  const audio = document.createElement("audio");
  audio.controls = true;
  const blob = new Blob(chunks, { type: mediaRecorder.mimeType });
  const audioURL = window.URL.createObjectURL(blob);
  audio.src = audioURL;
  console.log("recorder stopped");
};

mediaRecorder.ondataavailable = (e) => {
  chunks.push(e.data);
};

規範

規範
MediaStream Recording
# dom-mediarecorder-ondataavailable

瀏覽器相容性

另見