我最近需要一个网络摄像头同时由 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)
相关的系统信息: