MediaDevices: getDisplayMedia() 方法
MediaDevices 介面的 getDisplayMedia() 方法會提示使用者選擇一個顯示器或顯示器的一部分(例如一個視窗)並授予許可權,將其捕獲為一個 MediaStream。
生成的流隨後可以使用 MediaStream 錄製 API 進行錄製,或者作為 WebRTC 會話的一部分進行傳輸。
有關更多詳細資訊和示例,請參閱 使用螢幕捕獲 API。
語法
getDisplayMedia()
getDisplayMedia(options)
引數
options可選-
一個指定返回的
MediaStream要求的物件。getDisplayMedia()的選項與MediaDevices.getUserMedia()方法的 約束 的工作方式相同,儘管在這種情況下只能指定audio和video。getDisplayMedia()可能的選項屬性列表如下:video可選-
一個布林值或
MediaTrackConstraints例項;預設值為true。如果省略此選項或將其設定為true,則返回的MediaStream將包含一個影片軌道。由於getDisplayMedia()需要影片軌道,如果此選項設定為false,則 Promise 將以TypeError拒絕。 audio可選-
一個布林值或
MediaTrackConstraints例項;預設值為false。值為true表示返回的MediaStream將包含一個音訊軌道,前提是音訊受支援並且可用於使用者選擇的顯示錶面。 controller實驗性 可選-
一個
CaptureController物件例項,其中包含可用於進一步操作捕獲會話的方法(如果包含)。 monitorTypeSurfaces實驗性 可選-
一個列舉值,指定瀏覽器是否應在呈現給使用者的螢幕捕獲選項中,除了標籤頁和視窗選項之外,還提供整個螢幕的選項。此選項旨在防止使用者因錯誤操作而在使用視訊會議應用時洩露私人資訊。可能的值為:
include: 提示瀏覽器應包含螢幕選項。exclude: 提示應排除螢幕選項。
注意: 您不能同時設定
monitorTypeSurfaces: "exclude"和displaySurface: "monitor",因為這兩個設定是矛盾的。嘗試這樣做會導致getDisplayMedia()呼叫以TypeError失敗。 preferCurrentTab非標準 實驗性 可選-
一個布林值;值為
true會指示瀏覽器將當前標籤頁作為最突出的捕獲源提供,即作為使用者在“選擇要共享的內容”選項中“此標籤頁”的單獨選項。這很有用,因為許多應用型別通常只需要共享當前標籤頁。例如,一個幻燈片應用可能希望允許使用者將包含簡報的當前標籤頁流式傳輸到虛擬會議。 selfBrowserSurface實驗性 可選-
一個列舉值,指定瀏覽器是否應允許使用者選擇當前標籤頁進行捕獲。這有助於避免視訊會議應用無意中共享自身顯示時出現的“無限鏡廳”效應。可能的值為:
include: 提示瀏覽器應在提供的捕獲選項中包含當前標籤頁。exclude: 提示應從選項中排除當前標籤頁。
surfaceSwitching實驗性 可選-
一個列舉值,指定瀏覽器是否應顯示一個控制元件,允許使用者在螢幕共享期間動態切換共享的標籤頁。這比使用者每次想要切換共享標籤頁時都必須重新經歷整個共享過程要方便得多。可能的值為:
include: 提示瀏覽器應包含該控制元件。exclude: 提示不應顯示該控制元件。
systemAudio實驗性 可選-
一個列舉值,指定瀏覽器是否應在提供給使用者的可能音訊源中包含系統音訊。可能的值為:
include: 提示瀏覽器應在選項列表中包含系統音訊。exclude: 提示應從顯示的選項中排除系統音訊。
windowAudio實驗性 可選-
一個列舉值,提示瀏覽器在提供視窗共享選項時,應向用戶呈現哪種音訊共享選項。可能的值為:
exclude: 提示當選擇視窗共享選項時,音訊不應可共享。window: 提示當選擇視窗共享選項時,只應共享來自該視窗的音訊。system: 提示當選擇視窗共享選項時,應共享所有系統音訊。
注意: 對於這些選項中的大多數,規範並未強制規定預設值。對於未提及預設值的獨立選項,請參閱 瀏覽器相容性 部分以獲取特定於瀏覽器的預設值。
注意: 有關這些選項如何工作的更多詳細資訊,請參閱文章 能力、約束和設定。
返回值
一個 Promise,它解析為一個 MediaStream,該流包含一個影片軌道(其內容來自使用者選擇的螢幕區域)以及一個可選的音訊軌道。
注意: 瀏覽器對音訊軌道的支援各不相同,包括媒體錄製器是否支援它們,以及支援的音訊源。有關每個瀏覽器的詳細資訊,請檢視 相容性表格。
異常
AbortErrorDOMException-
如果在其他列出的異常之外發生錯誤或失敗,則丟擲此異常。
InvalidStateErrorDOMException-
如果
getDisplayMedia()的呼叫不是由由於 瞬時啟用(如事件處理程式)而執行的程式碼引起的。或者瀏覽器上下文未完全啟用或未獲得焦點。或者controller選項已用於建立另一個MediaStream。則丟擲此異常。 NotAllowedErrorDOMException-
如果使用者拒絕訪問螢幕區域的許可權,或者當前瀏覽例項不允許訪問螢幕共享(例如,透過 許可權策略),則丟擲此異常。
NotFoundErrorDOMException-
如果沒有可供捕獲的螢幕影片源,則丟擲此異常。
NotReadableErrorDOMException-
如果使用者選擇了螢幕、視窗、標籤頁或其他螢幕資料來源,但發生了硬體或作業系統級別的錯誤或鎖定,導致無法共享選定的源,則丟擲此異常。
OverconstrainedErrorDOMException-
如果建立流後,應用任何指定的約束均因無法生成相容的流而失敗,則丟擲此異常。
TypeError-
如果指定的
options包含在呼叫getDisplayMedia()時不允許的值(例如,video屬性設定為 false),或者任何指定的MediaTrackConstraints不允許,則丟擲此異常。在getDisplayMedia()呼叫中使用的約束不允許min和exact值。
安全
由於 getDisplayMedia() 可能被用於不良用途,因此它可能帶來重大的隱私和安全隱患。為此,規範詳細說明了瀏覽器必須採取的措施才能完全支援 getDisplayMedia()。
- 指定的選項不能用於限制使用者可用的選擇。相反,它們必須在使用者選擇源後應用,才能生成與選項匹配的輸出。
- 使用
getDisplayMedia()的許可不能持久化以供重用。每次都必須提示使用者授予許可權。 - 需要瞬時使用者啟用。使用者必須與頁面或 UI 元素進行互動才能使此功能正常工作。
- 鼓勵瀏覽器向用戶發出關於共享包含瀏覽器的顯示器或視窗的警告,並密切關注可能被捕獲並展示給其他使用者的內容。
示例
下面的示例建立了一個 startCapture() 方法,該方法根據 displayMediaOptions 引數指定的選項集啟動螢幕捕獲。
const displayMediaOptions = {
video: {
displaySurface: "browser",
},
audio: {
suppressLocalAudioPlayback: false,
},
preferCurrentTab: false,
selfBrowserSurface: "exclude",
systemAudio: "include",
surfaceSwitching: "include",
monitorTypeSurfaces: "include",
};
async function startCapture(displayMediaOptions) {
let captureStream;
try {
captureStream =
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
} catch (err) {
console.error(`Error: ${err}`);
}
return captureStream;
}
這使用了 await 來非同步等待 getDisplayMedia() 解析為 MediaStream,該流包含根據指定選項請求的顯示內容。然後將該流返回給呼叫者使用,或許可以使用 RTCPeerConnection.addTrack() 將流中的影片軌道新增到 WebRTC 呼叫中。
注意: 螢幕共享控制元件演示提供了一個完整的實現,允許您使用您選擇的 getDisplayMedia() 約束和選項來建立螢幕捕獲。
規範
| 規範 |
|---|
| 螢幕捕獲 # dom-mediadevices-getdisplaymedia |
瀏覽器相容性
載入中…
另見
- Screen Capture API
- 使用螢幕捕獲 API
- 媒體捕獲和流 API
- WebRTC API
getUserMedia(): 從攝像頭和/或麥克風捕獲媒體