FFmpeg捕获当前帧并覆盖图像输出文件。

15

我正在尝试从RTSP流的URL中每秒(也可以是每1分钟)提取图像文件并覆盖此图像文件。

我的下面代码可以工作,但会输出多个图像JPG文件:img1.jpg、img2.jpg、img3.jpg...

ffmpeg -i rtsp://IP_ADDRESS/live.sdp -f image2 -r 1 img%01d.jpg

如何在Linux中使用ffmpeg或bash脚本以非高频率(例如1分钟或10秒)连续提取图像的同时覆盖相同的图像文件?


据我所知,图像2有一个“updatefirst”选项,只要记住如果你在Windows上,它将在你尝试读取文件时覆盖文件,这可能会导致冲突/碰撞。 - rogerdpack
5个回答

22
为了进一步解释pragnesh已经给出的accepted answer,以下是关于FFmpeg的内容。
正如ffmpeg documentation所述: ffmpeg命令行选项被指定为 ffmpeg [global_options] {[input_options] -i input_file} ... {[output_options] output_file} ...
因此,
ffmpeg -i rtsp:// -f image2 -update 1 img.jpg
使用output option-f image2,强制输出格式为image2格式,作为混合器阶段的一部分。
请注意,在ffmpeg中,如果输出文件名指定了图像格式,则默认使用image2复用器,因此命令可以缩短为: ffmpeg -i rtsp:// -update 1 img.jpg。 image2格式复用器需要一个文件名模式,例如以生成一个按顺序编号的文件系列。如果将update选项设置为1,则文件名将被解释为仅是文件名,而不是模式,从而覆盖相同的文件。
使用-r,设置帧速率,video option有效,但会产生大量丢帧消息,这让我很烦恼。
感谢同一主题下的另一个答案,我找到了fps视频过滤器,效果更好。

因此,我的有效命令版本为

ffmpeg -i rtsp://<rtsp_source_addr> -vf fps=fps=1/20 -update 1 img.jpg

由于某些原因,我无法达到的最低帧速率为1/20或0.05。

还有视频过滤缩略图,它从一系列帧中选择图像,但这需要更多的处理,因此我不建议使用它。

我在FFMpeg在线文档中找到了大部分内容和更多信息。

AVconv

对于那些使用avconv的人来说,它非常相似。毕竟,它们曾经是一个共同的库的分支。AVconv image2文档在此处找到

avconv -i rtsp://<rtsp_source_addr> -vf fps=fps=1/20 -update 1 img.jpg

正如Xianlin指出的那样,可能还有其他几个有趣的选项可供使用:

-an:禁用音频记录。

-r < fps >:设置帧率

导致另一个版本:

avconv -i rtsp://<rtsp_source_addr> -r 1/20 -an -update 1 img.jpg

希望这有助于理解可能需要进一步调整的内容;)


使用avconv代替ffmpeg,命令为avconv -i rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov -r 1/20 -an -y -update 1 test.jpg - Xianlin
根据**-r** 视频选项文档,**-r选项实际上会导致插入fps过滤器。因此,-vf fps=fps=1/20也应该能够达到同样的效果。但是使用-r更简短 :) 此外,我认为您不需要-y** (覆盖输出文件而不询问)选项,因为-update 1已经知道它应该进行覆盖。添加-an**是一个有趣的选择,可以减少进程猜测。感谢评论,我将使用avconv选项更新答案。 - Pau Coma Ramirez

16

以下命令行应该适用于您。

ffmpeg -i rtsp://IP_ADDRESS/live.sdp -f image2 -updatefirst 1 img.jpg

2
这在我的电脑上能正常工作,我添加了“-r 1/5”选项以便每5秒进行一次截屏。 - Xianlin
@pragnesh 你要如何才能将每个屏幕截图保存在不同的文件中? - Matias
2
似乎在FFmpeg 4.X版本中已经移除了updatefirst - chubao
2
正如所指出的,-updatefirst选项已被删除并不再起作用。请改用-y选项。 - Sean Ferons

2

我无法使用选项-update覆盖.jpg文件。通过一些实验,我找到了一个可行的解决方案(至少对我有效),在命令末尾加上选项-y(大写不起作用)。我还需要使用http://而不是rstp://来访问此摄像头。

ffmpeg -i http://xx:yy@192.168.1.xx:yyy/snapshot.cgi /tmp/Capture2.jpg -y


0

1
那么在60秒内我会有6张图片,如果我只想要同一张图片被覆盖6次怎么办?这就是我需要的。 - Xianlin
你尝试过使用选项“-y(全局)”吗?覆盖输出文件而无需询问。 - Kokkie

0

ffmpeg -i rtsp://root:password@192.168.1.1/mpeg4 -ss 00:00:01 -f image2 -vframes 1 thumb.jpg

  • 请将上述命令中的rtsp协议url替换为您自己的url
  • 确保时间参数为00:00:01
  • 如果您输入其他数字,可能会导致图像损坏

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接