MediaSource: addSourceBuffer() 方法

可用性有限

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

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

addSourceBuffer() 方法用于 MediaSource 接口,它根据指定的 MIME 类型创建一个新的 SourceBuffer,并将其添加到 MediaSourcesourceBuffers 列表中。新创建的 SourceBuffer 对象也会被返回。

语法

js
addSourceBuffer(mimeType)

参数

mimeType

一个字符串,指定要创建并添加到 MediaSourceSourceBuffer 的 MIME 类型。

返回值

一个 SourceBuffer 对象,代表已创建并添加到媒体源的新源缓冲区。

异常

InvalidAccessError DOMException

如果为 mimeType 指定的值为空字符串而不是有效的 MIME 类型,则抛出此异常。

InvalidStateError DOMException

如果 MediaSourcereadyState 不是 "open",则抛出此异常。

NotSupportedError DOMException

如果 用户代理不支持指定的 mimeType,或者它与媒体源 sourceBuffers 列表中已包含的其他 SourceBuffer 对象的 MIME 类型不兼容,则抛出此异常。

QuotaExceededError

如果用户代理无法处理更多 SourceBuffer 对象,或者使用给定的 mimeType 创建新的 SourceBuffer 会导致 不支持的 SourceBuffer 配置,则抛出此异常。

示例

以下代码段来自 Nick Desaulniers 编写的示例(在线查看完整演示,或下载源代码以供进一步研究)。函数 getMediaSource()(此处未定义)返回一个 MediaSource

js
const assetURL = "frag_bunny.mp4";
// Need to be specific for Blink regarding codecs
// ./mp4info frag_bunny.mp4 | grep Codec
const mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
const mediaSource = getMediaSource();

if ("MediaSource" in window && MediaSource.isTypeSupported(mimeCodec)) {
  console.log(mediaSource.readyState); // closed
  mediaSource.addEventListener("sourceopen", sourceOpen);
  video.src = URL.createObjectURL(mediaSource);
} else {
  console.error("Unsupported MIME type or codec: ", mimeCodec);
}

function sourceOpen() {
  console.log(this.readyState); // open
  const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
  fetchAB(assetURL, (buf) => {
    sourceBuffer.addEventListener("updateend", () => {
      mediaSource.endOfStream();
      video.play();
      console.log(mediaSource.readyState); // ended
    });
    sourceBuffer.appendBuffer(buf);
  });
}

规范

规范
Media Source Extensions™
# dom-mediasource-addsourcebuffer

浏览器兼容性

另见