文章目录
- Track,MediaChannel,MediaStream的关系
- MediaStream的创建流程
- 创建VideoChannel的堆栈
- 创建VideoStream的堆栈
- sdp中媒体参数信息的映射
- sdp中媒体信息
- 参数设置体系
- 参数设置流程
- 参数映射体系
Track,MediaChannel,MediaStream的关系
Audio/Video track,MediaChannel,MediaStream是Webrtc的业务核心,对媒体的操作都是围绕着这三个对象进行,弄清出它们见的关系及作用,就等于弄清了Webrtc的骨架,对阅读Webrtc的代码大有益处。先看下面一张图:
首先分为了三层:
- Session层,即对外的接口层
- Track就在这层中,对应的类为
VideoTrack
和AudiTrack
,代表了视频和音频的源。 - 通过
PeerConnectionFactoryInterface
的CreateVideoTrack
和CreateAudioTrack
来创建。 - 通过
PeerConnectionInterface
的AddTrack
加入到pc对象中。 - 这些Track最终会体现在本地的sdp中。
- MediaEngine层,MediaChannel在这一层
根据本地sdp或sdp的协商结果,来产生MediaChannel,MediaChannel代表一个Video或Audio通道,里面会有多个不同方向的MediaStream。
- Call层,MediaStream在这一层
它管理MediaStream,MediaStream就是具体的某一个方向的Video或Audio流。这些Stream属于最底层,直接与编解码器打交道。
Session层中的Track与MediaEngine层中的channel对应,channel中包含多个不同方向的stream。
Call是每个pc对象都包含一个,其中stream是与编解码相关的。
一次SDP的协商最终成果就是产生或更新MediaStream对象。
下面都以Video的Send方向(encoder)说明MediaStream的创建流程及参数设置体系,AudioSendStream及Video/AudioReciveStream与它的流程基本相同。
MediaStream的创建流程
创建VideoChannel的堆栈
在产生本地sdp后,就会根据sdp信息来创建VideoChannel
。
创建VideoStream的堆栈
当协商出的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信息。
- 绿色的为编码的参数体系。
- 红色的为传输的参数体系。