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

使用GStreamer从jpeg创建虚拟网络摄像头,gstreamer,webcam,pipeline,gst-launch,Gstreamer,Webcam,Pipeline,Gst Launch,我正在尝试使用jpg文件作为Skype(或类似产品)的虚拟网络摄像头。映像文件每隔几秒钟重新加载一次,管道还应始终传输最新的映像。 我开始创建这样的管道 gst-launch filesrc location=~/image.jpg ! jpegdec ! ffmpegcolorspace ! freeze ! v4l2sink device=/dev/video2 但它只对第一个图像进行流式处理,而忽略图像文件的较新版本。我读了一些关于concat和动态更改管道的内容,但我无法让它为我工作

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

gst-launch filesrc location=~/image.jpg ! jpegdec ! ffmpegcolorspace ! freeze ! v4l2sink device=/dev/video2
但它只对第一个图像进行流式处理,而忽略图像文件的较新版本。我读了一些关于concat和动态更改管道的内容,但我无法让它为我工作


您能给我一些关于如何使其工作的提示吗?

动态刷新输入文件是不可能的(至少对于
filesrc
)。
此外,您的示例使用了
冻结
,这将防止图像更改

一种可能的方法是使用
multifilesrc
videorate
multifilesrc
可以读取许多文件(提供的模式类似于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,帧速率=\(分数\)1/1”处更改速度
有关这些元素的更多信息,请参阅gstreamer.freedesktop.org/documentation/plugins.html上的文档

编辑:看起来您使用的是GStreamer 0.10,而不是1.x

在这种情况下,请参考旧文档,动态刷新输入文件是不可能的(至少使用
filesrc
)。
此外,您的示例使用了
冻结
,这将防止图像更改

一种可能的方法是使用
multifilesrc
videorate
multifilesrc
可以读取许多文件(提供的模式类似于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,帧速率=\(分数\)1/1”处更改速度
有关这些元素的更多信息,请参阅gstreamer.freedesktop.org/documentation/plugins.html上的文档

编辑:看起来您使用的是GStreamer 0.10,而不是1.x

在这种情况下,请参考旧文档,如果您添加一些参数调整,并在延迟时将其与
标识配对,则可以将通用文件名与
multifilesrc
一起使用。它有点脆弱,但对于一个临时的一次性程序来说,只要你保持输入图像的尺寸和格式不变,它就行了


gst-launch-1.0 multifilesrc loop=true start index=0 stop index=0 location=/tmp/随便什么!德克宾!身份睡眠时间=1000000!视频转换!v4l2sink

如果您添加一些参数调整,并在延迟时将其与
标识配对,则可以将常规文件名与
multifilesrc
一起使用。它有点脆弱,但对于一个临时的一次性程序来说,只要你保持输入图像的尺寸和格式不变,它就行了


gst-launch-1.0 multifilesrc loop=true start index=0 stop index=0 location=/tmp/随便什么!德克宾!身份睡眠时间=1000000!视频转换!v4l2sink

您能提供任何通用文件名@mpr工作的示例吗?您是否提供了列表或目录?你能不能在这个答案上贴上更多或详细的说明?我会得到
gstmultifilesrc.c(474):gst\u multi\u file\u src\u create():/GstPipeline:pipeline0/gstmultifilesrc:multifilesrc0:Error reading file'/home/pi/Data/Videos/TimeLapse/12_10\u 18':是一个目录错误:管道不想预滚。
如果我尝试将*.jpeg添加到目录中,也会中断。只是在寻找管道配方!为了以上评论的完整性,我发现Gstreamer确实接受符号链接。因此,获得一个用于预处理的变体将非常有效:
mkdir tmp curIdx=0;对于*.JPG中的curFile;do outFile=$(printf“/tmp/img_%04d.jpg”“$curIdx”);echo'文件:'$curFile'->'$outFile;ln-s$curFile$outFile;curIdx=$(expr$curIdx+1);完成
Reference:您能提供通用文件名@mpr的任何示例吗?您是否提供了列表或目录?你能不能在这个答案上贴上更多或详细的说明?我会得到
gstmultifilesrc.c(474):gst\u multi\u file\u src\u create():/GstPipeline:pipeline0/gstmultifilesrc:multifilesrc0:Error reading file'/home/pi/Data/Videos/TimeLapse/12_10\u 18':是一个目录错误:管道不想预滚。
如果我尝试将*.jpeg添加到目录中,也会中断。只是在寻找管道配方!为了以上评论的完整性,我发现Gstreamer确实接受符号链接。因此,获得一个用于预处理的变体将非常有效:
mkdir tmp curIdx=0;对于*.JPG中的curFile;do outFile=$(printf“/tmp/img_%04d.jpg”“$curIdx”);echo'文件:'$curFile'->'$outFile;ln-s$curFile$outFile;curIdx=$(expr$curIdx+1);完成
参考: