如何每 N 秒提取一帧视频到图像?

Lia*_*iam 89 video ffmpeg capture mplayer images

如何将视频文件转换为一系列图像,例如每 N 秒一帧。mplayer 或 ffmpeg 可以做到这一点吗?我已经使用 MPlayer 手动抓取屏幕截图,但我想为长视频自动执行此操作。

sti*_*tib 96

用ffmpeg非常简单,每N秒就可以输出一帧,不需要额外的脚本。要导出为图像序列,只需使用myimage_%04d.png或类似作为输出。该%0xd位被转换为一个用零填充的整数x数字长 - 我给出的例子得到输出为

  • myimage_0000.png,

  • myimage_0001.png,

  • myimage_0002.png

    等等..

您可以使用许多静止图像格式,png、jpeg、tga 等(请参阅ffmpeg -formats完整列表)。

好的,现在我们知道如何将电影导出为一系列图像,但是说我们不想导出每一帧?

诀窍是简单地使用每秒帧数的-r n选项将输出的帧速率更改为我们想要的任何n值。每秒-r 1一帧,每四秒-r 0.25一帧,每十秒一帧-r 0.1,依此类推。

因此,为了把它放在一起,这是它会怎么看待的一帧保存input.mov每四秒output_0000.pngoutput_0001.png等:

ffmpeg -i input.mov -r 0.25 output_%04d.png
Run Code Online (Sandbox Code Playgroud)

需要注意的是,-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

所以%%在脚本中加倍,%在交互式命令行上单选。在任何一种情况下出错都会产生错误。

编辑值得在下面的评论中查看文件类型的讨论。各有优缺点:

  • jpeg文件小,有损,只有 8 位颜色,没有 alpha。
  • png 无损,大文件,慢。8 位颜色支持 alpha。
  • tiff 无损,甚至更大的文件,速度快,最多支持 16 色和 alpha。

要指定文件格式,只需在输出文件中使用所需的扩展名,例如myimage_%04d.jpgmyimage_%04d.pngmyimage_%04d.tiff

  • png 的优点是无损压缩,因此如果您将图像序列用作中间件并且不介意额外的大小,那么您可能会使用 png。 (7认同)
  • 根本不要使用 -r 标志。然后 FFMPEG 将使用输入文件的帧速率。 (6认同)
  • 提示:确保 `-r 1` 在输入文件 *AFTER* 之后,否则它没有预期的效果。 (3认同)
  • 请注意,您**真的**想为此使用`jpegs`,除非您确定`png` 是您想要的。在我的例子中,`jpeg`s 每个大约 50kb,`png`s 大约 2MB。 (2认同)

Lia*_*iam 32

mplayer -vo jpeg -sstep 5 file.avi
Run Code Online (Sandbox Code Playgroud)

每 5 秒将帧保存为 jpeg 文件。

但是,它不会在文件末尾停止,而是会继续生成最后一帧的副本。为避免这种情况,请使用其他播放器或 mplayer 以秒为单位找到视频的持续时间:

mplayer -vo null -ao null -frames 0 -identify file.avi
Run Code Online (Sandbox Code Playgroud)

并寻找像“ID_LENGTH=147.00”这样的行。

从长度中减去 2,并将此值用于-endpos选项。例如,对于 147 秒的视频:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
Run Code Online (Sandbox Code Playgroud)

  • 如今,“mpv --vo=image --sstep=5 movie.mkv”在没有上述错误的情况下工作得很好([mpv](http://mpv.io/) 是 mplayer 的一个分支),使用 mpv 0.27.0德班。 (2认同)

Nif*_*fle 15

使用ffmpeg,您可以执行以下操作:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg
Run Code Online (Sandbox Code Playgroud)

此命令在视频的第 4 秒生成一个 320×240 大小的 JPG 缩略图。把它放在一个改变时间和文件名的脚本中,你就完成了。

更多信息:每 X 秒创建一个视频缩略图

  • 这似乎符合我的要求,但有一个问题。它将在每次迭代中从头开始处理文件,速度呈指数级缓慢。 (2认同)
  • 使用 ffmpeg 有一种更好、*快得多的方法。看我下面的回答。 (2认同)

mpy*_*mpy 9

如果您正在寻找一种联系表,并且您正在使用类 Unix 的操作系统,则可以使用这个精心设计的脚本,称为视频联系表 *NIX,简称vcs

在后台它也使用ffmpeg(默认情况下) or mplayer,因此可以处理很多视频格式。它自动执行从电影中捕获静止图像的过程,并将这些图像合成为带有一些页眉和页脚的图像。您可以选择例如您想要的捕获数量或它们之间的时间差。

对于 10 分钟的间隔,调用是这样的:

vcs -i 10m input.avi
Run Code Online (Sandbox Code Playgroud)

检查命令行选项完整列表以获取其他一些调整。

这是一个示例联系表,取自主页

在此处输入图片说明


Mic*_*ael 7

使用 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
Run Code Online (Sandbox Code Playgroud)

上面保存了每 24 帧中的 1 个(--scene-ratio=24),从 00:00:10 开始到 00:00:11 结束。

刚刚测试并确认这适用于全新的 Windows 8 安装上的 VLC 2.0.3(我没有额外的视频插件或软件)。

完整文档:http : //wiki.videolan.org/How_to_create_thumbnails