MediaSourceHandle

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

MediaSourceHandleMedia Source Extensions API 的一个接口,它是 MediaSource 的代理,可以从专用工作线程传输回主线程,并通过其 HTMLMediaElement.srcObject 属性附加到媒体元素。MediaSource 对象不可传输,因为它们是事件目标,因此需要 MediaSourceHandle

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

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

实例属性

无。

实例方法

无。

示例

可以在专用工作线程中访问 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 事件处理程序接收句柄,将其附加到 <video>,通过其 HTMLMediaElement.srcObject 属性,并 play 视频。

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

注意:MediaSourceHandle 无法成功传输到共享工作线程或服务工作线程中,或通过共享工作线程或服务工作线程传输。

规范

规范
Media Source Extensions™
# mediasourcehandle

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。

另请参阅