MediaSourceHandle
注意:此功能在 专用 Web Workers 中可用。
MediaSourceHandle 接口是 Media Source Extensions API 的一部分,它是 MediaSource 的一个代理。它可以从专用工作线程(dedicated worker)传输回主线程,并通过 HTMLMediaElement 的 srcObject 属性附加到媒体元素上。MediaSource 对象因为是事件目标(event targets),所以不可传输,因此需要 MediaSourceHandle。
可以通过 MediaSource.handle 属性访问它。
在专用工作线程中创建的每个 MediaSource 对象都有其自己独立的 MediaSourceHandle。MediaSource.handle getter 始终返回与关联的专用工作线程 MediaSource 实例特定的 MediaSourceHandle 实例。如果该句柄已通过 postMessage() 传输到主线程,则该句柄在工作线程中的实例在技术上已分离,无法再次传输。
MediaSourceHandle 是一个 可传输对象。
实例属性
无。
实例方法
无。
示例
可以在专用工作线程内部访问 handle 属性,然后通过 postMessage() 调用将生成的 MediaSourceHandle 对象传输到创建工作线程的线程(在此例中为主线程)。
// 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 视频。
worker.addEventListener("message", (msg) => {
let mediaSourceHandle = msg.data.arg;
video.srcObject = mediaSourceHandle;
video.play();
});
注意: MediaSourceHandle 无法成功传输到共享工作线程(shared worker)或服务工作线程(service worker)中,或通过它们传输。
规范
| 规范 |
|---|
| Media Source Extensions™ # mediasourcehandle |
浏览器兼容性
加载中…