我最近需要一个网络摄像头同时由 3 个应用程序共享(一个网络浏览器、一个视频会议应用程序和 ffmpeg 来保存流)。
不可能简单地共享 /dev/video* 流,因为一旦一个应用程序正在使用它,其他应用程序就不能使用它,并且其他任何东西都会导致“设备或资源繁忙”或等效。
所以我转向 v4l2-loopback,目的是将网络摄像头镜像到 3 个环回。
使用 3 个环回确实按预期工作,但真正让我惊讶的是,我实际上不需要3 个环回,而只需要 1 个。
如果我创建一个环回并使用 ffmpeg 提供它,那么所有 3 个应用程序可以同时使用单个镜像环回,而不会出现“设备或资源繁忙”问题。
所以这比我计划的要好,而且没有我需要帮助的实际问题。
但我的问题是,环回怎么可能呢?为什么不直接使用原始来源?
创建单环回的示例命令:
sudo modprobe v4l2loopback video_nr=30 exclusive_caps=1 card_label="loopback cam"
使用 ffmpeg 将 /dev/video5 镜像到环回 (/dev/video30) 的示例命令。这将默认为原始,但最近构建的 ffmpeg 可以使用像 MJPEG 这样的替代流,不管怎样,行为都是相同的:
ffmpeg -f v4l2 -i /dev/video5 -codec copy -f v4l2 /dev/video30
这样做后,尝试使用多个应用程序访问 /dev/video30,以下是一些示例:
ffmpeg -f v4l2 -i /dev/video30 -codec libx264 recordstream.mp4
ffplay -f video4linux2 -i /dev/video30
Run Code Online (Sandbox Code Playgroud)
相关的系统信息:
我想参加一些视频会议,但我没有网络摄像头,会议软件需要一个。
所以我的问题是,我可以创建一个虚拟的吗?我不在乎凸轮会投射什么,我只需要看起来有一个。
我有一个罗技网络摄像头 C930e /dev/video0。我可以用它来进行视频会议(例如 jitsi)。然而,这个网络摄像头的视频太高太宽了。我想要一个“裁剪”的版本/dev/video0,不显示墙上的海边图片。
首先,我尝试设置v4l2选项来实现这一点,但没有成功:
$ v4l2-ctl -d /dev/video0 --get-cropcap
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 640, Height 360
Default : Left 0, Top 0, Width 640, Height 360
Pixel Aspect: 1/1
$ v4l2-ctl -d /dev/video0 --get-selection target=crop_bounds
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 360, Flags:
$ v4l2-ctl -d /dev/video0 --set-selection target=crop_bounds,flags=crop,top=10,left=10,width=100,height=100
VIDIOC_S_SELECTION: failed: Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)
之后,我遵循了另一个想法:我尝试使用v4l2loopback创建另一个设备/dev/video2。之后我会尝试使用ffmpeg连接/dev/video0到 …
我的机器上运行着不同的 lxc 容器,并且还连接了一个网络摄像头。我希望所有 lxc 容器都可以访问此相机。我遇到了“v4l2-loopback”设备,并找到了一种添加设备的方法;
modprobe v4l2loopback devices=3
Run Code Online (Sandbox Code Playgroud)
我将来自 /dev/video0 的流定向到所需的虚拟视频设备。我的问题是如何在运行时添加和删除这些 v4l2loopback 设备?每当启动/删除任何 lxc 容器时,我都想添加/删除设备。有任何想法吗?
谢谢!