如何将视频文件转换为图像序列,例如每 N 秒一帧。mplayer 或 ffmpeg 可以做到这一点吗?我曾使用 MPlayer 手动截取屏幕截图,但我想自动执行此操作以处理长视频。
答案1
使用 ffmpeg 非常简单,而且能每N秒输出一帧没有额外的脚本。要导出为图像序列,只需使用myimage_%04d.png
或类似作为输出。%0xd
位转换为零填充的整数x
数字长 - 我给出的示例输出为
myimage_0000.png
,myimage_0001.png
,myimage_0002.png
ETC..
您可以使用多种静态图像格式,png、jpeg、tga 等等(请参阅ffmpeg -formats
完整列表)。
好的,现在我们知道如何将电影导出为一系列图像,但是我们不想导出每一帧?
诀窍是使用选项简单地将输出的帧速率更改为我们想要的任何值,-r n
其中n
表示每秒的帧数。每秒 1 帧为-r 1
,每四秒 1 帧为-r 0.25
,每十秒 1 帧为,-r 0.1
等等。
总而言之,input.mov
每四秒保存一帧到output_0000.png
等的方式如下output_0001.png
:
ffmpeg -i input.mov -r 0.25 output_%04d.png
请注意,-r 0.25
选项后-i input.mov
因为它控制着输出.如果你把它前输入它将把输入文件视为具有指定的帧速率。
将 %xd 更改为您需要的任意数字,例如,如果命令将创建超过 10,000 帧,则将 更改为%04d
。%05d
这也适用于输入文件为图像序列。阅读更多这里。
Windows 用户:在命令行上使用%
例子:ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png
在 CMD 和 BAT 脚本中使用%%
例子:ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png
%%
因此,在脚本中应使用 double ,而%
在交互式命令行中应使用 single。在任何一种情况下,如果操作错误,都会导致错误。
编辑值得一看的是下面评论中关于文件类型的讨论。每种类型都有优点和缺点:
- JPEG格式很多文件较小,有损,仅 8 位颜色,无 alpha。
- png 无损,文件大,速度慢。8 位颜色支持 alpha。
- tiff 无损,甚至更大的文件,速度快,支持最多 16 种颜色和 alpha。
要指定文件格式,只需在输出文件中使用所需的扩展名,例如myimage_%04d.jpg
,myimage_%04d.png
或myimage_%04d.tiff
答案2
mplayer -vo jpeg -sstep 5 file.avi
每 5 秒将保存一帧为 jpeg 文件。
但是,它不会在文件末尾停止,它会继续生成最后一帧的副本。为了避免这种情况,请使用其他播放器或 mplayer 查找视频的时长(以秒为单位):
mplayer -vo null -ao null -frames 0 -identify file.avi
并查找类似“ID_LENGTH=147.00”的行。
从长度中减去 2,并将此值用作选项-endpos
。例如,对于 147 秒的视频:
mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
答案3
和ffmpeg
,您可以执行以下操作:
ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg
此命令在视频的第 4 秒生成 320×240 大小的 JPG 缩略图。将其放入更改时间和文件名的脚本中即可完成。
更多信息:每隔 X 秒创建一个视频缩略图
答案4
使用 VLC 1.1.0 及以上版本,您可以使用场景视频滤镜:
vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit
上述操作每 24 帧保存 1 帧(--scene-ratio=24),从 00:00:10 开始,到 00:00:11 结束。
刚刚测试并确认它可以在全新安装的 Windows 8 上与 VLC 2.0.3 配合使用(我没有其他视频插件或软件)。