视频采集模块在WebRTC框架中负责从视频源中采集视频数据,发送到本地显示模块和编码模块进行处理。视频源除了常见的摄像头,也可以是桌面抓屏或者窗口抓屏,或者一个视频文件。视频采集模块是平台相关的,MacOS和IOS平台一般使用AVFoundation框架, Linux平台一般使用V4L2库,Windows平台则使用MediaFoundation库。
1. 视频采集模块的实现
WebRTC的视频采集模块源代码分布在 \src\webrtc\modules\video_capture目录下,分为平台无关部分和平台相关部分:平台无关部分定义了视频采集的通用接口,如StartCapture() / StopCapture() / RegisterCaptureDataCallback() / DeRegisterCaptureDataCallback(),后者则在不同平台上实现了这些接口。
WebRTC的视频采集模块UML类图如下:
视频采集模块的虚基类为VideoCaptureModule, 它定义了一系列视频采集的通用接口函数, StartCapture() 和StopCapture用来开始和结束视频采集;RegisterCaptureDataCallback() 和DeRegisterCaptureDataCallback()用来注册和注销数据回调模块,数据回调模块用来把视频数据向上层模块推送。视频采集模块采用WebRTC的通用模块机制,因此它继承自Module类,用来完成通用的模块操作。
VideoCaptureImpl类是VideoCaptureModule的实现,它实现父类定义的通用平台无关的接口。对于平台相关接口,则留在平台相关的子类中实现。该类定义了一系列工厂方法来创建平台相关的具体子类。在Linux平台上实现的子类是VideoCaptureModuleV4L2。
VideoCaptureModuleV4L2采用V4L2库实现视频采集功能,采集到的数据通过ioctl(_deviceFd, VIDIOC_DQBUF, &buf)接口导出,由IncomingFrame()函数向上传递到VideoCaptureImpl::IncomingFrame()进行下一步处理。
详细的代码跳转流程如下:
2.视频数据的建立