4

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

a) 通过 USB 通过 v4l2loopback 从佳能 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

在这里找到,并且有效。

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

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

在这里找到,这也有效。

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

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

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

4

2 回答 2

9

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

经过一番搜索后,我找到了解释如何添加多个设备的网站,并附有示例。

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 用作流媒体的虚拟相机时,完全控制我的视频设备的命名非常重要。我希望这个答案也能对其他人有所帮助。

于 2020-10-24T21:47:48.090 回答
5

从您的描述(“视频在两个制作人之间来回翻转”)看来,两个制作人都在写入同一个视频设备。

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

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

创建多个视频设备

文件所述,这可以通过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.

或者反过来。

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

于 2020-05-29T22:21:00.977 回答