在做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
,就会发现成功显示了桌面。