在做webrtc測試時,會發現它提供的peerconnection_client
是抓取攝像頭畫面的,在沒有攝像頭的機器上,它是不會傳輸視頻數據的。這對於想在我的Linux台式機上調試webrtc代碼不大方便。
實際上,在src/modules/video_capture/linux/device_info_linux.cc
上可以看到,webrtc是去讀/dev/video*
設備文件來獲取攝像頭畫面的:
uint32_t DeviceInfoLinux::NumberOfDevices() {
RTC_LOG(LS_INFO) << __FUNCTION__;
uint32_t count = 0;
char device[20];
int fd = -1;
/* detect /dev/video [0-63]VideoCaptureModule entries */
for (int n = 0; n < 64; n++) {
sprintf(device, "/dev/video%d", n);
if ((fd = open(device, O_RDONLY)) != -1) {
close(fd);
count++;
}
}
return count;
}
因此我們可以利用v4l2loopback
模擬攝像頭,利用ffmpeg
將桌面數據發送給/dev/video0
設備來假冒一個攝像頭。
首選,如果機器上沒有安裝ffmpeg,可以先安裝一個默認版本的ffmpeg:
sudo apt install ffmpeg
然后我們安裝和配置v4l2loopback內核模塊。
先去github拉取v4l2loopback代碼:
git clone https://github.com/umlaeute/v4l2loopback.git
然后進入代碼目錄,根據README中的安裝指南進行安裝和加載:
# 編譯和安裝
make && sudo make install
sudo depmod -a
# 加載到內核
sudo modprobe v4l2loopback
然后,我們就可以發現沒有攝像頭設備的機器上出現了/dev/video0
(攝像頭設備通常在文件系統的/dev/video*
,如果已經有攝像頭設備,那么v4l2loopback映射的設備編號可能不是0,這個需要大家自己去確認)。
利用ffmpeg將桌面截屏推流到/dev/video0
設備:
ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0
如此就相當於有了一個攝像頭了,這時候我們再去運行webrt的peerconnection_client
,就會發現成功顯示了桌面。