Dev*_*ull 4 linux ffmpeg live-streaming v4l2 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
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
但他们不会工作。我收到如下错误:
与 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
Run Code Online (Sandbox Code Playgroud)
问题二
下一个问题是让 chrome 看到虚拟网络摄像头。它与 guvcview 一起工作正常,在 firefox 上我可以使用网络摄像头测试站点,它可以毫无问题地选择虚拟摄像头。
事实证明,谷歌出于过度保护的性质(顺便说一句,它正在窃取我们所有的数据),不想使用可以读取和写入的网络摄像头。
因此,在启动 v4l2loopback 时,您必须告诉它向 chrome 等消费者宣布它是“只读的”。
这是我使用的确切 modprobe 有效:
sudo modprobe v4l2loopback devices=1 exclusive_caps=1
Run Code Online (Sandbox Code Playgroud)
Dev*_*ull 11
确切的解决方案。
1. 找出哪个网络摄像头是正确的输入网络摄像头
使用v4l2-ctl到列表中的所有网络摄像头:
v4l2-ctl --list-devices
Run Code Online (Sandbox Code Playgroud)
我的输出是这样的(你的会有所不同,我会以我的为例):
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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的 brio 是 video0。
2.启动v4l2loopback:
sudo modprobe v4l2loopback devices=1 exclusive_caps=1
Run Code Online (Sandbox Code Playgroud)
3. 确认您的环回设备:
v4l2-ctl --list-devices
Run Code Online (Sandbox Code Playgroud)
我的现在显示了这一点,表明 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
Run Code Online (Sandbox Code Playgroud)
4. 确定您的最佳输入设置
使用 guvcview 找出哪个编解码器为您提供了您正在寻找的分辨率和帧率(您可能必须使用菜单 -> 视频 -> 视频编解码器 -> 原始相机输入)。
我使用 mjpeg 得到了 60fps,我只需要 30。默认的 yuyv 给出了一个悲惨的 5fps。
现在使用 ffmpeg 列出相机的功能并获取匹配的编解码器:
ffmpeg -f v4l2 -list_formats all -i /dev/video0 #use your camera here from step 2
Run Code Online (Sandbox Code Playgroud)
在输出中,您将看到如下内容:
[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
Run Code Online (Sandbox Code Playgroud)
在我的例子中,在 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
Run Code Online (Sandbox Code Playgroud)
将视频大小更新为您的直播/视频记录将支持的最大大小,只要您的相机也支持它。
现在当你想直播时,只需使用标有“Dummy”的摄像头