使用 v4l2loopback 设备我可以运行这两个虚拟设备:
a) 将佳能数码单反相机的预览图像通过 USB 通过 v4l2loopback 运行到 OBS 中:
modprobe v4l2loopback
gphoto2 --stdout --capture-movie | gst-launch-1.0 fdsrc fd=0 ! decodebin name=dec ! queue ! videoconvert ! tee ! v4l2sink device=/dev/video0
Run Code Online (Sandbox Code Playgroud)
找到here,它的工作原理。
b) 将 OBS 的输出流式传输到基于浏览器的会议系统中,如下所示:
modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1
Run Code Online (Sandbox Code Playgroud)
在这里找到,这也有效。
但是,我需要运行两个a)和b)在同一时间,预期这是行不通的。他们在干扰,似乎他们正在使用相同的缓冲区,视频在两个制作人之间来回翻转。
我学到的和尝试的:内核模块只能加载一次。可以使用命令卸载 v4l2loopback 模块modprobe -r v4l2loopback。我不知道第二次加载它是否会被忽略或卸载前一次。
我尝试将模块devices=2作为选项以及不同的视频设备加载,但我找不到正确的语法。
根据您的描述(“视频在两个制作人之间来回翻转”),似乎两个制作人都在写入同一视频设备。
要解决此问题,您需要做两件事:
如文档所述devices=2,这可以通过在加载模块时指定来完成。
调用modprobe,这意味着:
modprobe v4l2loopback devices=2 video_nr=10 card_label="OBS Cam" exclusive_caps=1
Run Code Online (Sandbox Code Playgroud)
这将创建两个新设备,第一个将是/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
Run Code Online (Sandbox Code Playgroud)
并配置 obs 以使用/dev/video2.
或反之亦然。
只是不要为两个制作者使用相同的视频设备。(还要确保您的消费者使用正确的视频设备)
小智 6
由于有一个已经被接受的答案,我认为您的问题已经解决。然而,我是新手,即使在上面的答案之后也无法设置语法(即如何设置 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 用作流媒体的虚拟相机时,完全控制我的视频设备命名非常重要。我希望这个答案也能帮助其他人。