在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,就會發現成功顯示了桌面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM