版权所有 © 2015-2024 万维网联盟。 W3C® 责任、商标及宽松文档许可规则适用。
本文档定义了如何使用 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] 已被定义。
除标记为非规范性的章节外,本规范中的所有作者指南、图表、示例和注释均为非规范性。规范中其他内容均为规范性。
文档中的关键字 MAY、MUST、MUST NOT 和 SHOULD 应按照 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('无法获取屏幕捕获: ' + e);
}
本文档使用了 MediaStream
、
MediaStreamTrack
和
ConstrainablePattern
的定义,来源于
[GETUSERMEDIA]。
屏幕捕获涵盖了几种不同类型的基于屏幕的表面。统称为 显示表面,本文档定义了以下类型:
MediaStreamTrack
捕获。
本文档区分了每种显示表面的两个变体:
某些操作系统允许不同应用程序的窗口在其他窗口上方完全或部分遮挡,因此 可见显示表面 是 逻辑显示表面 的严格子集。
源像素比 是 显示表面 的 1/96 英寸除以其垂直像素大小。
devicechange 事件在 [GETUSERMEDIA] 中定义。
通过在 getDisplayMedia
方法添加到
MediaDevices
接口,可以启用对显示媒体的捕获,
该方法类似于 getUserMedia
()
,但每次都是从由最终用户选择的一个显示设备获取媒体。
WebIDLpartial interface MediaDevices
{
Promise<MediaStream> getDisplayMedia
(optional DisplayMediaStreamOptions
options = {});
};
getDisplayMedia
提示用户许可以实时捕获其显示屏。
用户代理必须每次都让最终用户从所有可用选项中选择一个 显示表面
进行共享,并且不得
使用 MediaTrackConstraints
中的
options.video
或
options.audio
限制该选择。
用户代理可以使用 displaySurface
限制的存在及其值来影响向用户展示的源选择。
但用户代理必须仍然为用户提供无限制的显示表面选择。强烈建议用户代理引导用户避免共享整个显示器,
因为这会对用户隐私构成 风险。
用户选择后,MediaTrackConstraints
中的任何 options.video
或 options.audio
必须 仅应用于用户选择的媒体。
对于音频,用户代理可以为最终用户提供可共享的音频源。哪些选项可供选择由用户代理决定,
而音频源不一定与视频源相同。音频源可以是某个 窗口、浏览器、整个系统音频或它们的任意组合。
与getUserMedia()
不同,用户代理可以不返回音频,即使音频约束存在。如果用户代理知道在流的生命周期内不会共享音频,
它不得 在结果流中包含音轨。用户代理可以通过仅返回视频轨道接受音视频请求,
也可以通过返回音轨和视频轨道来接受请求。用户代理必须拒绝仅音频请求。
除源选择不同且需要用户选择外,getDisplayMedia()
与 getUserMedia()
的不同还在于 "granted
" 权限无法持久化。
当调用 getDisplayMedia()
方法时,用户代理必须执行以下步骤:
令 mediaDevices 为 this。
令 controller 为 options.controller
(若存在),否则为
null
。
如果 controller 不为 null
,则运行以下步骤:
如果 controller.[[IsBound]]
为 true
,
则返回一个带有 DOMException
对象的 promise,
该对象的 name
属性值为 InvalidStateError
。
将 controller.[[IsBound]]
设置为
true
。
如果 相关的全局对象
的 this 没有
短暂激活,则返回一个
带有 DOMException
对象的 promise,
该对象的 name
属性值为 InvalidStateError
。
令 options 为此方法的第一个参数。
令 constraints 为 [
options.audio
,
options.video
]
。
如果 constraints.video
为 false
,则返回一个带有新创建的 TypeError
的 promise。
对于 constraints 中的每个值为字典的现有成员 CS,运行以下步骤:
如果 CS 包含名为 advanced
的成员,则返回一个带有新创建的 TypeError
的
promise。
如果 CS 包含一个成员,其名称指定了适用于 显示表面 的
可约束属性,并且其值是包含名为 min
或 exact
成员的字典,则返回一个带有新创建的
TypeError
的 promise。
如果 CS 包含一个成员,其名称指定了适用于 显示表面 的
可约束属性,并且其值是包含名为 max
的成员的字典,并且该成员的值小于可约束属性的
下限值,则令 failedConstraint
为该成员的名称,令
message 为 undefined
或人类可读的消息,并返回一个带有通过调用
OverconstrainedError(failedConstraint, message)
创建的新
OverconstrainedError
的 promise。
令 requestedMediaTypes 为 constraints 中的媒体类型集合,且这些类型的值为字典或
true
。
如果 当前设置对象的
相关全局对象的
关联的
Document
不是 完全激活的,或没有
焦点,则返回带有 DOMException
对象的 promise,
该对象的 name
属性值为 InvalidStateError
。
令 p 为一个新的 promise。
按以下步骤并行运行:
对于 requestedMediaTypes 中的每个媒体类型 T:
如果没有类型为 T 的来源,则用带有 DOMException
对象的 promise 拒绝 p,该对象的 name
属性值为 NotFoundError
。
读取当前浏览上下文中获取类型 T 的来源的 权限状态。
如果权限状态是 "denied
",则跳转到标记为
PermissionFailure 的步骤。
可选地,例如基于先前建立的用户偏好、出于安全原因或由于平台限制,跳转到标记为 Permission Failure 的步骤。
提示用户选择
一个显示设备,用于 PermissionDescriptor
,其
name
设置为 "display-capture",结果是提供的一组媒体。
提供的媒体 MUST 包含一个视频轨道。
提供的媒体 MUST 至多包含一个音频轨道。如果在 requestedMediaTypes
中没有指定音频,或其值为 false
,则该音频轨道 MUST NOT 被包含。
选择的设备 MUST 由用户确定。一旦选择了来源,MediaStreamTrack
的来源 MUST NOT 改变,除非用户通过其与用户代理的交互允许。
鼓励用户代理警告用户不要共享 浏览器 显示设备或 显示器 显示设备,尤其是在浏览器窗口可见的情况下,或基于这些共享代表了显著更高的风险尝试阻止选择这些设备。
如果请求的结果是 "granted
",
那么对于每个为提供的媒体提供来源的设备,使用设备的稳定且私有的 ID(deviceId),
设置 [[devicesLiveMap]][deviceId] 为 true
,如果它还没有设置为
true
,并且将 [[devicesAccessibleMap]][deviceId] 设置为
true
。
用户代理 MUST NOT 存储 "granted
"
权限条目。
如果结果是 "denied
",
则跳转到标记为 Permission Failure 的步骤。如果用户从未响应,则该算法在此步骤停滞。
如果用户授予了权限但由于硬件错误(如操作系统/程序/网页锁定)阻止访问,用带有新 DOMException
对象的 promise 拒绝 p,该对象的 name
属性值为 NotReadableError
,并中止这些步骤。
如果结果是 "granted
",
但设备访问由于上述原因以外的任何原因失败,用带有新 DOMException
对象的 promise 拒绝 p,该对象的 name
属性值为 AbortError
,并中止这些步骤。
令 stream 为 MediaStream
对象。
对于用户授予权限的每个来源,执行以下步骤:
令 track 为通过 创建 MediaStreamTrack 的结果,使用 source 和 mediaDevices。
将 track 添加到 stream 的轨道集中。
将轨道来源与 MediaDevices 绑定,使用 source 和 mediaDevices。
对 stream 中的所有轨道运行 应用约束算法。
如果失败,令 failedConstraint 为失败的算法结果,令 message 为
undefined
或信息性的人类可读消息,
然后用新创建的 OverconstrainedError
拒绝 p,通过调用
OverconstrainedError(failedConstraint, message)
。
此 getDisplayMedia
()
调用现在被认为已经产生了一个新的 捕获会话。
null
,执行以下步骤:
将 controller.[[Source]]
设置为
stream 的视频轨道的 [[Source]]。
将 controller.[[DisplaySurfaceType]]
设置为 stream 的视频轨道的 DisplayCaptureSurfaceType
。
排队一个任务,以在 controller 上运行 最终确定焦点决策算法。
解析 p 并中止这些步骤。
Permission Failure:用新 DOMException
对象的 promise 拒绝 p,该对象的 name
属性值为 NotAllowedError
。
返回 p。
当顶级文档失去焦点时,按以下步骤对该文档及其嵌套的 CaptureController
对象运行这些操作:
如果
[[Source]]
是 undefined
,则中止这些步骤。
将 [[FocusChangeDisabled]]
设置为
true
。
用户代理 不得 捕获部分透明的已捕获 显示表面 背后的内容。
对于新创建的
MediaStreamTrack
,用户代理 不得
捕获显示给用户的提示。
未当前显示在屏幕上的信息 应当 在捕获中被模糊处理,除非应用程序已被特别授权访问该内容(例如,通过 提升的权限 等方式)。
用户代理 不得 在没有 用户主动同意 的情况下共享音频,例如当捕获一个 窗口 的视频伴随捕获整个系统的音频,包括与该窗口无关的应用程序时。
共享的显示表面可能会因操作系统或用户代理采取的操作而暂时或永久变得无法访问。显示表面被视为不可访问的具体情况不在本规范范围内,但示例可能包括监视器断开连接、窗口或浏览器关闭或最小化,或由于电话上的来电导致。
用户代理最终决定在此上下文中不可访问的含义,但鼓励仅为有外部原因的中断触发静音和取消静音事件。
当显示表面进入非永久的不可访问状态时,用户代理必须排队一个任务,
该任务将相应媒体轨道的静音状态
设置为true
。
当显示表面退出不可访问状态并变得可访问时,用户代理必须排队一个任务,
该任务将相应媒体轨道的静音状态
设置为false
。
当显示表面进入永久不可访问状态时(例如源窗口关闭),用户代理必须排队一个任务,该任务将相应的媒体轨道结束。
刚刚由getDisplayMedia
返回的流可能包含默认静音的轨道。属于同一流的音频和视频轨道可以独立静音或取消静音。
不接受源选择的约束意味着getDisplayMedia
仅提供指纹信息,暴露是否存在音频、视频或音视频显示源。
请注意,接受displaySurface
约束不会限制用户选择。
在getDisplayMedia
中,约束的作用与在
getUserMedia
()
中不同。它们不用于发现,而是在用户选择之后应用。
本节定义了哪些约束适用于getDisplayMedia
轨道;除非在此列出,否则
getUserMedia
()
中定义的约束不适用。
其中一些约束启用了用户代理处理功能,例如降尺度和帧减损,以及显示特定的功能。其他约束允许观察用户选择的显示表面的固有属性,如功能和设置。
以下新的和现有的MediaStreamTrack
可约束属性被定义为适用于用户选择的视频显示表面,并具有以下行为:
属性名称 | 类型 | 行为 |
---|---|---|
width | unsigned long
|
以像素为单位的宽度。作为能力,最大值必须反映显示表面的宽度,最小值必须反映用户代理通过缩放提供的最小保持宽高比的表示。 |
height | unsigned long
|
以像素为单位的高度。作为能力,最大值必须反映显示表面的高度,最小值必须反映用户代理通过缩放提供的最小保持宽高比的表示。 |
frameRate | double |
帧率(每秒帧数)。作为能力,最大值必须反映显示表面的帧率,最小值必须反映用户代理通过帧减损提供的最低帧率。 |
aspectRatio | double |
精确的宽高比(宽度除以高度,以小数点后十位表示的双精度数值)或宽高比范围。作为设置,表示width / height 。作为能力,最小值和最大值必须为当前设置值,使该属性从应用程序视角看不可变。 |
resizeMode | DOMString |
该字符串是VideoResizeModeEnum 的成员之一。作为设置,"none "表示MediaStreamTrack 包含呈现显示所有细节所需的所有比特,如果source pixel ratio> 1 ,则width 和height 比终端用户视角下的显示外观更大。而"crop-and-scale "表示MediaStreamTrack 包含显示表面的按比例缩小的表示,但未裁剪。作为能力,"none "和"crop-and-scale "必须都存在。 |
displaySurface | DOMString |
此字符串是DisplayCaptureSurfaceType 的成员之一。
作为设置,表示正在捕获的显示表面的类型。作为能力,设置值必须是唯一的值,使得该属性从应用程序视角看不可变。作为约束,值向用户代理指示应用程序偏好特定的显示表面类型;用户代理可以根据该偏好重新排序提供给用户的选项。此约束在其他用途上被忽略,因此不会产生任何副作用(例如成为OverconstrainedError 的原因)。
|
logicalSurface | boolean |
作为设置,值为true 表示捕获逻辑显示表面,而值为false 表示捕获可见显示表面。作为能力,此相同的值必须是唯一的值,使该属性从应用程序视角看不可变。 |
cursor | DOMString |
此字符串是CursorCaptureConstraint 的成员之一。作为设置,表示捕获的显示表面中光标是否包括以及何时包括。作为能力,用户代理必须仅包含其能够支持的从CursorCaptureConstraint 获取的值集。
|
以下新属性和已有的MediaStreamTrack
可约束属性
被定义为适用于用户选择的音频源,具有以下行为:
属性名称 | 类型 | 行为 |
---|---|---|
restrictOwnAudio | boolean |
作为设置,此值指示用户代理是否正在对源应用自有音频限制。 作为约束,此属性可以被约束,结果是启用或禁用自有音频限制。 当应用自有音频限制时,用户代理必须尝试从正在捕获的音频中移除由执行
|
suppressLocalAudioPlayback | boolean |
作为设置,此值指示应用程序是否指示用户代理对源应用本地音频回放抑制。 作为约束,该值仅在用户选择捕获浏览器显示表面时才有意义。在这种情况下,值为 当应用本地音频回放抑制时,用户代理应停止将音频传递到本地扬声器,但该音频必须仍被任何正在进行的音频捕获捕获会话捕获。此抑制不得被捕获的文档感知。此外,捕获的文档只能观察是否应用suppressLocalAudioPlayback,而不是抑制是否生效(即不能观察用户是否在用户代理中覆盖了此设置)。 当浏览器显示表面同时被多个捕获时,只要至少有一个活动的音频捕获捕获会话将suppressLocalAudioPlayback约束为 |
当用户选择的显示表面的底层源的固有属性发生变化时,例如用户调整捕获窗口大小时,这些变化使一个或多个可约束属性的能力和/或设置过时时,用户代理必须排队一个任务来执行以下步骤:
同时更新所有受影响的可约束属性。
如果这导致“过度约束”的情况,那么用户代理必须忽略造成过度约束的约束,只要它们继续过度约束。用户代理不得使音轨静音。
虽然min和exact约束在getDisplayMedia()上会产生TypeError,但本规范不改变track.applyConstraints()方法。因此,它们可能根据值而产生OverconstrainedError或成功,因此可能存在以导致这种“过度约束”的情况。max约束也可能导致这种情况,例如在aspectRatio的情况下。本规范认为这些是无用的边缘情况。
为了实现选择设置 算法,用户代理应该考虑所有可能的缩放组合,这些组合可以在保持原始显示表面的纵横比(精确到最近的像素)的情况下进行,以及通过帧删减可用的帧率,作为可用的设置字典。
约束条件的缩放和删减效果随后由适应距离 算法有效地管理。
目的是让用户代理在指定理想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 |
应用程序是否已尝试将this与 捕获会话关联。 |
[[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。
The 焦点决策最终确定算法,给定controller,包括以下步骤:
如果自捕获会话开始以来已经经过了太长时间,用户代理应该将
[[FocusDecisionFinalized]]
设置为
true
。时间跨度由用户代理决定,但建议使用一秒的值。
如果controller.[[FocusDecisionFinalized]]
为
true
,中止这些步骤。
将controller.[[FocusDecisionFinalized]]
设置为
true
。
如果controller.[[FocusChangeDisabled]]
为true
,中止这些步骤。
如果controller.[[DisplaySurfaceType]]
既不是
"browser
"也不是
"window
",中止这些步骤。
让focusBehavior为controller.[[FocusBehavior]]
。
并行运行以下步骤并行:
如果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 SurfaceSwitchingPreferenceEnum
{
"include
",
"exclude
"
};
枚举值描述 | |
---|---|
include
|
应用程序希望在捕获期间为用户提供动态切换源显示表面的选项。 |
exclude
|
应用程序希望在捕获期间不提供动态切换源显示表面的选项。 |
描述应用程序是否希望用户代理为用户提供选择类型为 监视器的 显示表面的选项。
WebIDLenum MonitorTypeSurfacesEnum
{
"include
",
"exclude
"
};
枚举值描述 | |
---|---|
include
|
应用程序希望提供类型为监视器的 显示表面供用户选择。 |
exclude
|
应用程序希望不提供类型为监视器的 显示表面供用户选择。 |
DisplayMediaStreamOptions
字典用于向用户代理指示哪些类型的MediaStreamTrack
可以包含在
MediaStream
中,该MediaStream
由getDisplayMedia
返回。
WebIDLdictionary DisplayMediaStreamOptions
{
(boolean or MediaTrackConstraints) video
= true;
(boolean or MediaTrackConstraints) audio
= false;
CaptureController
controller
;
SelfCapturePreferenceEnum
selfBrowserSurface
;
SystemAudioPreferenceEnum
systemAudio
;
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
对象
将与
capture-session
关联。通过此对象提供的方法,可以操作
capture-session。
selfBrowserSurface
类型为
SelfCapturePreferenceEnum
systemAudio
类型为
SystemAudioPreferenceEnum
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
;
};
displaySurface
类型为 DOMString
正在捕获的 显示表面 的类型。
这假设来自 DisplayCaptureSurfaceType
枚举的值。
logicalSurface
类型为 boolean
cursor
类型为 ConstrainDOMString
假设来自 CursorCaptureConstraint
枚举的值,该枚举决定何时以及是否将光标包含在捕获的
显示表面中。
restrictOwnAudio
类型为 boolean
指示是否应用 restrictOwnAudio 约束
(true
) 或不应用 (false
)。
suppressLocalAudioPlayback
类型为 boolean
指示应用程序是否指示用户代理对源应用 本地音频播放抑制。
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" 指示器是
重要的。
用户代理 不得 根据
devicechange 事件
根据
getDisplayMedia
的可用源集的变化触发。
本节为说明性内容;然而,如果未遵守其中包含的建议,将对平台安全构成一些严重风险。
捕获显示内容对用户隐私和安全构成的风险有两个方面。直接且明显的风险是用户不小心分享了他们不希望分享的内容,或可能未意识到会被分享的内容。
显示捕获对浏览器沙盒提供的跨站请求伪造保护构成了不太明显的风险。显示和捕获由应用程序控制的信息,即使是间接控制,也可能允许该应用程序访问原本无法直接访问的信息。例如,画布 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: