我想尝试在 Google+ Hangouts 和类似配置中使用 Cheese,我想知道是否可以让两个进程使用网络摄像头同时访问网络摄像头。我还没有尝试过,但在我尝试之前,我想我会问。
那么,有可能吗?
The*_*Eye 22
There is currently a project on GitHub that can show not only two, but an infinite (limited only by system capacity) number of video devices from a single source.
The project is called v4l2loopback. (Check the link and scroll down to view the README for instructions.)
You can install v4l2loopback by cloning its GitHub and running these commands:
$ git clone https://github.com/umlaeute/v4l2loopback.git
$ cd v4l2loopback
$ make
$ sudo make install
Run Code Online (Sandbox Code Playgroud)
For samples on how to use it with GStreamer, FFmpeg, MPlayer, and Skype, check their small wiki. Hopefully you could find the right settings to fit your needs.
Enjoy tweaking around!
嗯,我刚试过。有趣的结果。
我有 Skype 和奶酪、网络摄像头玩具和视频群聊(它们都有效),并一起尝试了它们。
结果:
您不能同时在两件事上使用相同的网络摄像头。
奶酪(工作)+ 网络摄像头玩具(不工作)+ Skype(小,右上角。不工作)。

不过,您可以在两件事上使用 2 个网络摄像头。(奶酪 + 网络摄像头玩具)。

环聊(不工作)+ Cheese(工作)

环聊(独立工作)。

当我第一次打开环聊时,奶酪坏了。它和其他人一样,但我的互联网太慢了,无法上传每一个截图(我怀疑你会喜欢 30 多张截图)......

我什至尝试建立一个符号链接/dev/video0并将其保存/dev为video2. 那没有用。
我也不能同时运行 2 个奶酪过程。
如果必须,我建议将其设为全屏并进行 2 次屏幕录制。我怀疑这对你想要的东西有用。
基于@The Eye 的回答
我首先在 Ubuntu 18.04 https://gstreamer.freedesktop.org/documentation/installing/on-linux.html上安装了 gstreamer 软件包
$ git clone https://github.com/umlaeute/v4l2loopback.git
$ cd v4l2loopback
$ make
$ sudo make install
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 18.04 LTS https://github.com/umlaeute/v4l2loopback/issues/139上收到警告消息(但它并没有阻止我加载 v4l2loopback 驱动程序)
$ sudo depmod -a
Run Code Online (Sandbox Code Playgroud)
我的笔记本电脑 /dev/video0 上只有 1 个网络摄像头,我想从同一硬件获取 2 个流。基于https://github.com/umlaeute/v4l2loopback/blob/master/README.md
$ modprobe v4l2loopback devices=2
Run Code Online (Sandbox Code Playgroud)
现在应该/dev/video1和/dev/video2创建假设/dev/video0是唯一的视频设备。
现在我在一个终端窗口中运行以下命令
gst-launch-1.0 v4l2src device=/dev/video0 ! tee name=t ! queue ! v4l2sink device=/dev/video1 t. ! queue ! v4l2sink device=/dev/video2
Run Code Online (Sandbox Code Playgroud)
我再打开 2 个标签
在第一个选项卡中
gst-launch-1.0 v4l2src device=/dev/video1 ! videoconvert ! ximagesink
Run Code Online (Sandbox Code Playgroud)
在第二个选项卡中
gst-launch-1.0 v4l2src device=/dev/video2 ! videoconvert ! ximagesink
Run Code Online (Sandbox Code Playgroud)
现在应该可以看到 2 个视频流
更新
即使我/dev/video1多次使用同一个设备,它也会给我很多流。例子。
在第一个选项卡中
gst-launch-1.0 v4l2src device=/dev/video1 ! videoconvert ! ximagesink
Run Code Online (Sandbox Code Playgroud)
在第二个选项卡中
gst-launch-1.0 v4l2src device=/dev/video1 ! videoconvert ! ximagesink
Run Code Online (Sandbox Code Playgroud)
在第三个选项卡中
gst-launch-1.0 v4l2src device=/dev/video1 ! videoconvert ! ximagesink
Run Code Online (Sandbox Code Playgroud)
给我三个流。
由于使用没有答案ffmpeg,就是这样。
虽然v4l2loopback创建虚拟视频设备,它们不与默认情况下,任何有关。为了使它们有用,您必须通过外部应用程序向它们发送流,例如ffmpeg.
首先加载模块
$ sudo modprobe v4l2loopback exclusive_caps=1 video_nr=5 #creates `/dev/video5`
Run Code Online (Sandbox Code Playgroud)
然后将网络摄像头的输入发送到虚拟设备。
$ ffmpeg -i /dev/video0 -f v4l2 -codec:v rawvideo -pix_fmt yuv420p /dev/video5
Run Code Online (Sandbox Code Playgroud)
现在/dev/video5用作伪网络摄像头。请注意,与物理网络摄像头不同,可以从多个应用程序同时访问单个虚拟视频设备。因此,在这种情况下,您不必创建许多虚拟设备。
我写了一个脚本来包装这些步骤:v4l2_webcam - GitHub。
您可以将任何(原始)视频发送到虚拟视频设备。这意味着,例如,可以使用OBS的复杂混合视频作为摄像头输入到网络会议(例如 Skype、Zoom 等)。
这是一个相对复杂但非常实用的例子:

