webrtc中的Track,MediaChannel,MediaStream
文章目录
Track,MediaChannel,MediaStream的关系
Audio/Video track,MediaChannel,MediaStream是Webrtc的业务核心,对媒体的操作都是围绕着这三个对象进行,弄清出它们见的关系及作用,就等于弄清了Webrtc的骨架,对阅读Webrtc的代码大有益处。先看下面一张图:

三层结构:
将这些关系归纳为三层结构,分别如下:
- Session层,即对外的接口层
- Track就在这层中,对应的类为
VideoTrack和AudiTrack,代表了视频和音频的源。 - 通过
PeerConnectionFactoryInterface的CreateVideoTrack和CreateAudioTrack来创建。 - 通过
PeerConnectionInterface的AddTrack加入到pc对象中。 - 这些Track最终会体现在本地的sdp中。
- MediaEngine层
根据本地sdp或sdp的协商结果,来产生MediaChannel。
MediaChannel代表一个Video或Audio通道,它里面会有多个不同方向的stream。
- Call层
Call中也管理着一种stream,但它与MediaEngine层的stream不同,它直接与媒体处理相关(编解码)。
两种stream:
每一层都Stream的概念。本质上是分成了两种不同Stream,分别是Session层的stream,称为MediaStream。MediaEngine中的stream,如WebRtcAudioSendStream/ReceiveStream。
Call层中的stream是属于MediaEngine中stream的成员变量,通过它与音视频编解码器打交到。
下面都以Video的Send方向(encoder)说明MediaStream的创建流程及参数设置体系,AudioSendStream及Video/AudioReciveStream与它的流程基本相同。
创建流程
创建VideoChannel的堆栈
VideoChannel属于MediaEngine层

在产生本地sdp后,就会根据sdp信息来创建VideoChannel。
创建VideoSendStream的堆栈
VideoSendStream 属于call层,封装视频编码,sdp中视频编码的信息最终都会设置到VideoSendStream 中去。
当协商出的sdp中video的方向属性有send时,则会创建VideoSendStream。
- 在收到对端的sdp后,调用
SetRemoteDescription方法,开始sdp解析及channel,stream,encoder的创建过程,如下两个堆栈。


- 最终以创建video encoder为目标,
VideoStreamEncoder就是video encoder的封装类。

从这个堆栈图中也可以看到channel, call, stream的一层层的关系。
一个pc对象可以有多个VideoTrack,那么每个VideoTrack最终会产生VideoEncoder(如果设置了send方向),所以一个pc对象中可能会有多个编码器。
sdp中媒体参数信息的映射
sdp中媒体信息
一个stream的信息包括如下信息:
- ssrc
- codec name
- codec payload type
- media ssrc
- codec rtx payload type
- rtx ssrc
- codec fec payload type
- nack
- rtp header extension
- codec encoder info
- rtcp info
这些信息最终会分别变成为编/解码器的参数(codec name,codec payload type),重传流(rtx)的信息,rtp包的信息(rtp header extension),rtcp包的信息。每个stream的信息不一定相同,取决于sdp的具体协商结果。
参数设置体系
sdp中的媒体信息需要转化为具体的编解码器,rtp流的信息。
参数设置流程

参数设置的流程跟stream的创建流程一致。
参数映射体系
下面的一张体系图显示了sdp中的video媒体信息是如何转化为video stream的参数核心结构
- 标蓝色的为session层的sdp信息。
- 绿色的为编码的参数体系。
- 红色的为传输的参数体系。

更多推荐



所有评论(0)