SourceBuffer: appendBuffer() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

注意:此功能在 专用 Web Workers 中可用。

SourceBuffer 接口的 appendBuffer() 方法会从 ArrayBufferTypedArrayDataView 对象中追加媒体片段数据到 SourceBuffer

语法

js
appendBuffer(source)

参数

source

包含您想添加到 SourceBuffer 中的媒体片段数据的 ArrayBufferTypedArrayDataView 对象。

返回值

无(undefined)。

异常

InvalidStateError DOMException

在以下情况之一中抛出

  • SourceBuffer 对象的 updating 属性为 true。您必须等待任何之前的追加、更新或删除操作完成(由 updateend 事件指示)后,才能再次调用 appendBuffer()
  • SourceBuffer 已从父媒体源的 sourceBuffers 属性中移除。
  • HTMLMediaElementerror 属性不为 null
QuotaExceededError

缓冲区已满,无法再追加数据。这可能发生在 SourceBuffer 达到浏览器定义的已缓冲数据量限制时。

此外,在 updatestart 事件触发且 appendBuffer() 方法返回后,也可能发生错误:例如,因为缓冲区包含格式不正确的字节。在这种情况下,error 事件将在此 SourceBuffer 实例上触发。

示例

基本用法

此示例演示了如何将视频数据添加到 video 元素中进行播放。MediaSource 提供视频数据,SourceBuffer 添加这些数据。该示例会获取视频片段数据,将其追加到 SourceBuffer,并在完成后结束流。

js
const mediaSource = new MediaSource();
const video = document.querySelector("video");
video.src = URL.createObjectURL(mediaSource);

mediaSource.addEventListener("sourceopen", async () => {
  const sourceBuffer = mediaSource.addSourceBuffer(
    'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
  );

  const buffer = await fetch("/my-video-segment.mp4").then((res) =>
    res.arrayBuffer(),
  );
  sourceBuffer.appendBuffer(buffer);
  sourceBuffer.addEventListener("updateend", () => {
    if (mediaSource.readyState === "open") {
      mediaSource.endOfStream();
    }
  });
});

处理错误

此示例演示了如何处理调用 appendBuffer() 时可能发生的错误。

它在 try...catch 块中调用 appendBuffer(),以捕获和处理该方法同步抛出的异常。它还监听 error 事件,以处理在 appendBuffer() 返回后、缓冲区异步更新时发生的错误。

js
sourceBuffer.addEventListener("error", (e) => {
  console.error("Error appending buffer:", e);
  // Handle the error appropriately, e.g., show a message to the user,
  // try a different source, or stop playback.
});

try {
  sourceBuffer.appendBuffer(data);
} catch (e) {
  if (e.name === "InvalidStateError") {
    console.error(
      "InvalidStateError: The SourceBuffer is in an invalid state.",
    );
  } else if (e.name === "QuotaExceededError") {
    console.error("QuotaExceededError: The buffer is full.");
  } else {
    console.error("An unexpected error occurred:", e);
  }
}

规范

规范
Media Source Extensions™
# dom-sourcebuffer-appendbuffer

浏览器兼容性

另见