Copyright © 2015-2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本文档定义了如何使用 getDisplayMedia
扩展 Media Capture API
[GETUSERMEDIA],将用户的显示器或其部分作为媒体流的来源。
本节描述了本文档发布时的状态。当前的 W3C 出版物列表以及本技术报告的最新修订版可以在 W3C 标准和草案索引(位于 https://www.w3.org/TR/)中找到。
本文件尚未完成,内容可能会有重大变化。尽管鼓励进行早期实验,但因此不建议用于实际实现。
本文档由 Web实时通信工作组 作为工作草案发布,遵循 推荐标准路线。
作为工作草案发布并不意味着得到了 W3C 及其成员的认可。
这是一份草案文件,随时可能被其他文件更新、替换或废弃。将本文档作为正在进行的工作以外的任何形式引用都是不合适的。
本文档由一个依据 W3C 专利政策 运作的小组编写。W3C 维护了一份专利披露的公开列表,与该小组的成果相关;该页面还包括有关披露专利的说明。任何知晓含有 必要权利要求 专利的个人,必须依据 W3C专利政策第6节 披露相关信息。
本文档受 2023年11月03日 W3C 流程文件 约束。
本节为非规范性内容。
本文档描述了对媒体捕获API [GETUSERMEDIA] 的扩展,该扩展允许获取用户的显示屏或其部分,以视频轨道的形式呈现。在某些情况下,系统、应用程序或窗口音频也会被捕获,并以音频轨道的形式呈现。这支持多种应用,包括使用WebRTC进行屏幕共享 [WEBRTC]。
此功能具有重大安全隐患。使用此API访问用户显示信息的应用程序可能会访问来自其他来源的机密信息,如果这些信息受应用程序控制。这包括用户代理沙盒提供保护的内容。
本文档主要关注视频和音频的捕获 [GETUSERMEDIA],但此处定义的一般机制可以扩展到其他类型的媒体,目前深度 [MEDIACAPTURE-DEPTH] 已被定义。
除标记为非规范性的章节外,本规范中的所有作者指南、图表、示例和注释均为非规范性。规范中其他内容均为规范性。
本文档中的关键词 可以、必须、不得 和 应该 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,当且仅当它们以全大写形式出现时,如此处所示。
本规范定义的合规性标准适用于单一产品:实现其所含接口的用户代理。
使用 ECMAScript [ECMA-262] 实现本规范定义的 API 的实现,必须以与 Web IDL 规范中定义的 ECMAScript 绑定一致的方式实现 [WEBIDL],因为本规范使用了该规范和术语。
以下示例演示了使用本文档定义的 navigator.mediaDevices.getDisplayMedia
方法请求显示捕获。
try {
let mediaStream = await navigator.mediaDevices.getDisplayMedia({video:true});
videoElement.srcObject = mediaStream;
} catch (e) {
console.log('Unable to acquire screen capture: ' + e);
}
本文档使用了 [GETUSERMEDIA] 中 MediaStream
、
MediaStreamTrack
和 ConstrainablePattern
的定义。
屏幕捕获涵盖了几种不同类型的基于屏幕的表面。统称为 显示表面,本文档定义了以下类型:
MediaStreamTrack
。
本文档区分了每种显示表面的两个变体:
某些操作系统允许不同应用程序的窗口在其他窗口上方完全或部分遮挡,因此 可见显示表面 是 逻辑显示表面 的严格子集。
源像素比 是 显示表面 的 1/96 英寸除以其垂直像素大小。
devicechange 事件在 [GETUSERMEDIA] 中定义。
通过在 MediaDevices
接口上添加一个新的
getDisplayMedia
方法来启用显示媒体的捕获,该方法类似于 getUserMedia
()
,不同之处在于它每次都会从最终用户选择的一个显示设备获取媒体。
WebIDLpartial interface MediaDevices
{
Promise<MediaStream> getDisplayMedia
(optional DisplayMediaStreamOptions
options = {});
};
getDisplayMedia
提示用户许可以实时捕获其显示屏。
用户代理必须让最终用户每次从所有可用选项中选择要共享的显示界面,并且不得使用
options.video
或 options.audio
中的任何 MediaTrackConstraints
来限制该选择。
用户代理可以使用 displaySurface
限制的存在及其值来影响向用户展示的源选择。
但用户代理必须仍然为用户提供无限制的显示表面选择。强烈建议用户代理引导用户避免共享整个显示器,
因为这会对用户隐私构成 风险。
options.video
或 options.audio
中的任何 MediaTrackConstraints
必须仅在用户做出选择后应用于用户选择的媒体。
对于音频,用户代理可以向最终用户呈现可供共享的音频源。具体有哪些选项可供选择由用户代理决定,并且音频源不一定与视频源相同。音频源可以是特定的窗口、浏览器、整个系统音频或其任意组合。与 getUserMedia
()
在音频+视频方面不同,即使用户指定了音频约束,用户代理也允许不返回音频。如果用户代理知道在流的生命周期内不会共享任何音频,则它不得在结果流中包含音轨。用户代理可以接受音频和视频请求,并在结果流中仅返回视频轨道,或者它可以接受请求,并在结果流中同时返回音轨和视频轨道。用户代理必须拒绝纯音频请求。
除了从不同的源集合中提取并需要用户选择之外,getDisplayMedia
与 getUserMedia
()
的不同之处还在于“granted
”权限不能被持久化。
当调用 getDisplayMedia
()
方法时,用户代理必须运行以下步骤:
令 mediaDevices 为this。
令 controller 为 options.controller
(如果存在),否则为
null
。
如果 controller 不为 null
,则运行以下步骤:
如果 controller.[[IsBound]]
为
true
,则返回一个 rejected 的 promise,其值为一个
DOMException
对象,该对象的 name
属性值为 InvalidStateError
。
将 controller.[[IsBound]]
设置为
true
。
如果this的相关全局对象没有瞬时激活,则返回一个
rejected 的
promise,其值为一个 DOMException
对象,该对象的 name
属性值为 InvalidStateError
。
令 options 为该方法的第一个参数。
令 constraints 为 [
options.audio
,
options.video
]
。
如果 constraints.video
为 false
,则返回一个 rejected 的
promise,其值为一个新创建的 TypeError
。
对于 constraints 中每个值为字典 CS 的现有成员,运行以下步骤:
如果 CS 包含名为 advanced
的成员,则返回一个 rejected
的 promise,其值为一个新创建的 TypeError
。
如果 CS 包含一个成员,其名称指定了适用于显示界面的可约束属性,并且其值又是一个包含名为
min
或 exact
的成员的字典,则返回一个 rejected
的 promise,其值为一个新创建的 TypeError
。
如果 CS 包含一个成员,其名称指定了适用于显示界面的可约束属性,并且其值又是一个包含名为
max
的成员的字典,并且该成员的值又小于该可约束属性的下限值,则令 failedConstraint
为该成员的名称,令 message 为 undefined
或一个信息性的人类可读消息,并返回一个 rejected 的 promise,其值为通过调用
OverconstrainedError(failedConstraint, message)
创建的新 OverconstrainedError
。
令 requestedMediaTypes 为 constraints 中值为字典或 true
的媒体类型集合。
如果当前设置对象的相关全局对象的关联
Document
不是完全激活的或没有获得焦点,则返回一个 rejected 的 promise,其值为一个 DOMException
对象,该对象的 name
属性值为 InvalidStateError
。
令 p 为一个新的 promise。
并行运行以下步骤:
对于 requestedMediaTypes 中的每种媒体类型 T,
如果没有类型为 T 的可用源,则在用户交互任务源上排队一个任务以
reject
p,其值为一个新的 DOMException
对象,该对象的 name
属性值为 NotFoundError
,并中止这些步骤。
读取当前浏览上下文中获取类型为 T 的源的当前权限状态。如果权限状态为“denied
”,则跳转到下面标记为权限失败的步骤。
可选地,例如,基于先前建立的用户偏好、出于安全原因或由于平台限制,跳转到下面标记为权限失败的步骤。
提示用户选择一个显示设备,其
PermissionDescriptor
的 name
设置为 "display-capture",从而产生一组提供的媒体。
提供的媒体必须精确包含一个视频轨道。
提供的媒体必须最多包含一个音轨。如果在 requestedMediaTypes
中未指定音频,或者指定为 false
,则不得包含此音轨。
选择的设备必须是用户确定的设备。一旦选定,MediaStreamTrack
的源不得更改,除非用户通过与用户代理的交互允许更改。
鼓励用户代理警告用户不要共享浏览器显示设备以及可见浏览器窗口的显示器显示设备,或者以这些设备共享时风险显著更高为由,尽量阻止用户选择它们。
如果请求的结果是“granted
”,则对于提供媒体的每个设备,使用该设备的稳定且私有的
id deviceId,将 [[devicesLiveMap]][deviceId] 设置为
true
(如果尚未为 true
),并将
[[devicesAccessibleMap]][deviceId] 设置为 true
(如果尚未为
true
)。
用户代理不得存储“granted
”权限条目。
如果结果是“denied
”,则跳转到下面标记为权限失败的步骤。如果用户从未响应,则此算法在此步骤暂停。
如果用户授予权限但硬件错误(例如操作系统/程序/网页锁定)阻止访问,则在用户交互任务源上排队一个任务以
reject
p,其值为一个新的 DOMException
对象,该对象的 name
属性值为 NotReadableError
,并中止这些步骤。
如果结果是“granted
”但设备访问因上述未列出的任何其他原因失败,则在用户交互任务源上排队一个任务以
reject
p,其值为一个新的 DOMException
对象,该对象的 name
属性值为 AbortError
,并中止这些步骤。
令 stream 为一个 MediaStream
对象。
对于用户授予权限的每个 source,运行以下步骤:
令 track 为使用 source 和 mediaDevices 创建 MediaStreamTrack 的结果。
将 track 添加到 stream 的轨道集中。
使用 source 和 mediaDevices 将轨道源绑定到 MediaDevices。
使用适当的约束对 stream 中的所有轨道运行应用约束算法。如果此操作失败,则令
failedConstraint 为失败算法的结果,令 message 为
undefined
或一个信息性的人类可读消息,然后在用户交互任务源上排队一个任务以
reject
p,其值为通过调用
OverconstrainedError(failedConstraint, message)
创建的新 OverconstrainedError
,并中止这些步骤。
现在认为 getDisplayMedia
()
的这次调用产生了一个新的捕获会话。
如果 controller 不为 null
,则运行以下步骤:
将 controller.[[Source]]
设置为
stream 的视频轨道的 [[Source]]。
将 controller.[[DisplaySurfaceType]]
设置为 stream 的视频轨道的 DisplayCaptureSurfaceType
。
用 stream resolve p。
如果 controller 不为 null
,则在用户交互任务源上排队一个任务以在
controller 上运行最终确定焦点决策算法。
中止这些步骤。
权限失败:在用户交互任务源上排队一个任务以
reject
p,其值为一个新的 DOMException
对象,该对象的 name
属性值为 NotAllowedError
。
返回 p。
当顶层文档失去焦点时,对该文档及其嵌套浏览上下文的文档中的所有
CaptureController
对象运行以下步骤:
如果
[[Source]]
是 undefined
,则中止这些步骤。
将 [[FocusChangeDisabled]]
设置为
true
。
用户代理 不得 捕获部分透明的已捕获 显示表面 背后的内容。
对于新创建的 MediaStreamTrack
,用户代理不得捕获显示给用户的提示。
未当前显示在屏幕上的信息 应当 在捕获中被模糊处理,除非应用程序已被特别授权访问该内容(例如,通过 提升的权限 等方式)。
用户代理 不得 在没有 用户主动同意 的情况下共享音频,例如当捕获一个 窗口 的视频伴随捕获整个系统的音频,包括与该窗口无关的应用程序时。
共享的显示表面可能会因操作系统或用户代理采取的操作而暂时或永久变得无法访问。显示表面被视为不可访问的具体情况不在本规范范围内,但示例可能包括监视器断开连接、窗口或浏览器关闭或最小化,或由于电话上的来电导致。
用户代理最终决定在此上下文中不可访问的含义,但鼓励仅为有外部原因的中断触发静音和取消静音事件。
当显示界面进入不一定永久的不可访问状态时,用户代理必须在用户交互任务源上排队一个任务,该任务将相应媒体轨道的静音状态设置为 true
。
当显示界面退出不可访问状态并变为可访问时,用户代理必须在用户交互任务源上排队一个任务,该任务将相应媒体轨道的静音状态设置为
false
。
当显示界面进入永久的不可访问状态(例如源窗口关闭)时,用户代理必须在用户交互任务源上排队一个任务,该任务将结束相应的媒体轨道。
刚刚由getDisplayMedia
返回的流可能包含默认静音的轨道。属于同一流的音频和视频轨道可以独立静音或取消静音。
不接受源选择的约束意味着getDisplayMedia
仅提供指纹信息,暴露是否存在音频、视频或音视频显示源。
请注意,接受displaySurface
约束不会限制用户选择。
约束在
getDisplayMedia
中的作用与它们在
getUserMedia
()
中的作用不同。
它们不辅助发现,而是在用户选择之后才应用。
本节定义了哪些约束适用于
getDisplayMedia
轨道;
为
getUserMedia
()
定义的约束除非在此处列出,否则不适用。
其中一些约束启用了用户代理处理,例如缩减采样和帧抽取,以及特定于显示的功能。 其他约束则能够以功能和设置的形式观察用户选择的 显示界面的固有属性。
定义了以下新的和现有的 MediaStreamTrack
可约束属性以应用于用户选择的视频显示界面,其行为如下:
属性名称 | 类型 | 行为 |
---|---|---|
width | unsigned long
|
宽度,以像素为单位。作为一项能力,max 必须反映显示界面的宽度,而 min 必须反映用户代理通过缩减可用的最小的保持纵横比的表示的宽度。 |
height | unsigned long
|
高度,以像素为单位。作为一项能力,max 必须反映显示界面的高度,而 min 必须反映用户代理通过缩减可用的最小的保持纵横比的表示的高度。 |
frameRate | double |
帧率(每秒帧数)。作为一项能力,max 必须反映显示界面的帧率,而 min 必须反映用户代理通过帧抽取可用的最低帧率。 |
aspectRatio | double |
精确的纵横比(宽度像素除以高度像素,表示为四舍五入到小数点后十位的双精度浮点数)或纵横比范围。作为设置,表示
width / height 。作为一项能力,min 和 max 都必须是当前的设置值,这使得此属性从应用程序的角度来看是不可变的。
|
resizeMode | DOMString |
此字符串是 VideoResizeModeEnum
的成员之一。作为设置,"none "
表示 MediaStreamTrack
包含完整渲染显示所需的所有位,如果
源像素比 > 1 ,则意味着
width 和 height 将大于从最终用户角度来看显示外观所暗示的大小,而 "crop-and-scale "
表示 MediaStreamTrack
包含用户代理已缩减但未裁剪的显示界面的保持纵横比的表示。作为一项能力,值 "none "
和 "crop-and-scale "
都必须存在。
|
deviceId | DOMString |
正在捕获的界面的标识符。
作为设置,标识正在捕获的显示界面。标识符必须为每个文档唯一生成。 作为一项能力,设置值必须是存在的唯一值,这使得此属性从应用程序的角度来看是不可变的。 |
displaySurface | DOMString |
此字符串是 作为设置,指示正在捕获的显示界面的类型。 作为一项能力,设置值必须是存在的唯一值,这使得此属性从应用程序的角度来看是不可变的。 作为约束,该值向用户代理表明应用程序对特定显示界面类型的偏好;用户代理可以根据该偏好重新排序提供给用户的选项。此约束在所有其他方面均被忽略,因此不会引起任何副作用(例如导致
|
logicalSurface | boolean |
作为设置,值 true 表示捕获逻辑显示界面,而值 false 表示捕获可见显示界面。作为一项能力,此相同值必须是存在的唯一值,这使得此属性从应用程序的角度来看是不可变的。
|
cursor | DOMString |
此字符串是 CursorCaptureConstraint
的成员之一。作为设置,指示光标是否以及何时包含在捕获的显示界面中。作为一项能力,用户代理必须仅包含其能够为此显示界面支持的 CursorCaptureConstraint
中的值集。
|
screenPixelRatio | double |
作为设置,它是将CSS 像素在页面缩放为 1.0 且使用缩放因子为 1.0 时的大小除以显示界面中像素的垂直大小的结果。它不能用作约束或能力。 |
以下新的和现有的 MediaStreamTrack
可约束属性被定义为应用于用户选择的音频源,其行为如下:
属性名称 | 类型 | 行为 |
---|---|---|
restrictOwnAudio | boolean |
作为设置,此值指示用户代理是否正在对源应用自身音频限制。 作为约束,可以约束此属性,从而使源启用或禁用自身音频限制。 当应用自身音频限制时,用户代理必须尝试从正在捕获的音频中移除由执行 |
suppressLocalAudioPlayback | boolean |
作为设置,此值指示应用程序是否指示用户代理对源应用本地音频播放抑制。 作为约束,此值仅在用户选择捕获浏览器显示界面时才有意义。在这种情况下,值 当应用本地音频播放抑制时,用户代理应该停止向本地扬声器中继音频,但该音频必须仍由任何正在进行的音频捕获捕获会话捕获。此抑制不得对捕获的文档可见。此外,捕获文档只能观察它是否正在应用suppressLocalAudioPlayback;而不是该抑制是否正在产生效果(即无法观察用户是否在用户代理中覆盖此设置)。 当浏览器显示界面受到多个并发捕获时,只要至少有一个活动的音频捕获捕获会话将suppressLocalAudioPlayback约束为
|
当用户选择的显示界面的底层源的固有属性发生更改时(例如,响应最终用户调整捕获窗口的大小),并且这些更改导致一个或多个可约束属性的功能和/或设置过时,用户代理必须在用户交互任务源上排队一个任务以运行以下步骤:
同时更新所有受影响的可约束属性。
如果这导致“过度约束”的情况,那么用户代理必须忽略造成过度约束的约束,只要它们继续过度约束。用户代理不得使音轨静音。
虽然min和exact约束在getDisplayMedia()上会产生TypeError,但本规范不改变track.applyConstraints()方法。因此,它们可能根据值而产生OverconstrainedError或成功,因此可能存在以导致这种“过度约束”的情况。max约束也可能导致这种情况,例如在aspectRatio的情况下。本规范认为这些是无用的边缘情况。
为了 SelectSettings 算法的目的,用户代理 应该将所有保留原始显示界面纵横比(精确到最近的像素)的缩小尺寸的可能组合,以及通过帧抽取可用的帧率,都视作可用的设置字典。
约束的缩小和抽取效果随后由适应度距离算法有效控制。
其目的是让用户代理在指定了理想的 width
、理想的 height
和/或理想的 frameRate
时,产生接近这些理想值的输出,同时始终保持原始显示界面的纵横比。
除非应用的约束另有指示,否则用户代理应该默认按源像素比进行缩小。
用户代理不得裁剪捕获的输出。
用户代理不得放大捕获的输出,或创建额外的帧,除非是为了在聚合的显示界面中保持高分辨率和帧率所必需。
对于本规范中每个正数类型的可约束属性,用户代理必须建立一个底值,表示无论源如何,用户代理支持的最小允许值。此值必须是恒定的,并且必须大于0
。鼓励用户代理支持所有大于底值的值,无论源如何。
底值
的目的是帮助用户代理在用户已经被提示后避免由于getDisplayMedia
()
产生
OverconstrainedError
错误,并避免泄露关于用户系统的信息。
描述当应用程序调用setFocusBehavior
()
时,是否希望用户代理聚焦与该CaptureController
的捕获会话相关联的
显示表面。
WebIDLenum CaptureStartFocusBehavior
{
"focus-capturing-application
",
"focus-captured-surface
",
"no-focus-change
"
};
枚举描述 | |
---|---|
focus-capturing-application
|
应用程序希望自己被聚焦。 |
focus-captured-surface
|
应用程序希望与此显示表面
相关联的CaptureController 的捕获会话被聚焦。
|
no-focus-change
|
应用程序希望用户代理不改变焦点,将焦点保持在用户与用户代理和/或操作系统交互时最后聚焦的表面上。 |
no-focus-change
"的可能性。
CaptureController
对象可能与
捕获会话关联。它用于暴露与
捕获会话本身相关的功能,而不是与
getDisplayMedia
()
或其生成的
流或轨道相关。
任何给定的捕获会话最多与一个
CaptureController
关联。
任何给定的CaptureController
最多与一个
捕获会话关联。
WebIDL[Exposed=Window, SecureContext]
interface CaptureController
: EventTarget {
constructor
();
undefined setFocusBehavior
(CaptureStartFocusBehavior
focusBehavior);
};
CaptureController
尚未定义事件处理程序,因此不需要从 EventTarget
继承。这是为了将来使用事件处理程序属性扩展 CaptureController
的规范的考虑;如果不使用继承,则可以将其删除。
constructor
CaptureController
对象,具有以下内部槽:
内部插槽 | 初始值 | 描述 (非规范性) |
---|---|---|
[[IsBound]] | false
|
应用程序是否已尝试将此与捕获会话关联。 |
[[Source]] | null
|
关联的捕获会话的源。 |
[[DisplaySurfaceType]] | null
|
捕获开始后,此项将设置为捕获的显示界面的类型。 |
[[FocusChangeDisabled]] | false
|
焦点更改是否已被外部事件或用户代理考虑因素禁用。 |
[[FocusDecisionFinalized]] | false
|
当焦点决策最终确定时设置为 true。 |
[[FocusBehavior]] | null
|
应用程序期望的焦点行为。 |
用户代理可以在任何时候根据自身逻辑将
[[FocusChangeDisabled]]
设置为
true
。
setFocusBehavior
执行以下步骤:
令 focusBehavior 为该方法的第一个参数。
如果 this.[[Source]]
为
null
,则将
this.[[FocusBehavior]]
设置为
focusBehavior 并中止这些步骤。
如果 this.[[Source]]
已经
停止,
则抛出一个“InvalidStateError
”
DOMException
。
如果 this.[[DisplaySurfaceType]]
既不是“browser
”
也不是
“window
”,
则抛出一个
“InvalidStateError
”
DOMException
。
如果 this.[[FocusDecisionFinalized]]
为 true
,则抛出一个
“InvalidStateError
”
DOMException
。
将 this.[[FocusBehavior]]
设置为
focusBehavior。
在 this 上运行最终确定焦点决策算法。
并行运行以下步骤:
如果 focusBehavior 是
“focus-capturing-application
”,
则聚焦代表捕获文档的显示界面。
如果 focusBehavior 是
“focus-captured-surface
”,
则聚焦
controller.[[Source]]
引用的显示界面。
描述应用程序提供的不同提示,表明应用程序所在的显示表面是否应该包含在用户提供的选项中。
WebIDLenum SelfCapturePreferenceEnum
{
"include
",
"exclude
"
};
枚举值 | 描述 |
---|---|
include
|
应用程序倾向于将此表面包含在用户提供的选项中。 |
exclude
|
应用程序倾向于将此表面排除在用户提供的选项之外。 |
描述应用程序调用
getDisplayMedia
()
时,是否希望用户代理在提供给用户的音频源选项中包含系统音频。
WebIDLenum SystemAudioPreferenceEnum
{
"include
",
"exclude
"
};
枚举描述 | |
---|---|
include
|
应用程序倾向于为监视器显示界面向用户提供共享系统音频的选项。 |
exclude
|
应用程序倾向于不向用户提供共享系统音频的选项。 |
描述调用
getDisplayMedia
()
的应用程序是否希望用户代理将窗口或系统音频包含在为窗口显示界面提供给用户的音频源中。
WebIDLenum WindowAudioPreferenceEnum
{
"system
",
"window
",
"exclude
"
};
枚举描述 | |
---|---|
system
|
应用程序倾向于为窗口显示界面向用户提供共享系统音频的选项。 |
window
|
应用程序倾向于为窗口显示界面向用户提供共享窗口音频的选项。 |
exclude
|
应用程序倾向于不为窗口显示界面向用户提供共享音频的选项。 |
描述调用
getDisplayMedia
()
的应用程序是否希望用户代理向用户提供在捕获期间动态切换源显示界面的选项。
WebIDLenum SurfaceSwitchingPreferenceEnum
{
"include
",
"exclude
"
};
枚举值描述 | |
---|---|
include
|
应用程序希望在捕获期间为用户提供动态切换源显示表面的选项。 |
exclude
|
应用程序希望在捕获期间不提供动态切换源显示表面的选项。 |
描述应用程序是否希望用户代理为用户提供选择类型为 监视器的 显示表面的选项。
WebIDLenum MonitorTypeSurfacesEnum
{
"include
",
"exclude
"
};
枚举值描述 | |
---|---|
include
|
应用程序希望提供类型为监视器的 显示表面供用户选择。 |
exclude
|
应用程序希望不提供类型为监视器的 显示表面供用户选择。 |
DisplayMediaStreamOptions
字典用于指示用户代理,由
getDisplayMedia
返回的 MediaStream
中可以包含哪些类型的 MediaStreamTrack
。
WebIDLdictionary DisplayMediaStreamOptions
{
(boolean or MediaTrackConstraints) video
= true;
(boolean or MediaTrackConstraints) audio
= false;
CaptureController
controller
;
SelfCapturePreferenceEnum
selfBrowserSurface
;
SystemAudioPreferenceEnum
systemAudio
;
WindowAudioPreferenceEnum
windowAudio
;
SurfaceSwitchingPreferenceEnum
surfaceSwitching
;
MonitorTypeSurfacesEnum
monitorTypeSurfaces
;
};
video
类型为
(boolean 或
MediaTrackConstraints
)
,
默认为
true
如果为 true
,则请求返回的
MediaStream
包含一个视频轨道。如果提供了
Constraints
结构,它将进一步指定应用于用户选择的显示界面的视频轨道渲染所需的处理选项。如果为
false
,则根据 getDisplayMedia
算法,请求将以
TypeError
拒绝。
audio
类型为
(boolean 或
MediaTrackConstraints
)
,
默认为
false
如果为 true
,则表示有兴趣让返回的 MediaStream
包含一个音频轨道(如果支持并且用户选择的显示界面有可用的音频)。
如果提供了 Constraints
结构,它将进一步指定应用于音频轨道的所需处理选项。如果为 false
,则 MediaStream
将不包含音频轨道。
controller
类型为
CaptureController
如果存在,此 CaptureController
对象将与捕获会话关联。
通过此对象上公开的方法,可以操作捕获会话。
selfBrowserSurface
类型为
SelfCapturePreferenceEnum
systemAudio
类型为
SystemAudioPreferenceEnum
windowAudio
类型为
WindowAudioPreferenceEnum
surfaceSwitching
类型为
SurfaceSwitchingPreferenceEnum
monitorTypeSurfaces
类型为
MonitorTypeSurfacesEnum
如果存在,则表示应用程序是否希望用户代理将类型为监视器的显示界面包含在提供给用户的选项中。用户代理可以忽略此提示。
用户代理仍可能向用户提供捕获类型为监视器的显示界面的选项。因此,鼓励应用程序仍然检查它们收到的轨道的 displaySurface
设置。
MediaTrackSupportedConstraints
的扩展
MediaTrackSupportedConstraints
在此处使用用户代理识别的约束列表进行扩展。
WebIDLpartial dictionary MediaTrackSupportedConstraints {
boolean displaySurface
= true;
boolean logicalSurface
= true;
boolean cursor
= true;
boolean restrictOwnAudio
= true;
boolean suppressLocalAudioPlayback
= true;
};
displaySurface
类型为 boolean
,默认为
true
是否识别 displaySurface
约束。
logicalSurface
类型为 boolean
,
默认为 true
是否识别 logicalSurface
约束。
cursor
类型为 boolean
,默认为
true
是否识别 cursor
约束。
restrictOwnAudio
类型为 boolean
,默认为
true
是否识别 restrictOwnAudio
约束。
suppressLocalAudioPlayback
类型为 boolean
,
默认为 true
是否识别 suppressLocalAudioPlayback
约束。
MediaTrackConstraintSet
的扩展
MediaTrackConstraintSet
用于读取约束的当前状态。
WebIDLpartial dictionary MediaTrackConstraintSet {
ConstrainDOMString displaySurface
;
ConstrainBoolean logicalSurface
;
ConstrainDOMString cursor
;
ConstrainBoolean restrictOwnAudio
;
ConstrainBoolean suppressLocalAudioPlayback
;
};
displaySurface
类型为
ConstrainDOMString
正在捕获的显示界面的类型。该值取自 DisplayCaptureSurfaceType
枚举。
logicalSurface
类型为 ConstrainBoolean
cursor
类型为 ConstrainDOMString
取自 CursorCaptureConstraint
枚举的值,用于确定光标是否以及何时包含在捕获的显示界面中。
restrictOwnAudio
类型为 ConstrainBoolean
此约束仅适用于音轨。请参阅
restrictOwnAudio
。
suppressLocalAudioPlayback
类型为
ConstrainBoolean
此约束仅适用于音轨。请参阅
suppressLocalAudioPlayback
。
MediaTrackSettings
的扩展
当在视频流轨道上调用 getSettings
()
方法时,用户代理必须返回扩展的
MediaTrackSettings
字典,表示底层用户代理的当前状态。
WebIDLpartial dictionary MediaTrackSettings {
DOMString displaySurface
;
boolean logicalSurface
;
DOMString cursor
;
boolean restrictOwnAudio
;
boolean suppressLocalAudioPlayback
;
double screenPixelRatio
;
};
displaySurface
类型为 DOMString
正在捕获的显示界面的类型。该值取自 DisplayCaptureSurfaceType
枚举。
logicalSurface
类型为
boolean
cursor
类型为 DOMString
取自 CursorCaptureConstraint
枚举的值,用于确定光标是否以及何时包含在捕获的显示界面中。
restrictOwnAudio
类型为 boolean
指示是否应用了 restrictOwnAudio
约束(true
)或未应用(false
)。
suppressLocalAudioPlayback
类型为 boolean
指示应用程序是否指示用户代理对源应用本地音频播放抑制。
screenPixelRatio
类型为 double
正在捕获的显示界面的屏幕像素比。
MediaTrackCapabilities
的扩展
当在视频流轨道上调用 getCapabilities
()
方法时,用户代理必须返回扩展的
MediaTrackCapabilities
字典,表示底层用户代理的功能。
WebIDLpartial dictionary MediaTrackCapabilities {
DOMString displaySurface
;
boolean logicalSurface
;
sequence<DOMString> cursor
;
};
displaySurface
类型为 DOMString
必须与
getSettings
()
返回的值相同,
从而使此属性从应用程序的角度来看是不可变的。
logicalSurface
类型为
boolean
必须与
getSettings
()
返回的值相同,
从而使此属性从应用程序的角度来看是不可变的。
cursor
类型为
sequence<DOMString>必须由用户代理能够为此轨道支持的
CursorCaptureConstraint
中的值的确切集合组成。
DisplayCaptureSurfaceType
枚举描述了不同类型的显示表面。
WebIDLenum DisplayCaptureSurfaceType
{
"monitor
",
"window
",
"browser
"
};
枚举值 | 描述 |
---|---|
monitor
|
一个监视器显示界面、物理显示器或物理显示器的集合 |
window
|
一个窗口显示界面,或单个应用程序窗口 |
browser
|
一个浏览器显示界面,或单个浏览器窗口 |
CursorCaptureConstraint
枚举了
捕获光标的不同条件。
WebIDLenum CursorCaptureConstraint
{
"never
",
"always
",
"motion
"
};
枚举值 | 描述 |
---|---|
never
|
一个 "never " 光标捕获约束
将光标从捕获的显示表面中省略。 |
always
|
一个 "always "
光标捕获约束将光标包含在捕获的显示表面中。 |
motion
|
一个 "motion "
光标捕获约束将在光标/指针移动时将其包含在捕获的显示表面中。当指针/光标在一段时间内没有进一步移动时,捕获的光标将被移除,具体时间由 用户代理 决定。
|
此 API 将每个潜在的捕获源都视为一个离散的媒体源。但是,显示捕获源不得由 enumerateDevices
()
枚举,因为这会泄露过多关于主机系统的信息。
因此,显示捕获源无法通过 deviceId
约束进行选择,因为它们的 deviceId
未公开。
这不应与用于实现隐私指示器算法中同名的稳定且私密的 ID 混淆。
屏幕捕获是一个强大的功能,由名称“display-capture”标识,需要明确的权限才能使用。
根据与权限规范集成的要求,本规范定义了以下内容:
prompt
”和“denied
”。用户代理绝不能将此描述符的权限状态设置为“granted
”。
本规范定义了一个由字符串 "display-capture"
标识的策略控制功能。其默认允许列表为
"self"
。
文档的权限策略决定了该文档中的任何内容是否允许使用
getDisplayMedia
。如果在任何文档中被禁用,则该文档中的任何内容都将不允许使用
getDisplayMedia
。这是由提示用户选择算法强制执行的。
本规范扩展了 getUserMedia
()
的隐私指示器要求,以包含
getDisplayMedia
。
本规范中对 [[devicesLiveMap]]、
[[devicesAccessibleMap]] 和 [[kindsAccessibleMap]] 的引用指的是为支持
getUserMedia
()
的隐私指示器要求而已经创建的定义。
对于 getDisplayMedia
公开的每种设备 kind,使用设备的稳定且私有的 id deviceId,
将 kind 设置为 "Display"
+ kind,并执行以下操作:
false
。
false
。
然后,根据上述新定义,对用户代理的要求是在 getUserMedia
()
的隐私指示器要求中指定的要求。
尽管
getDisplayMedia
只有一个权限描述符,但上述定义按类型区分,以便用户代理能够实现隐私指示器,向最终用户显示在任何时间点正在共享的显示源的具体类型。
由于本规范禁止用户代理持久化“granted
”权限,因此只有“Live”指示器是重要的。
用户代理不得根据
getDisplayMedia
中可用源集的变化触发
devicechange
事件。
本节为说明性内容;然而,如果未遵守其中包含的建议,将对平台安全构成一些严重风险。
捕获显示内容对用户隐私和安全构成的风险有两个方面。直接且明显的风险是用户不小心分享了他们不希望分享的内容,或可能未意识到会被分享的内容。
显示捕获对浏览器沙盒提供的跨站请求伪造保护构成了不太明显的风险。显示和捕获由应用程序控制的信息,即使是间接控制,也可能允许该应用程序访问原本无法直接访问的信息。例如,画布 API 不允许对画布进行采样,或在其未清除来源时转换为可访问的形式[2DCONTEXT]。
这个问题在 [RTCWEB-SECURITY-ARCH] 和 [RTCWEB-SECURITY] 中有更详细的讨论。
显示捕获包括浏览器窗口,特别是那些由任何形式的应用程序控制的窗口,存在违反这些基本安全保护的风险。这种风险不仅限于浏览器窗口,因为取决于操作系统,浏览器应用程序与其他应用程序之间的控制通道也是如此。关键考虑因素是,捕获的 显示表面 是否可能以某种方式呈现对接收媒体的应用程序而言本应保密的信息。
捕获 逻辑显示表面 会导致有可能共享用户未意识到的内容。一个 逻辑显示表面 可能会呈现用户不打算公开的信息。如果这些信息是可见的,用户更容易识别出来。这些方法对机器可能无效,但人类接收者不太可能处理仅短暂出现的内容。
建议将当前未渲染到屏幕上的信息在捕获时遮蔽,除非应用程序已通过 提升权限 专门授权访问该内容。
如何捕获 逻辑显示表面 的遮蔽区域以生成 可见显示表面 捕获 可以 变化。一些应用程序,如演示软件,受益于将遮蔽部分的屏幕渲染为在遮蔽之前出现的图像。冻结图像可能会导致动态内容的视觉伪影,或隐藏内容被遮蔽的事实。请注意,捕获的冻结部分可能被错误地认为是错误。或者,遮蔽区域可能被替换为标记其被遮蔽的内容,例如灰色或阴影。
一些系统可能仅捕获 逻辑显示表面。例如,具有小屏幕的设备通常没有 窗口 的概念,并且仅以全屏模式呈现应用程序。这些系统可能会提供对当前不可见的应用程序的捕获,如果不捕获 逻辑显示表面,则可能无法使用。
当捕获部分透明的 窗口 或其他 显示表面 时,任何后面的内容将不会被捕获。
存在这样一种风险,即用户提示可能会通过新创建的 MediaStreamTrack
短暂地暴露给网页,
例如,如果用户选择了显示用户提示的屏幕。在用户提示显示可供选择的各种界面的预览的情况下,这些预览将不会被新创建的 MediaStreamTrack
捕获。
getDisplayMedia
允许在捕获视频的同时捕获音频,这会带来隐私和安全方面的担忧,因为这可能会暴露有关系统应用程序的额外信息,并且共享音频源的集合不一定与共享视频源的集合相同。例如,在没有用户主动同意的情况下,不会共享捕获的窗口视频以及整个系统的音频(包括与该窗口无关的应用程序的音频)。重要的是用户了解将共享哪些内容,包括任何可能的音频。强烈建议允许用户同意视频但不同意音频,从而产生纯视频流。这确保了对音频的请求始终是可选的,并且与纯视频请求相比,不会限制用户的选择。
建议实现提供类似于用户在共享摄像头或麦克风时所提供的用户反馈和控制机制,正如 [GETUSERMEDIA] 中所鼓励的。
用户在内容被积极捕获时了解内容正在被共享是非常重要的。用户代理 建议在内容被捕获时显示显著的指示器。除了指示器外,建议 用户代理 提供一种方法,精确了解正在共享的内容;虽然应用程序通过呈现捕获的内容可以轻松提供此功能,但此信息允许用户准确评估正在共享的内容。
除了反馈机制外,还建议提供一种方法让用户停止任何活动的捕获。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: