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

问题描述 投票:0回答:1

使用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,但我找不到正确的语法。

v4l2 v4l2loopback
1个回答
1
投票
根据您的描述(“视频在两个制作人之间来回切换”),似乎两个制作人都在写相同的视频设备。

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

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

    作为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

    或反过来。

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

  • © www.soinside.com 2019 - 2024. All rights reserved.