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

  • 相关阅读:
    spring源码下载
    java资料共享
    《Linux命令行与shell脚本编程大全》读书笔记
    《微服务设计》读书笔记
    tornado关于AsyncHTTPClient的使用笔记
    java stackoverflowerror与outofmemoryerror区别(转)
    JAVA关于泛型的笔记
    在JAVA中返回类型使用泛型T和Object有什么区别?
    《构架师的12项修炼》读书笔记
    关于控制台输入的代码怎么跑单元测试的问题记录
  • 原文地址:https://www.cnblogs.com/xl2432/p/13501145.html
Copyright © 2020-2023  润新知