Chrome 检测到 v4l2loopback 设备,Zoom 或 Firefox 未发现

uri*_*sh. 5 ffmpeg gstreamer v4l2 v4l2loopback

我正在尝试从我的网络摄像头创建一个环回设备,以便可以从 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
Run Code Online (Sandbox Code Playgroud)

其次是:

ffmpeg -i /dev/video0 -f v4l2 -vcodec rawvideo -pix_fmt yuv420p /dev/video10 -f v4l2 /dev/video11
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这告诉我 /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(因此需要 Chrome 和 Firefox)打开一个 Web 应用程序,该应用程序将输出可被视频使用的已处理视频流聊天应用程序,例如 Zoom 或 Jitsi。

任何帮助将不胜感激。

ffr*_*mns 5

我刚刚在这篇文章评论中发现[1],很快就发现了这个有缺陷的版本:

v.0.12.3-1ubuntu0.1

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

sudo add-apt-repository ppa:smb/focal

sudo apt upgrade v4l2loopback-dkms
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试过这些方法并在我的缩放客户端应用程序上工作。

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
Run Code Online (Sandbox Code Playgroud)

要停止,就跑sudo modprobe -r v4l2loopback。当然 v4l2loopback 设备可以通过以下方式检查v4l2-ctl --list-devices

参考链接:

[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


Pab*_*oRQ 5

长话短说

降级到 v4l2loopback-dkms 0.12.3-1。在版本 0.12.5-1 之前请勿升级。

降级 v4l2loopback-dkms

$ sudo apt install v4l2loopback-dkms=0.12.3-1
Run Code Online (Sandbox Code Playgroud)

锁定它

这将阻止此软件包的任何升级

$ sudo apt-mark hold v4l2loopback-dkms
Run Code Online (Sandbox Code Playgroud)

当修复的 0.12.5-1 版本可用时,解锁此软件包:

$ sudo apt-mark unhold v4l2loopback-dkms
Run Code Online (Sandbox Code Playgroud)

细节

来自启动板错误

影响:尝试正确修复 0.12.3-1ubuntu0.1 中的模块引起的警告导致除 Chromium 之外的任何其他应用程序不再检测可用的环回设备。测试的能力只在capability集中设置,而在device_caps集中没有设置。

修复:修改补丁以更改 IOCTL 代码,如 v4l2loopback 0.12.5-1 中所做的那样。这可能与内核开发人员试图实现的目标相反,通过额外修改测试检查的视频设备功能来解决这些限制。

测试用例:现在使用 OBS v4l2sink 连接(并设置了 Exclusive_caps)针对 Chromium 和 Firefox 进行测试。在 0.12.3-1ubuntu0.1 中,只有 Chromium 可以找到环回摄像头,但通过建议的更新,Chromium 和 Firefox 都可以为我工作。并且仍然没有任何警告。

回归潜力:与发布版本的本质区别在于,设置了 Exclusive_caps 后,视频设备的 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 可以解决该问题。