webrtc 音视频数据流向
1.分析思路切入点
音视频的处理过程是一个很典型的流水线形式,如下图所示:
对于一个程序来说,人员应该关注数据结构和数据的流向,这里的数据结构指的是核心的数据模型,是对业务的抽象结构,比如Linux下的进程 task_struct结构体。开发人员要清晰地知道整个程序在生命周期内的数据流向,知道数据在模块之间是怎么流动的,输入前和收入后有什么变化。
基于上面的流程图,本文分析下webrtc中核心的音视频数据流向图,希望可以给读者建立一个webrtc音视频处理过程的初步印象。
2. 音视频处理流程
运行环境是在window下,基于webrtc官方的native demo,只分析视频数据的处理过程,按照webrtc 线程处理数据的功能进行划分。
这张图是来自知乎陈子兴,清晰地概括webrtc中的线程模型,webrtc的各个模块就运行在这些线程中。
2.1 发送端
2.1.1 采集和前处理
独立的视频采集线程,这个线程操作包括通过libyuv进行的一些前处理过程
2.1.2 编码和分包
采集线程处理完的数据,投递到视频编码线程,这个线程的操作包括:
- 视频编码
- 视频帧拆分成RTP包
- 把相关的RTP包信息投递到平滑发送控制模块,这个模块决定什么时候发送数据
2.1.3 平滑处理
平滑发送线程周期性地检测是否把数据可以投递到网络线程发送
2.1.4 网络发送
网络线程发送
2.2 接收端
2.2.1 收流
网络线程接收数据包,投递到 work 线程
2.2.2 jitterbuffer 处理
work 线程收到RTP包数据,进行组帧和帧参考关系判断,投递一个可解码帧给 FrameBuffer。FrameBuffer 由解码线程线程处理。
2.2.4 抖动计算和解码
解码线程进行抖动计算和解码,解码成功后,把YUV数据投递到渲染线程
2.2.5 渲染
渲染线程渲染yuv数据