![](/img/trans.png)
[英]How to write/pipe to a virtual webcam created by V4L2loopback module?
[英]How to change mjpeg to yuyv422 from a webcam to a v4l2loopback?
背景故事:我使用的一個直播網站不夠智能,無法檢測我的網絡攝像頭(Logitech Brio,4k)的功能,而是使用默認的每秒幀數設置,即 5fps。
(答案中的完整解決方案演練)
我能想到的最佳解決方案(除了更改直播提供商之外)是使用 v4l2loopback 創建一個環回虛擬網絡攝像頭,我可以強制使用我想在該直播網站上使用的確切設置。
對於 brio,更高的幀率來自 mjpeg,而不是默認的 yuyv。
問題1:
我可以很容易地閱讀 mjpeg,但不幸的是我的頭一直撞在牆上,因為 v4l2loopback 顯然只想要 yuyv。
我試過這樣的事情:
ffmpeg -f v4l2 \
-input_format mjpeg \
-framerate 30 \
-video_size 1280x720 \
-i /dev/video0 \
-vcodec copy \
-f v4l2 /dev/video6
和
ffmpeg -f v4l2 \
-input_format mjpeg \
-framerate 30 \
-video_size 1280x720 \
-i /dev/video0 \
-vcodec yuyv422 \ # this line changed (even tried "copy")
-f v4l2 /dev/video6
但他們不會工作。 我收到如下錯誤:
與 yuvj422p 等效的未知 V4L2 像素格式
和
...使用過時的像素格式,請確保您正確設置了范圍...
...V4L2 輸出設備僅支持單個原始視頻流...
最終我得到了這個工作:
ffmpeg -f v4l2 \
-input_format mjpeg \
-framerate 30 \
-video_size 1280x720 \
-i /dev/video0 \
-pix_fmt yuyv422 \ # The winning entry
-f v4l2 /dev/video6
問題二
下一個問題是讓 chrome 看到虛擬網絡攝像頭。 它與 guvcview 一起工作正常,在 firefox 上我可以使用網絡攝像頭測試站點,它可以毫無問題地選擇虛擬攝像頭。
事實證明,谷歌出於過度保護的性質(順便說一句,它正在竊取我們所有的數據),不想使用可以讀取和寫入的網絡攝像頭。
因此,在啟動 v4l2loopback 時,您必須告訴它向 chrome 等消費者宣布它是“只讀的”。
這是我使用的確切 modprobe 有效:
sudo modprobe v4l2loopback devices=1 exclusive_caps=1
確切的解決方案。
1. 找出哪個網絡攝像頭是正確的輸入網絡攝像頭
使用v4l2-ctl
列出所有網絡攝像頭:
v4l2-ctl --list-devices
我的輸出是這樣的(你的會有所不同,我會以我的為例):
Logitech BRIO (usb-0000:00:14.0-5.2):
/dev/video0
/dev/video1
HP HD Camera: HP HD Camera (usb-0000:00:14.0-9):
/dev/video2
/dev/video3
/dev/video4
/dev/video5
在這種情況下,我的 brio 是 video0。
2.啟動v4l2loopback:
sudo modprobe v4l2loopback devices=1 exclusive_caps=1
3. 確認您的環回設備:
v4l2-ctl --list-devices
我的現在顯示了這一點,表明 video6 是環回:
Dummy video device (0x0000) (platform:v4l2loopback-000):
/dev/video6
Logitech BRIO (usb-0000:00:14.0-5.2):
/dev/video0
/dev/video1
HP HD Camera: HP HD Camera (usb-0000:00:14.0-9):
/dev/video2
/dev/video3
/dev/video4
/dev/video5
4. 確定您的最佳輸入設置
使用 guvcview 找出哪個編解碼器為您提供了您正在尋找的分辨率和幀率(您可能必須使用菜單 -> 視頻 -> 視頻編解碼器 -> 原始相機輸入)。
我使用 mjpeg 得到了 60fps,我只需要 30。默認的 yuyv 給出了一個悲慘的 5fps。
現在使用 ffmpeg 列出相機的功能並獲取匹配的編解碼器:
ffmpeg -f v4l2 -list_formats all -i /dev/video0 #use your camera here from step 2
在輸出中,您將看到如下內容:
[video4linux2,v4l2 @ 0x55f1a4e989c0] Raw : yuyv422 : YUYV 4:2:2 : 640x480 160x120 176x144 320x180 320x240 352x288 340x340 424x240 440x440 480x270 640x360 800x448 800x600 848x480 960x540 1024x576 1280x720 1600x896 1920x1080
[video4linux2,v4l2 @ 0x55f1a4e989c0] Compressed: mjpeg : Motion-JPEG : 640x480 160x120 176x144 320x180 320x240 352x288 424x240 480x270 640x360 800x448 800x600 848x480 960x540 1024x576 1280x720 1600x896 1920x1080
在我的例子中,在 guvcview 中給出最佳輸出的是 mjpeg,這就是編解碼器的確切名稱(如上所示)。
5. 使用該輸入編解碼器啟動 ffmpeg 並將像素格式更改為 yuyv:
ffmpeg -f v4l2 \
-input_format mjpeg \
-framerate 30 \
-video_size 1280x720 \
-i /dev/video0 \
-pix_fmt yuyv422 \
-f v4l2 /dev/video6
將視頻大小更新為您的直播/視頻記錄將支持的最大大小,只要您的相機也支持它。
現在當你想直播時,只需使用標有“Dummy”的攝像頭
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.