首页 > WebRTC > WebRTC研究:MediaStream相关概念
2019
10-22

WebRTC研究:MediaStream相关概念

根据W3C的WebRTC 1.0: Real-time Communication Between Browsers规范,WebRTC的源码中定义了两套主要的C++接口,分别是MediaStreamPeerConnection相关的API。本篇文章主要介绍下MediaStream API中一些概念,方便理解内部代码如何处理。

MediaStream 相关API定义在源码src\api\media_stream_interface.h中。里面主要涉及这4个概念:sourcesinkmeidatrackmediastream

source与sink

在浏览器中,存在source到sink的媒体管道,source生产媒体资源的,sink负责消费。传统的source一般是些静态资源,例如文件,以及web资源,不随时间改变。对于我们的WebRTC来说,source是动态资源,例如麦克风采集的音频,相机采集的视频,随时间而改变。sink的工作就是将这些source呈现给用户。sink可以是<img><video><audio>这些标签,用于本地渲染,也可以是RTCPeerConnection,将source通过网络传递到远端。在网络流传输中,RTCPeerConnection可同时扮演source与sink的角色,作为sink,可以将获取的source降低码率,缩放,调整帧率等,然后传递到远端,作为source,将获取的远端码流传递到本地渲染。

下面我们以video source举例,说下WebRTC源码中,source与sink定义。

在源码src\api\video\video_source_interface.h中,video source定义如下:

source可以添加、移除、更新sink,从而将VideoFrame送给对应的sink处理,一个source可对应多个sink。

在src\api\video\video_sink_interface.h中,video sink定义如下:

MediaStreamTrack与MediaStream

MediaStream API中有两个重要组成:MediaStreamTrack以及MediaStreamMediaStreamTrack对象代表单一类型的媒体流,产生自客户端的media source,可以是音频或者视频,但只能是其中一种,是音频称作audio track,视频的话称作video track,这其实就是我们平时所说的音轨与视频轨。source给track提供数据。

MeidiaStream用于将多个MediaStreamTrack对象打包到一起。一个MediaStream可包含audio trackvideo track。类似我们平时的多媒体文件,可包含音频与视频。

一个MediaStream对象包含0或多个MediaStreamTrack对象。MediaStream中的所有MediaStreamTrack对象在渲染时必须同步。就像我们平时播放媒体文件时,音视频的同步。

在WebRTC源码src\api\media_stream_interface.h中,MediaStream定义如下:

MediaStream可以添加移除audio track以及video track。

下面说下MediaTrack的定义,这里我们举例VideoTrack,代码同样位于src\api\media_stream_interface.h中。

这里的VideoTrack包含video source与video sink。

src\pc\video_track.cc中,我们看下MediaTrack接口的一些具体实现:

VideoTrack的sink操作,其实就是对source进行操作,让source操作相应的track。

示例

为了更好地理解上述概念,我们举个例子说明。下图home client中,摄像机产生视频video source。source的宽高设置分别是800以及600像素。home client 中三个MediaStream包含的track使用该摄像机视频作为source,此时就有三个video track了。三个video track分别连接三个不同的sink:<video>标签A,<video>标签B以及一个peer connection C。<video>A与<video>B分别对source的视频进行缩放处理后渲染到本地浏览器界面中。peer connection C作为sink把该video source 推流到remote client。在remote client,两个media stream使用peer connection作为source,连接到两个<video>sink(Y与Z),进行本地渲染。
WebRTC研究:MediaStream相关概念 - 第1张  | 剑痴乎

参考

[1] Media Capture and Streams.https://www.w3.org/TR/mediacapture-streams/.
[2] WebRTC 1.0: Real-time Communication Between Browsers.http://w3c.github.io/webrtc-pc/.

最后编辑:
作者:Jeff
Avatar
管理员——代码为剑,如痴如醉

留下一个回复

你的email不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.