Media Capture and Streams API 用于处理视频音频流,以及枚举本地媒体设备,它与 WebRTC API 息息相关
枚举本地媒体设备 该部分 API 主要提供了枚举本地媒体设备的功能,包括媒体输入设备或媒体输出设备,通过 Navigator 接口的 mediaDevices 只读属性暴露的 MediaDevices 实例使用
通过调用 MediaDevices 接口的 enumerateDevices() 方法获取本地媒体设备列表
方法返回一个 Promise 的 MediaDeviceInfo 数组
调用该方法会受到 microphone 和 camera 权限策略的限制,并且要求文档处于完全活跃状态并且当前可见
默认调用该方法仅会返回系统默认媒体设备,返回具体设备受到 microphone 与 camera 权限 API 的限制
监听本地媒体设备变化 当本地媒体设备列表改变时(如新的媒体设备连接到系统,或已有媒体设备从系统中移除),MediaDevices 接口上的 devicechange 事件会被触发,方法返回一个 Event 事件
此时可以再次调用 MediaDevices 接口的 enumerateDevices() 方法更新本地媒体设备列表
本地媒体设备信息 MediaDeviceInfo 接口表示一个本地媒体设备;特别的,InputDeviceInfo 接口表示一个本地媒体输入设备
MediaDeviceInfo 接口的 deviceId 只读属性返回一个字符串,代表本地媒体设备的唯一标识
MediaDeviceInfo 接口的 groupId 只读属性返回一个字符串,代表本地媒体设备的组标识,对于同一物理设备的不同媒体设备的该值相同
MediaDeviceInfo 接口的 kind 只读属性返回一个字符串枚举,值为 videoinput audioinput audiooutput 之一,代表本地媒体设备的类型
MediaDeviceInfo 接口的 label 只读属性返回一个字符串,代表本地媒体设备的描述,可用于向用户展示
MediaDeviceInfo 接口的 toJSON() 方法是一个序列化方法,对该媒体设备信息序列化后返回一个普通对象
InputDeviceInfo 接口的 getCapabilities() 方法描述原始音频或视频轨道的信息,返回一个 MediaTrackCapabilities 结构的对象;若未授予相应的权限,空对象将被返回
MediaTrackCapabilities 结构参见如下媒体参数 章节
 
检测用户代理支持参数 调用 MediaDevices 接口的 getSupportedConstraints() 方法获取用户代理支持识别的参数列表,返回一个 MediaTrackSupportedConstraints 结构的对象,对象的键名为所有受支持的参数列表,键值为 true
MediaTrackSupportedConstraints 结构参见如下媒体参数 章节
 
获取本地媒体设备输入流 调用 MediaDevices 接口的 getUserMedia() 方法从本地媒体设备获取输入流
也可以使用该方法来请求本地媒体设备的权限,包括麦克风 microphone 权限与摄像头 camera 权限
方法接收一个 MediaStreamConstraints 结构的对象
方法返回一个兑现包含 MediaStream 实例的 Promise
若未传入参数或传入对象参数包含任一 audio 参数或 video 参数,或传入对象参数包含不允许的参数,抛出 TypeError
若文档未处于完全激活状态,抛出 InvalidStateError
若请求媒体资源类型在当前浏览上下文中被阻止(如受权限策略限制),或被权限 API 拒绝,抛出 NotAllowedError
若无法获取满足条件的媒体轨道,抛出 NotFoundError
若不存在符合约束条件的候选设备,抛出 OverconstrainedError
若因为操作系统/程序/网页锁定设备导致无法从设备读取流信息,抛出 NotReadableError
若因为其他原因无法从设备读取流信息,抛出 AbortError
MediaStreamConstraints 结构如下:
audio 参数表示音频轨道相关信息,可以为一个布尔值(指定是否必须包含该轨道)或一个 MediaTrackConstraints 结构的对象
video 参数表示视频轨道相关信息,可以为一个布尔值(指定是否必须包含该轨道)或一个 MediaTrackConstraints 结构的对象
 
MediaTrackConstraints 结构继承自 MediaTrackConstraintSet 结构
其 advanced 参数表示一个 MediaTrackConstraintSet 结构的对象的数组
 
MediaTrackConstraintSet 结构参见如下媒体参数 章节
 
OverconstrainedError 异常继承自 DOMException,常用于表示所需的功能集无法满足当前 MediaStreamTrack
其 constraint 只读属性返回一个字符串,表示未满足的约束
 
     
    加载 
    
媒体参数 
width 参数表示视频轨道的宽度 
height 参数表示视频轨道的高度 
aspectRatio 参数表示视频轨道的宽高比 
frameRate 参数表示视频轨道的帧速 
facingMode 参数表示视频轨道的摄像头朝向参数 
resizeMode 参数表示视频轨道的可裁剪模式 
sampleRate 参数表示音频轨道的采样率 
sampleSize 参数表示音频轨道的样本大小 
echoCancellation 参数表示音频轨道的是否可进行回声消除 
autoGainControl 参数表示音频轨道的是否可进行自动增益控制 
noiseSuppression 参数表示音频轨道的是否可进行噪声抑制 
latency 参数表示音频轨道的延迟时间 
channelCount 参数表示音频轨道的通道数 
deviceId 参数表示轨道相关的 deviceId 属性 
groupId 参数表示轨道相关的 groupId 属性 
 
这些参数可被如下一些结构使用:
MediaTrackSupportedConstraints 结构,表示受到用户代理支持的约束参数
MediaDevices.getSupportedConstraints() 方法 
 
 
MediaTrackConstraintSet 结构 
MediaTrackConstraints 结构(继承 MediaTrackConstraintSet 结构),表示开发者配置的约束参数范围
MediaDevices.getDisplayMedia() 方法 
MediaDevices.getUserMedia() 方法 
MediaStreamTrack.getConstraints() 方法 
MediaStreamTrack.applyConstraints() 方法 
 
 
MediaTrackSettings 结构,表示用户代理实际使用的约束参数
MediaStreamTrack.getSettings() 方法 
 
 
MediaTrackCapabilities 结构,表示用户代理支持的约束参数范围
MediaStreamTrack.getCapabilities() 方法 
InputDeviceInfo.getCapabilities() 方法 
 
 
 
并且这些结构通过 Screen Capture API 和 MediaStream Image Capture API 被拓展
媒体流 MediaStream 接口表示一个媒体流,它可包含多个媒体轨道(音频轨道与视频轨道),它支持对其包含的媒体轨道的枚举、获取、增加及删除,以及对自身的创建和克隆等
创建媒体流 可以通过 MediaDevices.getUserMedia() MediaDevices.getDisplayMedia() HTMLCanvasElement.captureStream() HTMLMediaElement.captureStream() 等方法创建对应的媒体流
亦可以调用 MediaStream() 构造方法创建新媒体流
构造方法可以不传任何参数,创建一个空的媒体流
构造方法可以传一个 MediaStream 实例参数,创建的媒体流会与传入参数的媒体流共享使用所有媒体轨道
构造方法可以传一个 MediaStreamTrack 数组参数,创建的媒体流会使用所有传入的媒体轨道
媒体流信息 MediaStream 接口的 id 只读属性返回媒体流的一个唯一的 32 位标识符 UUID
MediaStream 接口的 active 只读属性标识媒体流当前是否处于活跃状态
媒体流是否处于活跃状态,取决于其包含的所有媒体轨道是否结束(readyState 属性是否被置为 ended)
克隆媒体流 MediaStream 接口的 clone() 方法克隆当前媒体流,同时会克隆其包含的所有媒体轨道,返回的新媒体流具有与原媒体流不同的 ID
增加媒体轨道 MediaStream 接口的 addtrack() 方法向媒体流中增加给定媒体轨道,需要传入一个 MediaStreamTrack 实例参数;若给定媒体轨道已在媒体流中,调用该方法不会产生效果
MediaStream 接口的 addtrack 事件在媒体流中增加媒体轨道时触发,返回一个 MediaStreamTrackEvent 事件
移除媒体轨道 MediaStream 接口的 removetrack() 方法向媒体流中移除给定媒体轨道,需要传入一个 MediaStreamTrack 实例参数;若给定媒体轨道未在媒体流中,调用该方法不会产生效果
MediaStream 接口的 removetrack 事件在媒体流中移除媒体轨道时触发,返回一个 MediaStreamTrackEvent 事件
媒体轨道改变事件 MediaStreamTrackEvent 事件表示媒体流的改变
其 track 只读属性表示产生该变化的媒体轨道,返回一个 MediaStreamTrack 实例
获取媒体轨道 MediaStream 接口的 getTrackById() 方法获取媒体流中给定 ID 的媒体轨道,若存在则返回一个 MediaStreamTrack 实例,反之 null 被返回
MediaStream 接口的 getAudioTracks() 方法获取媒体流中所有音频轨道,返回一个 MediaStreamTrack 数组
MediaStream 接口的 getVideoTracks() 方法获取媒体流中所有视频轨道,返回一个 MediaStreamTrack 数组
MediaStream 接口的 getTracks() 方法获取媒体流中所有媒体轨道,返回一个 MediaStreamTrack 数组
媒体轨道 MediaStreamTrack 接口表示表示一个媒体轨道,它支持对自身的克隆和暂停及获取或设置自身的配置等
媒体轨道信息 MediaStreamTrack 接口的 id 只读属性返回媒体轨道的一个唯一的 32 位标识符 UUID
MediaStreamTrack 接口的 kind 只读属性返回媒体轨道的类型,值为 audio 代表音频轨道,值为 video 代表视频轨道
MediaStreamTrack 接口的 label 只读属性返回媒体轨道的标签,值由用户代理生成
媒体轨道使用状态 MediaStreamTrack 接口的 muted 只读属性指示媒体轨道当前是否支持提供媒体数据
MediaStreamTrack 接口的 mute 事件在媒体轨道的源无法提供媒体数据时触发,返回一个 Event 事件
MediaStreamTrack 接口的 unmute 事件在媒体轨道的源再次能够提供媒体数据时触发,返回一个 Event 事件
MediaStreamTrack 接口的 enabled 属性读取或设置媒体轨道是否允许提供媒体数据;对音频轨道而言,样本值被置为 0;对视频轨道而言,像素值均为黑色
媒体轨道运行状态 MediaStreamTrack 接口的 readyState 只读属性返回当前媒体轨道的状态,值 live 指示媒体轨道正常运行,值 ended 指示媒体轨道已终止提供数据
MediaStreamTrack 接口的 stop() 方法终止当前媒体轨道,并且 readyState 属性值会置为 ended,但 ended 事件不会被触发
MediaStreamTrack 接口的 ended 事件在媒体轨道对应资源终止提供媒体数据时触发
克隆媒体轨道 MediaStreamTrack 接口的 clone() 方法克隆当前媒体轨道,返回的新媒体轨道具有与原媒体轨道不同的 ID
媒体轨道参数 MediaStreamTrack 接口的 getConstraints() 方法读取媒体轨道的约束属性,返回一个 MediaTrackConstraints 结构的对象
MediaStreamTrack 接口的 applyConstraints() 方法向媒体轨道应用约束属性,需要传递一个 MediaTrackConstraints 结构的对象参数,返回一个 Promise
MediaStreamTrack 接口的 getCapabilities() 方法读取媒体轨道的允许受约束属性值,返回一个 MediaTrackCapabilities 结构的对象
MediaStreamTrack 接口的 getSettings() 方法读取媒体轨道的受约束属性(包含由操作系统指定的默认值),返回一个 MediaTrackSettings 结构的对象
MediaTrackSettings 结构参见如上媒体参数 章节
 
权限策略 该 API 调用受到 microphone 权限策略或 camera 权限策略的控制,可以通过 Permissions-Policy 响应头指定,或通过 <iframe> 标签的 allow 属性指定
默认值均是 self,即允许在当前源的浏览上下文使用该 API
权限 API 该 API 调用需要用户授予 microphone 权限或 camera 权限,可以调用 Permission.query() 方法检查用户是否已授予了该权限
camera 权限的描述符的额外参数 panTiltZoom,值 true 比值 false 具有更高的优先级
类型 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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 interface  MediaDevices  extends  EventTarget  {  enumerateDevices (): Promise <MediaDeviceInfo []>   getSupportedConstraints (): MediaTrackSupportedConstraints    getUserMedia (constraints?: MediaStreamConstraints ): Promise <MediaStream >   ondevicechange : ((this : MediaDevices, ev: Event ) =>  any ) | null  } declare  var  MediaDevices : {  prototype : MediaDevices  } interface  MediaDeviceInfo  {  readonly  deviceId : string    readonly  groupId : string    readonly  kind : MediaDeviceKind    readonly  label : string    toJSON (): any  } declare  var  MediaDeviceInfo : {  prototype : MediaDeviceInfo    new (): MediaDeviceInfo  } interface  InputDeviceInfo  extends  MediaDeviceInfo  {  getCapabilities (): MediaTrackCapabilities  } declare  var  InputDeviceInfo : {  prototype : InputDeviceInfo    new (): InputDeviceInfo  } interface  OverconstrainedError  extends  DOMException  {  readonly  constraint : string  } declare  var  OverconstrainedError : {  prototype : OverconstrainedError    new (constraint : string , message?: string ): OverconstrainedError  } interface  MediaStream  extends  EventTarget  {  readonly  active : boolean    readonly  id : string    addTrack (track : MediaStreamTrack ): void    clone (): MediaStream    getAudioTracks (): MediaStreamTrack []   getTrackById (trackId : string ): MediaStreamTrack  | null    getTracks (): MediaStreamTrack []   getVideoTracks (): MediaStreamTrack []   removeTrack (track : MediaStreamTrack ): void    onaddtrack : ((this : MediaStream, ev: MediaStreamTrackEvent ) =>  any ) | null    onremovetrack : ((this : MediaStream, ev: MediaStreamTrackEvent ) =>  any ) | null  } declare  var  MediaStream : {  prototype : MediaStream    new (): MediaStream    new (stream : MediaStream ): MediaStream    new (tracks : MediaStreamTrack []): MediaStream  } interface  MediaStreamTrack  extends  EventTarget  {  contentHint : string    enabled : boolean    readonly  id : string    readonly  kind : string    readonly  label : string    readonly  muted : boolean    readonly  readyState : MediaStreamTrackState    applyConstraints (constraints?: MediaTrackConstraints ): Promise <void >   clone (): MediaStreamTrack    getCapabilities (): MediaTrackCapabilities    getConstraints (): MediaTrackConstraints    getSettings (): MediaTrackSettings    stop (): void    onended : ((this : MediaStreamTrack, ev: Event ) =>  any ) | null    onmute : ((this : MediaStreamTrack, ev: Event ) =>  any ) | null    onunmute : ((this : MediaStreamTrack, ev: Event ) =>  any ) | null  } declare  var  MediaStreamTrack : {  prototype : MediaStreamTrack  } interface  MediaStreamTrackEvent  extends  Event  {  readonly  track : MediaStreamTrack  } declare  var  MediaStreamTrackEvent : {  prototype : MediaStreamTrackEvent    new (type : string , eventInitDict : MediaStreamTrackEventInit ): MediaStreamTrackEvent  } interface  MediaStreamTrackEventInit  extends  EventInit  {  track : MediaStreamTrack  } type  MediaDeviceKind  = 'audioinput'  | 'audiooutput'  | 'videoinput' interface  MediaTrackCapabilities  {  aspectRatio?: DoubleRange    autoGainControl?: boolean []   channelCount?: ULongRange    deviceId?: string    displaySurface?: string    echoCancellation?: boolean []   facingMode?: string []   frameRate?: DoubleRange    groupId?: string    height?: ULongRange    noiseSuppression?: boolean []   sampleRate?: ULongRange    sampleSize?: ULongRange    width?: ULongRange  } interface  MediaTrackSupportedConstraints  {  aspectRatio?: boolean    autoGainControl?: boolean    channelCount?: boolean    deviceId?: boolean    displaySurface?: boolean    echoCancellation?: boolean    facingMode?: boolean    frameRate?: boolean    groupId?: boolean    height?: boolean    noiseSuppression?: boolean    sampleRate?: boolean    sampleSize?: boolean    width?: boolean  } interface  MediaStreamConstraints  {  audio?: boolean  | MediaTrackConstraints    peerIdentity?: string    preferCurrentTab?: boolean    video?: boolean  | MediaTrackConstraints  } interface  MediaTrackConstraintSet  {  aspectRatio?: ConstrainDouble    autoGainControl?: ConstrainBoolean    channelCount?: ConstrainULong    deviceId?: ConstrainDOMString    displaySurface?: ConstrainDOMString    echoCancellation?: ConstrainBoolean    facingMode?: ConstrainDOMString    frameRate?: ConstrainDouble    groupId?: ConstrainDOMString    height?: ConstrainULong    noiseSuppression?: ConstrainBoolean    sampleRate?: ConstrainULong    sampleSize?: ConstrainULong    width?: ConstrainULong  } interface  MediaTrackConstraints  extends  MediaTrackConstraintSet  {  advanced?: MediaTrackConstraintSet [] } interface  MediaTrackSettings  {  aspectRatio?: number    autoGainControl?: boolean    channelCount?: number    deviceId?: string    displaySurface?: string    echoCancellation?: boolean    facingMode?: string    frameRate?: number    groupId?: string    height?: number    noiseSuppression?: boolean    sampleRate?: number    sampleSize?: number    width?: number  } 
 
链接