Linux 如何将mjpeg从网络摄像头更改为yuyv422到v4l2loopback?

Linux 如何将mjpeg从网络摄像头更改为yuyv422到v4l2loopback?,linux,ffmpeg,live-streaming,v4l2,v4l2loopback,Linux,Ffmpeg,Live Streaming,V4l2,V4l2loopback,背景故事:我使用的一个直播网站不够智能,无法检测到我的网络摄像头(Logitech Brio,4k)的功能,而是使用默认的每秒帧数设置,即5fps (答案中的完整解决方案演练) 我能想到的最好的解决方案(除了更改livestream提供程序外)是使用v4l2loopback创建一个环回虚拟网络摄像头,我可以强制它具有我想要在livestream站点上使用的确切设置 对于brio,mjpeg提供了更高的帧速率,而不是默认的yuyv 问题1: sudo modprobe v4l2loopback d

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

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

我能想到的最好的解决方案(除了更改livestream提供程序外)是使用v4l2loopback创建一个环回虚拟网络摄像头,我可以强制它具有我想要在livestream站点上使用的确切设置

对于brio,mjpeg提供了更高的帧速率,而不是默认的yuyv

问题1:

sudo modprobe v4l2loopback devices=1 exclusive_caps=1
v4l2-ctl --list-devices
ffmpeg -f v4l2              \
       -input_format mjpeg  \
       -framerate 30        \
       -video_size 1280x720 \
       -i /dev/video0       \
       -pix_fmt yuyv422     \
       -f v4l2 /dev/video6  
我可以很容易地阅读mjpeg,但不幸的是,我的头一直撞在墙上,因为v4l2loopback显然只想要yuyv

我试过这样的方法:

ffmpeg -f v4l2              \
       -input_format mjpeg  \
       -framerate 30        \
       -video_size 1280x720 \
       -i /dev/video0       \
       -vcodec 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看到虚拟摄像头。它在GuvView上工作正常,在firefox上我可以使用网络摄像头测试站点,它可以毫无问题地拿起虚拟摄像头

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

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

下面是我使用的工作正常的modprobe:

sudo modprobe v4l2loopback devices=1 exclusive_caps=1
精确解

1。找出哪个网络摄像头是正确的输入网络摄像头

使用
v4l2 ctl
列出所有网络摄像头:

v4l2-ctl --list-devices
我的输出如下(您的输出会有所不同,我将以我的输出为例):

在这种情况下,我的brio是video0

2。启动v4l2loopback:

sudo modprobe v4l2loopback devices=1 exclusive_caps=1
v4l2-ctl --list-devices
ffmpeg -f v4l2              \
       -input_format mjpeg  \
       -framerate 30        \
       -video_size 1280x720 \
       -i /dev/video0       \
       -pix_fmt yuyv422     \
       -f v4l2 /dev/video6  
3。确认您的环回设备:

sudo modprobe v4l2loopback devices=1 exclusive_caps=1
v4l2-ctl --list-devices
ffmpeg -f v4l2              \
       -input_format mjpeg  \
       -framerate 30        \
       -video_size 1280x720 \
       -i /dev/video0       \
       -pix_fmt yuyv422     \
       -f v4l2 /dev/video6  
我的现在显示了这一点,表明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获得了60帧,我只需要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
在我的例子中,是mjpeg在guvcview中提供了最好的输出,这就是编解码器的确切名称(如上所述)

5。使用该输入编解码器启动ffmpeg,并将像素格式更改为yuyv:

sudo modprobe v4l2loopback devices=1 exclusive_caps=1
v4l2-ctl --list-devices
ffmpeg -f v4l2              \
       -input_format mjpeg  \
       -framerate 30        \
       -video_size 1280x720 \
       -i /dev/video0       \
       -pix_fmt yuyv422     \
       -f v4l2 /dev/video6  
将视频大小更新为livestream/视频记录支持的最大大小,前提是您的相机也支持


现在,当您想要livestream时,只需使用标记为“Dummy”的摄像头

如果您使用的是
GStreamer
,您可以通过运行
gst-device-monitor-1.0
来获得设备的功能。对于我来说,
-input\u格式mjpeg
就足够了,不需要任何类型的环回。但默认情况下,它会选择速度非常慢的原始视频。