視頻都是通過(guò)平臺(tái)系統(tǒng)提供的API來(lái)實(shí)現(xiàn)視頻采集,對(duì)于TSINGSEE青犀視頻正在開(kāi)發(fā)的webrtc項(xiàng)目來(lái)說(shuō),也有一套標(biāo)準(zhǔn)。
Webrtc windows的視頻采集有一套抽象函數(shù):webrtc::VideoCaptureModule。函數(shù)在其中定義了啟動(dòng)采集和啟動(dòng)時(shí)設(shè)置的各種參數(shù),并且視頻數(shù)據(jù)調(diào)用的接口;內(nèi)部其實(shí)還有個(gè)DeviceInfo函數(shù)類,定義來(lái)獲取各種相機(jī)設(shè)備信息的接口。
Webrtc中有很多的函數(shù)繼承;webrtc::VideoCaptureModule::VideoCaptureImpl是webrtc::VideoCaptureModule的子類,其中是和DeviceInfo的二個(gè)接口配合使用,而這二個(gè)接口函數(shù)的實(shí)現(xiàn)都和平臺(tái)相關(guān)。
Windows平臺(tái)相關(guān)的邏輯在VideoCaptureImpl的子類中實(shí)現(xiàn)。Windows平臺(tái)的實(shí)現(xiàn)是webrtc::VideoCaptureModule::VideoCaptureDS代碼中,利用DirectShow實(shí)現(xiàn)視頻采集功能。
VideoCaptureModule的基本使用相關(guān)代碼可以參照webrtc自帶的測(cè)試代碼(test/vcm_capturer.cc)中的部分代碼:
代碼基本流程為:
A、首先調(diào)用VideoCaptureFactory::CreateDeviceInfo來(lái)創(chuàng)建DeviceInfo對(duì)象
B、再次調(diào)用m_deviceInfo->GetDeviceName來(lái)獲取設(shè)備的唯一標(biāo)識(shí)
C、調(diào)用VideoCaptureFactory::Create來(lái)創(chuàng)建,使用deviceUTF8創(chuàng)建VideoCaptureModule對(duì)象
D、調(diào)用m_vcm->RegisterCaptureDataCallback設(shè)置視頻數(shù)據(jù)的回調(diào)
E、采集的參數(shù)(如寬高等信息)設(shè)置到VideoCapture對(duì)象中去
F、最后調(diào)用m_vcm->StartCapture啟動(dòng)采集
視頻數(shù)據(jù)采集之后,將數(shù)據(jù)通過(guò)OnFrame回調(diào)拋出,視頻數(shù)據(jù)封裝在VideoFrame中,之后可以進(jìn)行本地預(yù)覽和編碼的發(fā)送到遠(yuǎn)端。
如果停止采集,其實(shí)也很簡(jiǎn)單,只需要調(diào)用m_vcm->StopCapture,并釋放m_vcm=nullptr即可,這樣其里面的析構(gòu)函數(shù)中會(huì)進(jìn)行其他的資源釋放操作來(lái)防止內(nèi)泄漏。
本文摘自 :https://blog.51cto.com/t