• ubuntu 虚拟摄像头 模拟摄像头 virtualCam


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

  • 相关阅读:
    private SortedDictionary<string, object> Dic_values = new SortedDictionary<string, object>();
    [Luogu 2817]宋荣子的城堡
    [测试题]等效集合
    [SDOI 2009]HH去散步
    [HNOI 2013]比赛
    [SCOI 2016]背单词
    [测试题]圆圈
    [Luogu 3389]【模板】高斯消元法
    [Codeforces 505C]Mr. Kitayuta, the Treasure Hunter
    [Codeforces 448C]Painting Fence
  • 原文地址:https://www.cnblogs.com/bigben0123/p/14143742.html
Copyright © 2020-2023  润新知