Track,MediaChannel,MediaStream的关系

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

image.png

三层结构:

将这些关系归纳为三层结构,分别如下:

  1. Session层,即对外的接口层
  • Track就在这层中,对应的类为VideoTrack和AudiTrack,代表了视频和音频的源。
  • 通过PeerConnectionFactoryInterface的CreateVideoTrack和CreateAudioTrack来创建。
  • 通过PeerConnectionInterface的AddTrack加入到pc对象中。
  • 这些Track最终会体现在本地的sdp中。
  1. MediaEngine层

根据本地sdp或sdp的协商结果,来产生MediaChannel。

MediaChannel代表一个Video或Audio通道,它里面会有多个不同方向的stream。

  1. 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层
image.png
在产生本地sdp后,就会根据sdp信息来创建VideoChannel。

创建VideoSendStream的堆栈

VideoSendStream 属于call层,封装视频编码,sdp中视频编码的信息最终都会设置到VideoSendStream 中去。

当协商出的sdp中video的方向属性有send时,则会创建VideoSendStream。

  1. 在收到对端的sdp后,调用SetRemoteDescription方法,开始sdp解析及channel,stream,encoder的创建过程,如下两个堆栈。

image.png

image.png

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

image.png

从这个堆栈图中也可以看到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流的信息。

参数设置流程

设置编码参数的调用栈.jpg
参数设置的流程跟stream的创建流程一致。

参数映射体系

下面的一张体系图显示了sdp中的video媒体信息是如何转化为video stream的参数核心结构

  • 标蓝色的为session层的sdp信息。
  • 绿色的为编码的参数体系。
  • 红色的为传输的参数体系。

VideoSendStream参数设置体系.png

更多推荐