HTMLMediaElement: srcObject 屬性

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

HTMLMediaElement 介面的 srcObject 屬性用於設定或返回與 HTMLMediaElement 關聯的媒體源物件,如果未賦值則為 null

該物件可以是 MediaStreamMediaSourceBlobFile(繼承自 Blob)。

注意:截至 2020 年 3 月,只有 Safari 完全支援 srcObject,即支援使用 MediaSourceMediaStreamBlobFile 物件作為值。其他瀏覽器支援 MediaStream 物件;在它們趕上之前,請考慮回退到使用 URL.createObjectURL() 建立 URL 並將其分配給 HTMLMediaElement.src(示例如下)。此外,截至 Chromium 108 版本,可以透過將專用工作執行緒 MediaSource 物件的 MediaSourceHandle 例項(從工作執行緒傳輸過來)分配給 srcObject 來附加一個專用的工作執行緒 MediaSource 物件。

一個 MediaStreamMediaSourceBlobFile 物件(但請檢視相容性表格瞭解實際支援的情況),或者在未賦值時為 null

用法說明

媒體源規範的舊版本要求使用 URL.createObjectURL() 來建立一個物件 URL,然後將 src 設定為該 URL。現在您只需將 srcObject 直接設定為 MediaStream

示例

基本示例

在此示例中,來自攝像頭的 MediaStream 被分配給新建立的 <video> 元素。

js
const mediaStream = await navigator.mediaDevices.getUserMedia({ video: true });
const video = document.createElement("video");
video.srcObject = mediaStream;

在此示例中,新的 MediaSource 被分配給新建立的 <video> 元素。

js
const mediaSource = new MediaSource();
const video = document.createElement("video");
video.srcObject = mediaSource;

支援回退到 src 屬性

下面的示例支援舊版本瀏覽器,這些瀏覽器要求您在 srcObject 不受支援時建立一個物件 URL 並將其分配給 src

首先,來自攝像頭的 MediaStream 被分配給新建立的 <video> 元素,併為舊版瀏覽器提供回退支援。

js
const mediaStream = await navigator.mediaDevices.getUserMedia({ video: true });
const video = document.createElement("video");
if ("srcObject" in video) {
  video.srcObject = mediaStream;
} else {
  // Avoid using this in new browsers, as it is going away.
  video.src = URL.createObjectURL(mediaStream);
}

其次,新的 MediaSource 被分配給新建立的 <video> 元素,併為舊版瀏覽器以及尚不支援直接分配 MediaSource 的瀏覽器提供回退支援。

js
const mediaSource = new MediaSource();
const video = document.createElement("video");
// Older browsers may not have srcObject
if ("srcObject" in video) {
  try {
    video.srcObject = mediaSource;
  } catch (err) {
    if (err.name !== "TypeError") {
      throw err;
    }
    // Even if they do, they may only support MediaStream
    video.src = URL.createObjectURL(mediaSource);
  }
} else {
  video.src = URL.createObjectURL(mediaSource);
}

在工作執行緒中構建 MediaSource 並將其傳遞到主執行緒播放

MediaSource.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 無法成功傳輸到共享工作執行緒或服務工作執行緒中,或透過它們進行傳輸。

規範

規範
HTML
# dom-media-srcobject-dev
Media Source Extensions™
# htmlmediaelement-extensions-srcobject

瀏覽器相容性