2021年5月16日 星期日

Linux : 虛擬 Webcam : v4l2loopback 加 GStreamer

2021年5月16日 星期日
在「雄 : Android : 手機變電腦的 Webcam : IP Camera Adapter」中提到在 Windows 中除了可以用 OBS 的虛擬相機,另一個選擇是用 IP Camera Adapter;那在 Linux 還有什麼選擇呢?其實應該是有更多的方案,本篇來玩玩 v4l2loopbackGStreamer,由 v4l2loopback 建立虛擬 Webcam,而由 GStreamer 抓取 IP Webcam 所提供的 Android 手機鏡頭拍到的 MJPEG 串流,變成電腦的 Webcam。

先在 Linux 上安裝好 v4l2loopback-dkms 跟 GStreamer,接著就可以來玩玩虛擬 Webcam 了。

Google Meet : 設定 : 攝影機


建立虛擬的 Webcam 裝置

利用 v4l2loopback ,可以幫我們在 Linux 系統中建立一個虛擬的 Webcam,它的詳細操作可以參考專案上的說明:
先開一個終端機,然後以底下的指令來建立虛擬的 Webcam :

sudo modprobe v4l2loopback devices=1 card_label="v4l2 Visual Webcam" exclusive_caps=1

簡單的說明一下各參數:
  • devices=1  : 建立一個虛擬的影像裝置
  • card_label="v4l2 Visual Webcam"  : 將裝置的名稱設定為引號中的字串,主要是方便我們識別。如果沒有設定名稱,可能是類似這樣的名稱 "Dummy video device (0x0000)"
  • exclusive_caps=1 : 啟用 "exclusive_caps" 的選項,這樣才能讓 Chrome 看得到我們新增的虛擬裝置。詳情請參考原專案中的說明。
那新增裝置的 devices ID 是什麼?哈!這個問題太重要了,像我的筆電本來就有 Webcam 了 (/dev/video0),所以 v4l2loopback 的 device ID 就變成 /dev/video1。

如果想自己指定 device ID,那前面的參數就將 devices=1 改為 video_nr="xxxx"。例如:

sudo modprobe v4l2loopback video_nr=3 card_label="v4l2 Visual Webcam" exclusive_caps=1

執行完上面的指令,新增的裝置代號就變成 /dev/video3

那如何移除 v4l2loopback 呢?

sudo modprobe -r v4l2loopback

 GStreamer 抓取 MJPEG 串流

假設已經利用 v4l2loopback 建好的虛擬 Webcam ,裝置 ID 為 /dev/video1,我們就可以利用 GStreamer 來抓取手機上的 MJPEG 串流 (以 Android IP Webcam 為例,假設網址是 http://192.168.2.109:8080/videofeed )。

Android IP Webcam 的畫面


先執行底下的指令,讓手機的畫在電腦上顯示看看:

gst-launch-1.0 souphttpsrc location=http://192.168.2.109:8080/videofeed ! jpegdec ! videoconvert ! autovideosink

如果看得到手機的畫面,我們就可以準備將畫面餵給 v4l2loopback 所建立的虛擬裝置 /dev/video1 了,執行:

gst-launch-1.0 souphttpsrc location=http://192.168.2.109:8080/videofeed ! jpegdec ! videoconvert ! v4l2sink device=/dev/video1

前面兩道指令的差別在輸出的目的地不同:
  • ! autovideosink : 是顯示在電腦的畫面中。
  • ! v4l2sink device=/dev/video1 : 是輸出給 v4l2loopback 所建立的虛擬 Webcam /dev/video1

如果在確定都設定好了,在網頁瀏覽器仍然看不到 v4l2loopback 所建立的裝置,記得按重新整理,甚至關閉後重新開啟瀏覽器再試。




沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket