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

瀏覽器相容性

另見