MediaSourceHandle

可用性有限

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

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

MediaSourceHandle 接口是 Media Source Extensions API 的一部分,它是 MediaSource 的一个代理。它可以从专用工作线程(dedicated worker)传输回主线程,并通过 HTMLMediaElementsrcObject 属性附加到媒体元素上。MediaSource 对象因为是事件目标(event targets),所以不可传输,因此需要 MediaSourceHandle

可以通过 MediaSource.handle 属性访问它。

在专用工作线程中创建的每个 MediaSource 对象都有其自己独立的 MediaSourceHandleMediaSource.handle getter 始终返回与关联的专用工作线程 MediaSource 实例特定的 MediaSourceHandle 实例。如果该句柄已通过 postMessage() 传输到主线程,则该句柄在工作线程中的实例在技术上已分离,无法再次传输。

MediaSourceHandle 是一个 可传输对象

实例属性

无。

实例方法

无。

示例

可以在专用工作线程内部访问 handle 属性,然后通过 postMessage() 调用将生成的 MediaSourceHandle 对象传输到创建工作线程的线程(在此例中为主线程)。

js
// Inside dedicated worker
let mediaSource = new MediaSource();
let handle = mediaSource.handle;
// Transfer the handle to the context that created the worker
postMessage({ arg: handle }, [handle]);

mediaSource.addEventListener("sourceopen", () => {
  // Await sourceopen on MediaSource before creating SourceBuffers
  // and populating them with fetched media — MediaSource won't
  // accept creation of SourceBuffers until it is attached to the
  // HTMLMediaElement and its readyState is "open"
});

在主线程中,我们通过 message 事件处理器接收句柄,通过其 HTMLMediaElement.srcObject 属性将其附加到 <video> 元素,然后 play 视频。

js
worker.addEventListener("message", (msg) => {
  let mediaSourceHandle = msg.data.arg;
  video.srcObject = mediaSourceHandle;
  video.play();
});

注意: MediaSourceHandle 无法成功传输到共享工作线程(shared worker)或服务工作线程(service worker)中,或通过它们传输。

规范

规范
Media Source Extensions™
# mediasourcehandle

浏览器兼容性

另见