媒体捕获和约束
WebRTC的媒体部分包括如何访问能够捕获视频和音频的硬件,如相机和麦克风,以及媒体流的工作方式。它还包括显示媒体,这就是应用程序如何进行屏幕捕获。
媒体设备
浏览器支持的所有摄像头和麦克风都可以通过navigator.mediaDevices对象访问和管理。应用程序可以检索已连接设备的当前列表,也可以侦听更改,因为许多相机和microhpone都通过USB连接,并且可以在应用程序的生命周期内进行连接和断开连接。由于媒体设备的状态可以随时更改,建议应用程序注册设备更改以正确处理更改。
约束
在访问媒体设备时,最好提供尽可能详细的约束。虽然可以通过简单的限制打开默认的摄像头和麦克风,但它可能会提供一个远不是最适合应用程序的媒体流。
特定约束在MediaTrackConstraint对象中定义,一个用于音频,另一个用于视频。此对象中的属性类型为ConstraintLong、ConstraintBoolean、ConstraintDouble或ConstraintDOMString。它们可以是特定值(例如,数字、布尔值或字符串)、范围(具有最小值和最大值的LongRange或DoubleRange)或具有理想或精确定义的对象。对于特定值,浏览器将尝试选择尽可能接近的对象。对于某个范围,将使用该范围内的最佳值。如果指定了精确,则只返回与该约束完全匹配的媒体流。
要确定媒体流的某个轨道的实际配置,我们可以调用MediaStreamTrack.getSettings(),它返回当前应用的MediaTrackSettings。
通过调用音轨上的applyConstraints(),也可以从我们打开的媒体设备更新音轨的约束。这允许应用程序重新配置媒体设备,而无需首先关闭现有流。
显示媒体
想要执行屏幕捕获和录制的应用程序必须使用显示媒体API。getDisplayMedia()函数(它是navigator.mediaDevices的一部分)类似于getUserMedia(),用于打开显示内容(或显示内容的一部分,如窗口)。返回的MediaStream与使用getUserMedia()时的工作方式相同。
getDisplayMedia()的约束与用于常规视频或音频输入的约束不同。
{
video: {
cursor: 'always' | 'motion' | 'never',
displaySurface: 'application' | 'browser' | 'monitor' | 'window'
}
}
上面的代码截图显示了屏幕录制的特殊约束是如何工作的。请注意,并非所有支持显示媒体的浏览器都支持这些功能。
流和轨道
MediaStream表示媒体内容流,由音频和视频的音轨(MediaStreamTrack)组成。您可以通过调用MediaStream.getTracks()从MediaStream中检索所有曲目,该方法返回MediaStreamTrack对象的数组。
媒体流跟踪
MediaStreamTrack的种类属性是音频或视频,表示它所代表的媒体种类。每个轨迹都可以通过切换其启用的属性来禁用。轨道有一个布尔属性remote,该属性指示它是否由RTCPeerConnection来源并来自远程对等体。