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

浏览器兼容性

另见