zoukankan      html  css  js  c++  java
  • 在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,就会发现成功显示了桌面。

  • 相关阅读:
    宿主机无法访问CentOS7上Jenkins服务的解决办法
    415. Add Strings
    367. Valid Perfect Square
    326. Power of Three
    258. Add Digits
    231. Power of Two
    204. Count Primes
    202. Happy Number
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/xl2432/p/13501145.html
Copyright © 2011-2022 走看看