webrtc在windows平台上底层是通过调用DirectShow接口来捕捉摄像头的,我们先来看下VideoCapturer的一个简化的类图:
我们在上层使用的是VideoCapturer接口,它的实现类是WebRtcVideoCapturer,而WebRtcVideoCapturer拥有一个VideoCaptureModule对象,它实际上是VideoCaptureDS,从名字可以看出它通过DirectShow接口调用底层。
首先,需要把WebRtcVideoCapturer注册到VideoCaptureImpl中,即类图中的VideoCaptureDataCallback* _dataCallBack,代码如下:
WebRtcVideoCapturer::Start(const VideoFormat& capture_format) {
//////省略
module_->RegisterCaptureDataCallback(*this); //将自己注册到VideoCaptureImpl
//////
}
然后,当摄像头一帧图像数据准备好时,会调用VideoCaptureImpl的IncomingFrame(uint8_t* videoFrame),具体实现涉及到DirectShow接口,先不管。接下来的流程图如下:
注意图中SignalFrameCaptured是使用信号与槽机制跳转到OnFrameCaptured的,它们连接的代码在VideoCapturer的构造函数中, 如下:
void VideoCapturer::Construct() {
前后省略...
SignalFrameCaptured.connect(this, &VideoCapturer::OnFrameCaptured);
///
}