小编jus*_*tyn的帖子

为什么多个消费者可以从网络摄像头访问 *单个 * v4l2-loopback 流

我最近需要一个网络摄像头同时由 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)

相关的系统信息:

  • Ubuntu 20.04
  • 内核:5.4.0-31-通用
  • 包:v4l2loopback-dkms …

ffmpeg video v4l camera v4l2loopback

9
推荐指数
1
解决办法
1054
查看次数

标签 统计

camera ×1

ffmpeg ×1

v4l ×1

v4l2loopback ×1

video ×1