WebRTC视频数据流程分析( 二 )


 
“system_wrappers”:包含另一个系统相关的代码的目录,如sleep函数 。SDK主要涉及的是Androic和iOS平台相关的代码,system_wrappers则包含更多平台如windows等相关的代码 。
 
“stats 、logging”:状态统计,日志打印相关的代码 。
“examples”:包含有各个平台的demo,例如Android、iOS、Windows、linux、MacOS等 。
 
目前就我的学习和了解,还没有触及其它的一些目录,不过它们应该也不是主干流程相关的内容 。

WebRTC视频数据流程分析

文章插图
 
本次分享的第一部分我们以《WebRTC Native开发实战》书中第一部分的标题Hello WebRTC来做一个结尾 。
第一章:开发环境的搭建:书中有非常详细的一步步的教程,只要解决了科学上网的问题,按照教程基本上应该不会再遇到其它问题 。
 
第二章:运行官方Demo:主要是刚才提到的examples目录中的各种Demo 。
 
第三章:基本流程分析:这里的基本流程与我们此次分享的内容有些区别,这里的基本流程更多的是如何使用WebRTC的接口,实现简单的1V1的音视频通话,也就是Demo实现的一个功能 。
 
分析方法-如何上手大型项目 
WebRTC视频数据流程分析

文章插图
 
对于个人来说如何尽快上手大型项目?例如WebRTC或者其它的开源项目像FFmpeg、GStreamer等 。包括大家入职新公司,很可能会接手或参与到较大的项目中,虽然可能不都会像WebRTC那么巨大,但还是存在一定的挑战性 。在这里分享一些我的经验,希望能为大家提供些帮助 。
 
首先,第一步就是“跑起来”,只有把相关项目的demo运行起来,以此才能对项目有更加直观的了解,了解其相关功能,以功能实现的位置作为切入点,思考其实现方式、方法 。
 
第二步,“从外部的API入手,顺藤摸瓜” 。例如下图是iOS的代码,首先找到外部的API,如代码中RTCCameraVideoCapture是用来实现相机采集的,然后就可以看类中是如何调用接口和处理数据的 。
WebRTC视频数据流程分析

文章插图
 
第三步“基于基础知识(音频采播系统接口),搜索定位关键函数/类”,第二步例如在Android或者iOS下我们是先找到实现相应功能所需要调用的外部接口,可以根据这些关键的接口在代码中进行搜索发现关键的函数和类 。但不是所有的逻辑都会有外部Web接口,例如WebRTC中音频相关的实现就是不需要调用任何接口的 。下图是一个iOS的例子,对于音频播放最关键的函数是AudioOutputUnitStart,即开启一个Audio Unit 。我们在搜索后可以找到voice_processing_audio_unit.m文件,其中包含的一个Start函数,我们就可以进一步观察函数以及头文件有哪些接口,例如初始化start、stop等,音频就可以从这里进行外扩或阅读源码 。
WebRTC视频数据流程分析

文章插图
 
第四步“静态阅读源码+单步调试” 。静态阅读源码主要是利用IDE的代码跳转,但是gn其生成exXcode工程文件的方式有一些特殊,很多代码跳转会跳不过去或者跳转到错误地方 。所以更多的时候我还是使用全局搜代码,尽管效率稍低,但目前没有其它更合适的办法 。单步调试,在代码中的某些位置,我们希望了解其下一步是如何跳转的,而代码无法直接跳转,搜索的结果也并不知道是什么作用无法准确判断,这时我们可以通过加断点进行验证 。
WebRTC视频数据流程分析

文章插图
 
如图所示,是视频编码相关的一个类的函数,在加入断点后,我们可以观察到视频数据是如何从系统的回调接口到采集RTCCameraVideoCapture的类再一步步到编码的类,非常清晰 。
在软件开发中,没有银弹,都是那些看似朴实无华但往往非常有效的办法,掌握这些方法后,再上手一些新的项目就会有一些帮助 。
视频流程介绍 
WebRTC视频数据流程分析

文章插图
 
WebRTC的视频数据流程在各个平台基本上都是一致的 。
 
视频数据首先由VideoCapturer采集,然后交给VideoSource,通过其中的VideoBroadcaster传输给接收对象,例如Encoder、Preview等 。Preview负责进行本地预览,Encoder负责编码发送 。从网络层接收到数据之后,首先会通过VideoDecoder进行解码,接下来同样会将其传输VideoBroadcaster,再分发给数据的接收方 。VideoSource在上图中未体现,但也是一个比较关键的类,它位于VideoTrack和VideoBroadcaster中间,其实是对VideoBroadcaster接口的封装 。


推荐阅读