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