webrtc中的Track,MediaChannel,MediaStream

Track,MediaChannel,MediaStream的关系

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

image.png

首先分为了三层:

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

根据本地sdp或sdp的协商结果,来产生MediaChannel,MediaChannel代表一个Video或Audio通道,里面会有多个不同方向的MediaStream。

  1. 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的堆栈

image.png
在产生本地sdp后,就会根据sdp信息来创建VideoChannel

创建VideoStream的堆栈

当协商出的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

相关推荐

  1. React使用WebRTC

    2024-04-15 05:50:04       40 阅读
  2. WebRTC获取当前采集设备deviceId

    2024-04-15 05:50:04       11 阅读
  3. webrtc】AudioSendStream创建

    2024-04-15 05:50:04       30 阅读
  4. webRtc常用方法

    2024-04-15 05:50:04       29 阅读
  5. vue使用webrtc streamer linux

    2024-04-15 05:50:04       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-15 05:50:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-15 05:50:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-15 05:50:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-15 05:50:04       20 阅读

热门阅读

  1. Hive进阶Day05

    2024-04-15 05:50:04       10 阅读
  2. Python将相机图像采集的数据写入Redis

    2024-04-15 05:50:04       14 阅读
  3. hive metastore使用mysql作为backend db遇到的问题

    2024-04-15 05:50:04       14 阅读
  4. 跨域问题 及 解决

    2024-04-15 05:50:04       12 阅读
  5. 从零实现诗词GPT大模型:了解Transformer架构

    2024-04-15 05:50:04       14 阅读
  6. 卡尔曼滤波器使用教程

    2024-04-15 05:50:04       14 阅读
  7. php在apache运行的几种方式

    2024-04-15 05:50:04       13 阅读
  8. CSS的基本结构和用法

    2024-04-15 05:50:04       53 阅读
  9. Unity Android 2022 Release-Notes

    2024-04-15 05:50:04       15 阅读
  10. TensorRT从入门到了解-学习笔记(待续)

    2024-04-15 05:50:04       14 阅读