Screen Capture API

Screen Capture API 允许网站捕获屏幕共享媒体流,实现共享屏幕功能

使用

调用 MediaDevices 接口的 getDisplayMedia() 方法捕获屏幕共享媒体流

方法可以传递一个可选的配置项参数,参数结构如下:

  • video 参数,同 MediaDevices 接口的 getUserMedia() 方法,默认为 true
  • audio 参数,同 MediaDevices 接口的 getUserMedia() 方法,默认为 false
  • controller 参数,接收一个 CaptureController 对象,可用于进一步操作捕获会话
  • preferCurrentTab 参数,接收一个布尔值,表示是否将当前标签页设置为最突出的选择
  • selfBrowserSurface 参数,接收 excludeinclude 之一,指示是否应当允许捕获当前标签页,默认为 exclude
  • systemAudio 参数,接收 excludeinclude 之一,指示是否应当包含系统音频,默认为 include
  • surfaceSwitching 参数,接收 excludeinclude 之一,指示是否应当显示动态切换共享标签页的控件,默认为 exclude
  • monitorTypeSurfaces 参数,接收 excludeinclude 之一,指示是否应当包含显示界面,默认为 include

方法返回一个兑现一个 MediaStreamPromise

controller 参数已传递给一个屏幕媒体流,或当前未处于粘性激活状态、完全激活状态、完全聚焦状态之一,方法抛出 InvalidStateError 异常

video 参数被置为 falseaudio 参数或 video 参数之一包含 advanced 选项或 min 属性或 exact 属性,方法抛出 TypeError 异常

若传递的限制屏幕的参数 max 的值小于可约束属性支持的下限,即此时无法捕获符合参数限制的屏幕媒体流,或应用参数限制失败,方法抛出 OverconstrainedError 异常

若无法获得对应的屏幕媒体流,方法抛出 NotFoundError 异常

若用户拒绝授权使用屏幕媒体流的权限,或用户代理网页限制使用屏幕共享,方法抛出 NotAllowedError 异常

若因为操作系统/程序/网页限制无法提供媒体流,抛出 NotReadableError 异常

若因为其他未知原因无法提供媒体流,抛出 AbortError 异常

CaptureController 简介:

可调用其构造方法创建一个 CaptureController 实例

可调用其 setFocusBehavior() 方法设置其聚焦策略,传入参数可以为 focus-captured-surface(转移焦点至捕获界面)或 no-focus-change(不转移焦点)

相关参数

  • displaySurface 参数,指定显示界面的类型,值为 monitor window browser 之一
  • logicalSurface 参数,指定是否为逻辑显示界面,返回一个布尔值
  • cursor 参数,指定是否将光标包含在显示界面中,值为 never always motion 之一
  • restrictOwnAudio 参数,控制是否尝试从移除由当前文档产生的音频,返回一个布尔值
  • suppressLocalAudioPlayback 参数,控制是否将捕获的本地音频转发到本地扬声器设备,返回一个布尔值

这些参数被拓展至以下一些结构:

  • MediaTrackSupportedConstraints 结构
  • MediaTrackConstraintSet 结构(从而拓展至 MediaTrackConstraints 结构)
  • MediaTrackSettings 结构
  • MediaTrackCapabilities(不含 restrictOwnAudiosuppressLocalAudioPlayback 参数)结构

这些参数在屏幕共享的媒体流中可用

示例

权限策略

该 API 调用受到 display-capture 权限策略的控制,可以通过 Permissions-Policy 响应头指定,或通过 <iframe> 标签的 allow 属性指定

默认值是 self,即允许当前源的浏览上下文使用该 API

权限 API

该 API 每次调用都需要用户授予 display-capture 权限(即不会将该权限设置为 granted),可以调用 Permission.query() 方法检查用户是否拒绝授予该权限

类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
interface MediaDevices {
getDisplayMedia(options?: DisplayMediaStreamOptions): Promise<MediaStream>
}

interface DisplayMediaStreamOptions {
audio?: boolean | MediaTrackConstraints
video?: boolean | MediaTrackConstraints
controller: CaptureController
selfBrowserSurface: SelfCapturePreferenceEnum
systemAudio: SystemAudioPreferenceEnum
surfaceSwitching: SurfaceSwitchingPreferenceEnum
monitorTypeSurfaces: MonitorTypeSurfacesEnum
}

interface CaptureController extends EventTarget {
setFocusBehavior(focusBehavior: CaptureStartFocusBehavior): void
}

declare var CaptureController: {
prototype: CaptureController
new(): CaptureController
}

type CaptureStartFocusBehavior = 'focus-capturing-application' | 'focus-captured-surface' | 'no-focus-change'
type SelfCapturePreferenceEnum = 'include' | 'exclude'
type SystemAudioPreferenceEnum = 'include' | 'exclude'
type SurfaceSwitchingPreferenceEnum = 'include' | 'exclude'
type MonitorTypeSurfacesEnum = 'include' | 'exclude'

interface MediaTrackSupportedConstraints {
displaySurface?: boolean
logicalSurface?: boolean
cursor?: boolean
restrictOwnAudio?: boolean
suppressLocalAudioPlayback?: boolean
}

interface MediaTrackConstraintSet {
displaySurface?: ConstrainDOMString
logicalSurface?: ConstrainBoolean
cursor?: ConstrainDOMString
restrictOwnAudio?: ConstrainBoolean
suppressLocalAudioPlayback?: ConstrainBoolean
}

interface MediaTrackSettings {
displaySurface?: string
logicalSurface?: boolean
cursor?: string
restrictOwnAudio?: boolean
suppressLocalAudioPlayback?: boolean
}

interface MediaTrackCapabilities {
displaySurface?: string
logicalSurface?: boolean
cursor?: string[]
}

链接

发布于

2023-12-18

更新于

2023-12-24

许可协议

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...