是否有任何程序可以让我指定视频文件的一部分(avi、mpeg、mp4...)并每隔某秒/分钟拍摄“快照”,并将其存储为一系列图像文件(例如 jpeg)?例如,选择 0h45m 到 1h00m 之间的电影部分,并每 30 秒拍摄一次“快照”。
它可能是视频播放器(例如 VLC)的一部分或插件......重点是我需要自动拍摄快照的东西,而不是手动拍摄快照。
此外,是否有任何好的程序可以将此类一系列图像文件转换为动画 GIF 或 PNG 文件? (如果快照程序可以选择将快照保存为动画 GIF/PNG,那当然是一个额外的好处。)
答案1
您可以用来ffmpeg
执行此操作。有ffmpeg 网站上有几个例子。
这里有几个:
这将每分钟创建一个缩略图,名为
img001.jpg
,img002.jpg
,img003.jpg
, ... (%03d
表示每个缩略图的序号应使用 3 位数字进行格式化)$ ffmpeg -i myvideo.avi -f image2 -vf fps=fps=1/60 img%03d.jpg
这将每 10 分钟创建一个缩略图,名为
thumb0001.bmp
,thumb0002.bmp
,thumb0003.bmp
, ...$ ffmpeg -i test.flv -f image2 -vf fps=fps=1/600 thumb%04d.bmp
如果你想把它们制作成短视频,你可以再次寻求帮助ffmpeg
。讨论于他们网站的这个页面。
这里还有几个例子:
此处,每个图像的持续时间为 5 秒(每秒 1/5 帧的倒数)。通过告诉 FFmpeg 将输入文件的 FPS 选项(每秒帧数)设置为某个非常低的值,我们使 FFmpeg 在输出处重复帧,从而实现在屏幕上显示每个图像一段时间:
$ ffmpeg -f image2 -r 1/5 -i img%03d.png -c:v libx264 -r 30 out.mp4
如果您没有按系列(
img001.jpg
、img002.jpg
、img003.jpg
)编号和排序的图像,而是随机的图像串,则 ffmpeg 还支持 bash 样式的通配符(* 代表任意数量的任意字符):$ ffmpeg -f image2 -r 1 -pattern_type glob -i '*.jpg' -c:v libx264 out.mp4
或者对于 png 图像:
$ ffmpeg -f image2 -r 1 -pattern_type glob -i '*.png' -c:v libx264 out.mp4
要将生成的视频制作为动画 gif,您可以使用他的 SO Q&A 中概述的步骤,标题为:如何使用ffmpeg从avi生成gif?:
$ ffmpeg -i video.avi -t 10 out%02d.gif
然后:
$ gifsicle --delay=10 --loop *.gif > anim.gif
这是该工具的链接gifsicle
。
答案2
也开始了,ffmpeg
但 @slm 打败了我:)
无论如何,您还可以用来mplayer
进行快速而简单的转储。例如:
mplayer -nosound -ss 45:00 -endpos 15:00 -vo png:z=7 -sstep 30 your_vid.mp4
-ss
是起始位置。-endpos
是持续时间。-vo
需要输出驱动器。用于mplayer -vo help
获取列表。许多发行版还在大多数 mplayer 选项上提供制表符补全功能:mplayer -vo
TabTab-sstep 30
表示每帧之间间隔 30 秒。
开始和结束位置:
<[[hh:]mm:]ss[.ms]|size[b|kb|mb]>
由于需要进行大量计算和缓冲,因此不是 100% 准确,但通常足够接近。
它还有一个 gif89a 驱动程序,但质量不是最好的(与转储图像、使用convert
eg 转换和编译视频相比gifsicle
)。你当然可以玩它。更适合从电影中制作快捷方式,如 gif 所示的头像:
mplayer -ao null -ss 10:00 -endpos 5 -vo gif89a:fps=5.3 -vf palette,softskip,scale=240:135 videofile.ext
然后,您还可以通过以下方式指定输出文件:
-vo gif89a:fps=4.9:output=sample.gif
非常侧面,完全不相关,但是为了显示 的范围-vo
,是 ASCII 格式:
mplayer -vo aa -monitorpixelaspect 0.5 video.mp4
最大化输出窗口并后退 5 步。