在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 @   星星,风,阳光  阅读(5610)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
点击右上角即可分享
微信分享提示