谈谈MediaStream

时间:2024-01-03 18:10:41 买帖  | 投诉/举报

篇首语:本文由小编为大家整理,主要介绍了谈谈MediaStream相关的知识,希望对你有一定的参考价值。

参考技术A MediaStream 是连接 WebRTC API 和底层物理流的中间层,webRTC将音视频经过Vocie / Video engine进行处理后,再通过MediaStream API给暴露给上层使用。

MediaStreamTrack是WebRTC中的基本媒体单位,一个MediaStreamTrack包含一种媒体源(媒体设备或录制内容)返回的单一类型的媒体(如音频,视频)。单个轨道可包含多个频道,如立体声源尽管由多个音频轨道构成,但也可以看作是一个轨道。
WebRTC并不能直接访问或者控制源,对源的一切控制都可以通过轨道控制 MediaTrackConstraints 进行实施。

MediaStreamTrack MDN文档
MediaTrackConstraints MDN文档

MediaStream是MediaStreamTrack的合集,可以包含 >=0 个 MediaStreamTrack。MediaStream能够确保它所包含的所有轨道都是是同时播放的,以及轨道的单一性。

MediaStream MDN文档

再MediaTrack的源码中,MediaTrack都是由对应的source和sink组成的。

浏览器中存在从source到sink的媒体管道,其中source负责生产媒体资源,包括多媒体文件,web资源等静态资源以及麦克风采集的音频,摄像头采集的视频等动态资源。而sink则负责消费source生产媒体资源,也就是通过<img>,<video>,<audio>等媒体标签进行展示,或者是通过RTCPeerConnection将source通过网络传递到远端。RTCPeerConnection可同时扮演source与sink的角色,作为sink,可以将获取的source降低码率,缩放,调整帧率等,然后传递到远端,作为source,将获取的远端码流传递到本地渲染。

source 与sink构成一个MediaTrack,多个MeidaTrack构成MediaStram。

MediaTrackConstraints 描述MediaTrack的功能以及每个功能可以采用的一个或多个值,从而达到选择和控制源的目的。 MediaTrackConstraints 可作为参数传递给 applyConstraints() 以达到控制轨道属性的目的,同时可以通过调 getConstraints() 用来查看最近应用自定义约束。

可将MediaStream对象直接赋值给 HTMLMediaElement 接口的 srcObject 属性。

srcObject MDN文档

可通过调用 MediaDevices.getUserMedia() 来访问本地媒体,调用该方法后浏览器会提示用户给予使用媒体输入的许可,媒体输入会产生一个 MediaStream ,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D转换器等等),也可能是其它轨道类型。

通过 MediaDevices.enumerateDevices() 我们可以得到一个本机可用的媒体输入和输出设备的列表,例如麦克风,摄像机,耳机设备等。

列表中的每个媒体输入都可作为MediaTrackConstraints中对应类型的值,如一个音频设备输入audioDeviceInput可设置为MediaTrackConstraints中audio属性的值

将该constraint值作为参数传入到 MediaDevices.getUserMedia(constraints) 中,便可获得该设备的MediaStream。

MediaDevices.enumerateDevices() MDN文档
MediaDevices.getUserMedia() MDN文档

使用 MediaDevices.getDisplayMedia() 方法,可以提示用户去选择和授权捕获展示的内容或部分内容(如一个窗口),并将录制内容在一个 MediaStream 里。

MediaDevices.getDisplayMedia() MDN文档

使用 HTMLCanvasElement.captureStream() 方法返回的 CanvasCaptureMediaStream 是一个实时捕获的canvas动画流。

HTMLCanvasElement.captureStream() MDN文档
CanvasCaptureMediaStream MDN文档

可通过构造函数 MediaStream() 返回新建的空白的 MediaStream 实例

MediaRecorder MDN文档

以上是关于谈谈MediaStream的主要内容,如果未能解决你的问题,请参考以下文章