【问题标题】:How to change mjpeg to yuyv422 from a webcam to a v4l2loopback?如何将 mjpeg 从网络摄像头更改为 yuyv422 到 v4l2loopback?
【发布时间】:2020-04-21 19:20:42
【问题描述】:

背景故事:我使用的一个直播网站不够智能,无法检测我的网络摄像头(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

问题 2

下一个问题是让 chrome 查看虚拟网络摄像头。它可以在 guvcview 上正常工作,在 Firefox 上我可以使用网络摄像头测试站点,它会毫无问题地拾取虚拟摄像头。

事实证明,谷歌具有过度保护的性质(顺便说一句,它正在窃取我们所有的数据),不想使用可以读写的网络摄像头。

因此,在启动 v4l2loopback 时,您必须告诉它向 chrome 等消费者宣布它是“只读”的。

这是我使用的确切的 modprobe:

sudo modprobe v4l2loopback devices=1 exclusive_caps=1

【问题讨论】:

    标签: linux ffmpeg live-streaming v4l2 v4l2loopback


    【解决方案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”的摄像头

    【讨论】:

    • 如果您使用GStreamer,您可以通过运行gst-device-monitor-1.0获取设备的功能
    • 对我来说-input_format mjpeg 就足够了,不需要任何形式的环回。但默认情况下,它会选择非常慢的 rawvideo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2012-09-10
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多