Linux 如何将mjpeg从网络摄像头更改为yuyv422到v4l2loopback?
背景故事:我使用的一个直播网站不够智能,无法检测到我的网络摄像头(Logitech Brio,4k)的功能,而是使用默认的每秒帧数设置,即5fps (答案中的完整解决方案演练) 我能想到的最好的解决方案(除了更改livestream提供程序外)是使用v4l2loopback创建一个环回虚拟网络摄像头,我可以强制它具有我想要在livestream站点上使用的确切设置 对于brio,mjpeg提供了更高的帧速率,而不是默认的yuyv 问题1: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
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
就足够了,不需要任何类型的环回。但默认情况下,它会选择速度非常慢的原始视频。