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(): 从摄像头和/或麦克风捕获媒体