运行 两个具有各自属性的 v4l2loopback 设备

Running two v4l2loopback devices with their individual properties

使用 v4l2loopback 设备我可以 运行 这两个虚拟设备:

a) 运行通过 USB 通过 v4l2loopback 将来自 Canon DSLR 的预览图像连接到 OBS:

modprobe v4l2loopback
gphoto2 --stdout --capture-movie | gst-launch-1.0 fdsrc fd=0 ! decodebin name=dec ! queue ! videoconvert ! tee ! v4l2sink device=/dev/video0

找到 here,它有效。

b) 将 OBS 的输出流式传输到基于浏览器的会议系统中,如下所示:

modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1

发现here,这也行。

但是,我需要运行 a) 和 b) 同时,这不是按预期工作。他们在干扰,似乎他们正在使用相同的缓冲区,视频在两个制作人之间来回翻转。

我学到的和尝试过的: 一个内核模块只能加载一次。可以使用命令 modprobe -r v4l2loopback 卸载 v4l2loopback 模块。不知道加载第二次会被忽略还是卸载上一次

我尝试使用 devices=2 作为 option 以及不同的视频设备加载模块,但找不到正确的语法。

从您的描述 ("the video flips back and forth between the two producers") 看来,两个制作人都在写入同一视频设备。

要解决此问题,您需要做两件事:

  • 创建 2 个视频设备
  • 告诉每个制作人使用他们自己的视频设备

创建多个视频设备

as documented 这可以通过在加载模块时指定 devices=2 来实现。

调用 modprobe,这意味着:

modprobe v4l2loopback devices=2 video_nr=10 card_label="OBS Cam" exclusive_caps=1

这将创建两个新设备,第一个将是 /dev/video10(因为您指定了 video_nr),第二个将使用第一个免费视频设备。 在我的系统上(有一个网络摄像头,同时占用 /dev/video/dev/video1)这是 /dev/video2

告诉每个生产者使用他们自己的设备

好吧,告诉一位制作人使用 /dev/video10,而另一位制作人使用 /dev/video2(或您拥有的任何视频设备)

例如

gphoto2 --stdout --capture-movie | gst-launch-1.0 \
       fdsrc fd=0  \
       ! decodebin name=dec  \
       ! queue  \
       ! videoconvert  \
       ! tee  \
       ! v4l2sink device=/dev/video10

并配置 obs 以使用 /dev/video2

或反过来。

只是不要为两个制作人使用相同的视频设备。 (还要确保您的消费者使用正确的视频设备)

因为已经有一个答案被接受,我认为你的问题已经解决了。然而,我是一个新手,即使在上面的答案之后也无法设置语法(即如何设置 video2)

经过更多搜索,我找到了 website,它通过示例解释了如何添加多个设备。

modprobe v4l2loopback video_nr=3,4,7 card_label="device number 3","the number four","the last one" 将创建 3 个设备,并将卡名作为第二个参数传递:

  • /dev/video3->设备号3
  • /dev/video4 -> 数字四
  • /dev/video7->最后一个

当我尝试将我的尼康相机用作网络摄像头并将 OBS 用作流媒体的虚拟相机时,完全控制命名我的视频设备很重要。我希望这个答案也能对其他人有所帮助。