MediaSource: sourceended 事件

可用性有限

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

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

MediaSource 对象的 readyState 变为 "ended" 时,会触发 sourceended 事件。这表明应用程序已完成向 MediaSource 发送数据。当应用程序完成将所有媒体数据附加到与 MediaSource 关联的 SourceBuffer 对象后,它会在 MediaSource 上调用 MediaSource.endOfStream() 方法。这将导致 readyState 转换为 "ended" 并触发 sourceended 事件。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("sourceended", (event) => {})

onsourceended = (event) => {}

事件类型

一个通用的 Event

示例

处理 sourceopen 事件

此示例演示了如何设置视频元素以进行播放,以及如何处理 sourceended 事件以进行适当的资源管理。代码设置一个 MediaSource,通过获取和缓冲视频数据来启动播放,然后使用 sourceended 事件执行清理任务,例如移除事件监听器并在播放完成后通知用户。

js
const video = document.getElementById("myVideo");
const mediaSource = new MediaSource();

video.src = URL.createObjectURL(mediaSource);

mediaSource.addEventListener("sourceopen", (event) => {
  const sourceBuffer = mediaSource.addSourceBuffer(
    'video/mp4; codecs="avc1.42E01E"',
  );

  fetch("video-data.mp4")
    .then((response) => response.arrayBuffer())
    .then((data) => {
      sourceBuffer.appendBuffer(data);
      sourceBuffer.addEventListener("updateend", () => {
        mediaSource.endOfStream();
      });
    });
});

mediaSource.addEventListener("sourceended", (event) => {
  console.log("MediaSource sourceended:", event);
  URL.revokeObjectURL(video.src);
  // Perform cleanup

  // Remove event listeners from SourceBuffer and MediaSource
  sourceBuffer.removeEventListener("updateend", () => {});
  mediaSource.removeEventListener("sourceopen", () => {});

  // Notify user (e.g., display a "Playback finished" message)
  const messageElement = document.createElement("p");
  messageElement.textContent = "Playback finished.";
  document.body.appendChild(messageElement);
});

规范

规范
Media Source Extensions™
# dfn-sourceended

浏览器兼容性

另见

MediaSource.endOfStream()