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


WebRTC视频数据流程分析

文章插图
 
要回答从哪里拿数据这个问题,首先需要对视频数据流程有一定了解,也就是前面第三部分所介绍的内容 。如上图红框所示,VideoSendStreamlmpl::OnEncodedimage中已经接收了编码后的视频数据,但其数据存在形式还是完整一帧,并没有拆分成一个一个的RTP包 。接收端情况比较复杂,在网络传输时会出现乱序到达、丢包缺失等问题,造成网络数据的不可用 。因此,我们需要找到一个已经对上述问题进行过处理的数据点,即解码之前的数据点,VidioReceiveStream的HandleEncodedFrame函数中 。
 
当我们找到数据接入点后,需要进行的操作就是修改代码,增加API,实现相关功能 。如在Android和iOS上希望有Java或Object C的接口暴露出来供APP层调用 。想要修改iOS接口,就需要修改SDK目录下的代码 。
WebRTC视频数据流程分析

文章插图
 
举例如图所示,我们需要修改RTCPeerConnection文件,其中所定义为WebRTC的主类 。增加Start/StopRecoder的接口,通过dir的参数表明想要录制视频的方向(发送或者接收) 。
WebRTC视频数据流程分析

文章插图
 
SDK仅为C++接口的boinunding,因此还需要修改API目录里面的C++接口,即修改peer_connection_interface.h,为C++的PC类增加接口 。
WebRTC视频数据流程分析

文章插图
 
API里面只是程序接口,我们需要修改程序的实现类,实现类主要在pc中,但这里有一点特殊的是,业务流程和实现逻辑,call中也是很重要的一部分 。
 
如图所示,它是对api/peer_connection_interface的一个子类,一个具体集成的实现类,我们为其增加接口,但是在这里我们不在peer_connection_interface的类中调用录制相关的代码,而是在call里进行修改 。
WebRTC视频数据流程分析

文章插图
 
前面我们介绍到的VideoSendStream和VideoReceiveStream以及本次没有介绍到的VAideo相关的类,其实例的管理都在call对象里 。在我理解,在以前WebRTC的概念模型中,主类其实是一个Call,而pPeercConnection是在后续标准化过程中所定义的接口 。所以实际的视频录制调用功能被封装成一个Recorder类,Recorder类的管理都会放在call里面,修改pc peer connection以及call的头文件 。
 
完成上述操作后,下一步就是截取数据 。截取数据的操作其实就是VideoSendStream和VideoReciveStream的函数调用,Recorder的对象在call里面,两种Stream的对象也在call里面,那我们就只需要将Recorder设置给Stream,注入进去即可 。
WebRTC视频数据流程分析

文章插图
 
从call到VideoSendStream有如上图所示的文件需要修改,Call里面有一个Stream接口的定义,然后在video目录下会有call里面定义的Stream接口的子类、实现类,video_send_stream_impl,在OndecodedImage中,将完整的一帧给recorder,再调用FFmpeg的头文件接口即可 。
WebRTC视频数据流程分析

文章插图
 
数据收留端和发送端情况类似,ReceiveStream和SendStream在功能上非常对称,在call目录下也有一个接口定义,在video目录下也有一个接口的实现 。
 
录制相关完整的代码在github上有一个完整的提交,大家可以作为参考 。
(https://github.com/HackWebRTC/webrtc/commit/dfbcd2c75d27dafd24512d6ca3d24c6d86d63b82)




推荐阅读