使用 GStreamer 从 jpeg 创建虚拟网络摄像头

Creating a virtual webcam from jpeg using GStreamer

我正在尝试使用 jpg 文件作为 Skype(或类似软件)的虚拟网络摄像头。图像文件每隔几秒重新加载一次,管道也应该始终传输最新的图像。 我开始创建这样的管道

gst-launch filesrc location=~/image.jpg ! jpegdec ! ffmpegcolorspace ! freeze ! v4l2sink device=/dev/video2

但它只流式传输第一个图像并忽略图像文件的较新版本。我阅读了一些有关 concat 和动态更改管道的内容,但我无法让它为我工作。

你能给我一些关于如何让它工作的提示吗?

无法动态刷新输入文件(至少 filesrc)。
此外,您的示例使用 freeze,这将防止图像更改。

一种可能的方法是使用 multifilesrcvideoratemultifilesrc可以读取很多文件(提供模式类似于scanf/printf),videorate可以控制速度。

例如,您创建了 100 张格式为 image0000.jpg、image0001.jpg、...、image0100.jpg 的图像。然后连续播放,每张1秒:

gst-launch multifilesrc location=~/image%04d.jpg start-index=0 stop-index=100 loop=true caps="image/jpeg,framerate=\(fraction\)1/1" ! jpegdec ! ffmpegcolorspace ! videorate ! v4l2sink device=/dev/video2

stop-index=100改变图片数量,在caps="image/jpeg,framerate=\(fraction\)1/1"改变速度
有关这些元素的更多信息,请参阅位于 gstreamer.freedesktop.org/documentation/plugins.html

的文档

编辑:看起来您使用的是 GStreamer 0.10,而不是 1.x
这种情况请参考旧文档multifilesrc and videorate

如果您添加一些参数调整并将其与延迟时的 identity 配对,您可以使用带有 multifilesrc 的通用文件名。它有点脆弱,但只要您保持输入图像的尺寸和格式相同,它就可以作为临时的一次性程序使用。

gst-launch-1.0 multifilesrc loop=true start-index=0 stop-index=0 location=/tmp/whatever ! decodebin ! identity sleep-time=1000000 ! videoconvert ! v4l2sink