使用v4l2loopback虚拟凸轮与谷歌 chrome 或 chrome 在linux上,而有真实的的网络摄像头在使用中

bqucvtff  于 2023-08-01  发布在  Go
关注(0)|答案(2)|浏览(107)

(我希望在这里发布自己问题的答案不违反TOS,我之所以这样做是因为我在写这篇文章时发现了解决方案,广泛的谷歌搜索没有帮助,所以我希望我能帮助一些寻找解决方案的人。

**问题:**Google chrome /chrome无法打开v4 l2 loopback虚拟摄像头设备(无法访问)并报告“无可用摄像头”,即使有时在设置页面中列出并选择了该设备。
观察到的问题原因:(使用OBS Cam Studio时注意到)Google Chrome / Chromium如果发现真实的相机设备正在使用(忙碌),将不会访问(打开)虚拟相机设备。
解决方案(简版)

  • 找出您的物理网络摄像头是哪个设备(它可能是多个设备)如果您的相机是可插拔的,您可以断开它,然后观察ls /dev/video*的结果,连接它,并再次尝试ls /dev/video*,看看哪些设备出现(在我的情况下,它是/dev/video0/dev/video1)-在大多数情况下,它将是/dev/video0
  • 启动您的捕获程序(使用物理网络摄像头和输出到虚拟相机的程序),并将其输出到虚拟相机(虚拟相机必须输入由Chrome打开)
  • 禁用访问物理网络摄像头,这(在我的情况下)可以做:
sudo chmod 000 /dev/video0
sudo chmod 000 /dev/video1

字符串
(use您发现您的物理网络摄像头的设备名称是)

  • 在google chrome/chrome中启动视频捕获(通过打开网页或按下某种“开始网络摄像头”,这取决于网页)
  • 你应该看到虚拟相机饲料在 chrome 现在
  • 启用对物理网络摄像头的访问,完成(在我的情况下):
sudo chmod 660 /dev/video0
sudo chmod 660 /dev/video1

  • 在网上玩得开心!
    解决方案(长版):描述,一步一步,如何使OBS凸轮工作室虚拟输出可见在谷歌 chrome / chrome 。
  • 如果您还没有卸载v4 l2 loopback模块(如果您不知道“exclusive_caps”参数,请执行此操作):
sudo modprobe -r v4l2loopback


(you需要停止任何virual相机饲料和停止应用程序,使用虚拟凸轮,否则你会得到modprobe: FATAL: Module v4l2loopback is in use.错误)

  • 加载v4 l2 loopback模块(只有“exclusive_caps”参数重要):
sudo modprobe v4l2loopback devices=1 video_nr=21 exclusive_caps=1 card_label="Virtual Webcam"


(this命令将创建一个名为/dev/video21和名称(标题)“Virtual Webcam”)的环回设备。

sudo modprobe v4l2loopback exclusive_caps=1

  • 启动视频捕捉程序,使用您的物理网络摄像头和输出到虚拟网络摄像头设备(在我的情况下,它的OBS凸轮工作室)-物理网络摄像头应该是忙碌的(在使用中)现在和虚拟网络摄像头应该美联储输入(重要)
  • 禁用物理网络摄像头设备访问(在我的情况下):
sudo chmod 000 /dev/video0
sudo chmod 000 /dev/video1


(设备名称可能不同,在您的情况下,可能只有一个)(如果您没有sudo访问权限,并且您的相机是可插拔的,您可以直接拔下它)

  • 开始使用网络摄像头与谷歌 chrome 或 chrome (进入网页,并打开它的网络摄像头,例如按钮“使用我的网络摄像头”在网页上-它是不同的从页面到页面)
  • 你应该看到虚拟摄像头饲料现在(如果没有,点击地址栏右侧的摄像头图标,点击“管理”,并选择您的虚拟摄像头的名称在设置中,使网页再次使用摄像头)
  • 启用物理网络摄像头设备访问(在我的情况下):
sudo chmod 660 /dev/video0
sudo chmod 660 /dev/video1


(in如果你拔掉了网络摄像头,插回去,(可能)在你的程序中重新打开它)

  • 享受虚拟网络摄像头在 chrome !

我希望它有助于我挣扎了很长一段时间没有效果,使谷歌Chrome打开虚拟网络摄像头在OBS凸轮工作室。

已编辑:找到了基于类似原理的工作方案,如下:https://www.scs.stanford.edu/~dm/blog/hide-webcam.html它从可见网络摄像头列表中隐藏物理网络摄像头,因此您需要手动或在程序的配置设置中输入其路径。

ar5n3qh5

ar5n3qh51#

回复我自己的帖子,把它标记为“已回复”。

83qze16e

83qze16e2#

简洁的回答:火牢

禁止 chrome 访问任何实际的摄像机。

firejail --blacklist=/dev/video{0,1} chromium

字符串
如果您已经弄清楚了v4 l2 loopback和ffmpeg,那么这就是让它与Chromium一起工作所需要的全部内容。

简短回答:v4 l2回送、ffmpeg和Firejail

sudo modprobe v4l2loopback exclusive_caps=1 \
                           max_width=4096 max_height=4096 \
                           video_nr=42 \
                           card_label="Oovideo Metamorphoses"


1.

ffmpeg -f x11grab -i ${DISPLAY} \
       -vcodec rawvideo -pix_fmt yuv420p \
       -f v4l2 /dev/video42


1.

firejail --blacklist=/dev/video? chromium

详细说明

导致问题的原因

谷歌的 chrome 浏览器-这是谷歌Chrome的基础-有问题打开虚拟相机。(注:Mozilla Firefox可以正常工作。)

问题1:输出和捕获功能

chrome 拒绝打开任何设备,可以做任何事情,但捕捉视频。当然,虚拟摄像机也可以由视频制作者(如ffmpeg)作为OUTPUT打开。解决方法是让内核模块依赖于Chromium。
通过在加载vl 42 loopback模块时设置exclusive_caps=1选项,设备将在生成器开始写入时声明它仅具有CAPTURE功能.这足以安抚 chrome 。

第二个问题:在/dev/video 0上挂起

如果Chromium能够打开连接到系统的任何物理摄像头,则不会提供切换到虚拟摄像头的选项。解决方案是拒绝Chromium访问实际的摄像机。这就是firejail为我们所做的。

必要的软件

您需要的软件是v4 l2 loopback内核模块、ffmpeg和firejail。大多数系统都预先打包了这些功能。例如,在Debian GNU/Linux系统上,您可以键入:

sudo apt install v4l2loopback-{dkms,utils} ffmpeg firejail

步骤与冗长的解释

  • 通过从命令行运行以下命令来加载v4 l2 loopback内核模块:
sudo modprobe v4l2loopback exclusive_caps=1 \
                           max_width=4096 max_height=4096 \
                           video_nr=42 \
                           card_label="Oovideo Metamorphoses"


该命令将创建一个名为/dev/video42的伪设备。

  • exclusive_caps=1参数是 chrome 的修复。
  • 网站打开您的摄像头时需要max_height_width参数。它们只需要比您要共享的任何屏幕都大。
  • 定制的video_nr是为了让我们知道下一步ffmpeg输出的确切位置。
  • card_label是可选的,但如果没有它,网站将看到您的网络摄像头的名称为“虚拟视频设备(0x 0000)"。

注:如果系统重新引导,则需要重复此modprobe步骤,因此请考虑将v4 l2 loopback及其参数添加到/etc/modules,使其在引导时加载。

  • 启动一个ffmpeg进程,捕获屏幕并将其写入/dev/video42
ffmpeg -f x11grab -i ${DISPLAY} \
       -vcodec rawvideo -pix_fmt yuv420p \
       -f v4l2 /dev/video42


该命令以每秒30帧的速度捕获整个屏幕。它将一直工作,直到您通过按Ctrl+C取消ffmpeg。您可以使用ffplay /dev/video42测试它是否正常工作。
要调整每秒帧数和捕捉的区域,可以使用如下命令:

ffmpeg -framerate 15 -f x11grab \
       -video_size 1280x720 -i ${DISPLAY}+200,300 \
       -vcodec rawvideo -pix_fmt yuv420p \
       -f v4l2 /dev/video42


上面的示例以每秒15帧的速度捕获了一个1280 x720的矩形,其左手角位于屏幕坐标(200,300)处。

  • 最后,在禁止访问实际摄像机的Firejail中启动chromium(或google-chrome):
firejail --blacklist=/dev/video? chromium


上述命令中的?是一个与任何单个字符匹配的文件名通配符。在本例中,我们使用它来匹配/dev/video 0、/dev/video 1、......、/dev/video 9,希望它们能够覆盖每个物理网络摄像头。当然,/dev/video 42有两位数,所以它将可以被浏览器访问,并将使用我们的虚拟摄像头。
就这样
如果您对如何改进此答案有任何建议,请在下方发表评论。

相关问题