4

背景故事:我使用的一个直播网站不够智能,无法检测我的网络摄像头(Logitech Brio,4k)的功能,而是只使用默认的每秒帧数设置,即 5fps。

(答案中的完整解决方案演练)

我能想到的最佳解决方案(除了更改直播提供商)是使用 v4l2loopback 创建一个环回虚拟网络摄像头,我可以强制使用我想在该直播网站上使用的确切设置。

对于 brio,更高的帧速率来自 mjpeg,而不是默认的 yuyv。

问题一:

我可以很容易地阅读 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
4

1 回答 1

12

确切的解决方案。

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”的相机

于 2020-01-03T07:53:09.783 回答