Chrome检测到v4l2loopback设备,但Zoom或Firefox无法检测到。

4

我正在尝试创建一个回路设备,将我的网络摄像头连接到Zoom和浏览器,两者都可以访问。我已经创建了三个v4l2loopback设备:

sudo modprobe v4l2loopback devices=3 video_nr=10,11,12 card_label="Loopback_1","Loopback_2","Virtual_cam" exclusive_caps=1,1,0

接着是:

ffmpeg -i /dev/video0 -f v4l2 -vcodec rawvideo -pix_fmt yuv420p /dev/video10 -f v4l2 /dev/video11

这两个设备被Chrome检测到,但是Zoom和Firefox无法识别。 根据stackoverflow上的其他问题建议,我尝试使用v4l2loopback-ctl设置设备属性,使用v4l2loopback-ctl set-caps "video/x-raw,format=UYVY,width=640,height=480" /dev/video10命令,结果返回:

设置管道为暂停状态... 错误:管道不想暂停。 错误:来自元素/GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0的设备'/dev/video10'不是输出设备。 附加调试信息: v4l2_calls.c(636): gst_v4l2_open():/GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0: 能力: 0x85208000 将管道设置为null ... 释放管道... 向/dev/video10输出失败。

我还尝试使用gst-launch-1.0:

gst-launch-1.0 v4l2src device=/dev/video0 ! v4l2sink device=/dev/video10

这告诉我 /dev/video10 不是输出设备:

将管道设置为暂停状态... 错误:管道不想暂停。 错误:来自元素 /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0 的错误:设备 '/dev/video10' 不是输出设备。 其他调试信息: v4l2_calls.c(636):gst_v4l2_open():/GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0: 功能:0x85208000 将管道设置为NULL... 释放管道...

我正在运行 Xubuntu 20.04,内核版本为 5.4.0-52-generic,使用 v4l2loopback-dkms v.0.12.3-1ubuntu0.1 和 v4l2loopback-utils。

我的目标是获取一个设备,由桌面 Node.js 服务器消耗它,该服务器将使用 xdg-open 打开 Web 应用程序(因此需要 Chrome 和 Firefox),它将输出经过处理的视频流,可被视频聊天应用程序(例如 Zoom 或 Jitsi)消耗。

任何帮助将不胜感激。

2个回答

4

简述

降级到v4l2loopback-dkms 0.12.3-1版本,不要升级到0.12.5-1版本。

下降v4l2loopback-dkms

$ sudo apt install v4l2loopback-dkms=0.12.3-1

锁定它

这将防止此包的任何升级

$ sudo apt-mark hold v4l2loopback-dkms

当 0.12.5-1 版本固定时,解锁此软件包:

$ sudo apt-mark unhold v4l2loopback-dkms

详情

来自Launchpad Bug

影响:在0.12.3-1ubuntu0.1中尝试正确修复模块引起的警告导致除Chromium以外的任何应用程序都无法检测到可用的环回设备。测试功能仅设置在功能组中,但未设置在device_caps中。

修复:修补程序已修改为更改IOCTL代码,就像在v4l2loopback 0.12.5-1中所做的那样。这可能与内核开发人员试图实现的相反,通过另外修改视频设备功能来绕过限制,测试确实针对此进行检查。

测试用例:现已使用连接到OBS v4l2sink(并设置了exclusive_caps)的Chromium和Firefox进行测试。使用0.12.3-1ubuntu0.1时,只有Chromium会找到环回摄像头,但使用建议的更新后,我可以在Chromium和Firefox上使用,并且仍然没有警告。

回归风险:与发布版本的区别在于,如果设置了exclusive_caps,则video设备的device_caps会发生更改。这可能会使任何在此处进行检查并且不期望任何更改的检查失误。好的一面是,这现在正是20.10/Groovy中显示的行为。

从0.12.3-1升级到0.12.3-1ubuntu0.1后,使用v4l2loopback创建的设备不再可用于应用程序(例如MS Teams和Zoom)。使用版本0.12.3-1时,设备会显示出来,例如 modprobe v4l2loopback video nr=2 card label="test" 将导致新设备在这些UI中显示为“test”。使用版本0.12.3-1ubuntu0.1后,“test”设备不再显示。 降级到0.12.3-1可以解决问题。


今天这位英雄救了我的命。 - kuzdogan
很高兴能够帮忙! - PabloRQ
对我来说,我遇到了降级v4l2loopback-dkms(安装v4l2loopback-dkms软件包后安装脚本子进程返回错误退出状态1)的问题 - ses刚才实际上我已经有0.12.3-1ubuntu0.4版本了 - 问题仍然存在。不确定该从哪里降级..即使我没有错误1 - ses
也许您需要卸载当前版本并安装旧版本。请注意,新版本(0.12.5-1ubuntu1)已经可用。 - PabloRQ

4

我在这篇评论[1]中发现,它简要地提到了这个有缺陷的版本:

v.0.12.3-1ubuntu0.1

然后,我打开了链接[2],在这里找到ppa存储库[3],运行了这个命令:

sudo add-apt-repository ppa:smb/focal

sudo apt upgrade v4l2loopback-dkms

它将升级v4l2loopback到v.0.12.3-1ubuntu0.2版本,或者只需等待下一次软件更新。

我已经尝试了这些方法并且在我的zoom客户端应用程序上运行良好。

PS:只需运行sudo modprobe v4l2loopback,如果/etc/modprobe.d/v4l2loopback.conf文件像这样配置:

options v4l2loopback devices=3 video_nr=10,11,12 card_label="Loopback_1","Loopback_2","Virtual_cam" exclusive_caps=1,1,0

要停止,请运行sudo modprobe -r v4l2loopback命令。当然,可以通过v4l2-ctl --list-devices命令检查v4l2loopback设备。

参考链接:

[1] V4l2视频设备突然在Zoom、Teams中消失,但ffplay可以显示它

[2] https://bugs.launchpad.net/ubuntu/+source/v4l2loopback/+bug/1901491

[3] https://launchpad.net/~smb/+archive/ubuntu/focal

[4] https://github.com/umlaeute/v4l2loopback/issues/274


1
如果您想避免使用PPA或者想使用最新的v4l2loopback版本,可以在Is there any way ffmpeg send video to /dev/video0 on Ubuntu?中找到v4l2loopback编译说明。 - llogan
1
谢谢,非常有效!在[2]上,当前状态已经被批准,因此它很快将作为常规更新提供。 - uri sh.
1
我正在使用20.04版本,并从http://archive.ubuntu.com/ubuntu/pool/universe/v/v4l2loopback/v4l2loopback-dkms_0.12.3-1_all.deb下载deb文件并使用。它可以正常工作。 - arulraj.net
尝试安装以降级:出现状态10错误。 - ses

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接