使用v4l2loopback设备,我可以运行这两个虚拟设备:
a)通过USB通过v4l2loopback进入OBS,从佳能DSLR运行预览图像:
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,这也有效。
但是,我需要同时运行[[both a)和b)同时,但这无法正常工作。他们在干扰,似乎他们使用的是两个制作人之间来回切换视频时使用的相同缓冲区。
我学到并尝试过的东西:内核模块只能加载一次。可以使用命令modprobe -r v4l2loopback
卸载v4l2loopback模块。我不知道是否第二次加载它会被忽略还是卸载前一个。我尝试将devices=2
作为模块以及其他视频设备加载为option,但我找不到正确的语法。
要解决此问题,您需要做两件事:
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
。或反过来。
只是两个制作人都不要使用相同的视频设备。(还请确保您的消费者使用正确的视频设备)