簡體   English   中英

如何將 mjpeg 從網絡攝像頭更改為 yuyv422 到 v4l2loopback?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM