在ubuntu上使用v4l2loopback和ffmpeg模拟摄像头

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

posted @ 2020-08-14 11:18  星星,风,阳光  阅读(4454)  评论(0编辑  收藏  举报