2010-04-27 10:05:36 +0000 2010-04-27 10:05:36 +0000
72
72
Advertisement

如何将每N秒一帧的视频提取为图像?

Advertisement

我如何将视频文件转换为一系列图像,例如每N秒一帧。mplayer或ffmpeg可以做到吗?我曾使用MPlayer手动抓取屏幕截图,但我想自动处理一个长视频。

Advertisement
Advertisement

答案 (8)

73
73
73
2014-03-15 09:47:20 +0000

使用ffmpeg很简单,它可以每N秒输出一帧画面,无需额外的脚本。如果要输出为图像序列,只需使用myimage_%04d.png或类似的输出。%0xd位会被转换为x位长的零填充整数–我举的例子是输出为

  • myimage_0000.png,
  • myimage_0001.png,
  • myimage_0002.png

你可以使用很多静态图像格式, png, jpeg, tga, 等等 (完整的列表见ffmpeg -formats).

好了,现在我们知道了如何将电影输出为一连串的图像,但如果我们不想输出每一帧图像呢?

诀窍是使用-r n选项将输出的帧率改为我们想要的任何格式,其中n是每秒的帧数。每秒钟1帧是-r 1,每四秒一帧是-r 0.25,每十秒一帧是-r 0.1,以此类推。

所以综合起来,每四秒保存一帧input.movoutput_0000.pngoutput_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

所以在脚本中使用双倍%%,在交互式命令行中使用单倍%。在任何一种情况下弄错都会产生错误。

28
28
28
2010-04-28 10:08:07 +0000
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
11
Advertisement
11
11
2010-04-27 11:41:07 +0000
Advertisement

使用 ffmpeg ,您可以执行以下命令。

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

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

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

8
8
8
2013-06-04 08:15:55 +0000

如果你正在寻找一种联系表,如果你使用的是类似Unix的操作系统,你可以使用这个精心设计的脚本,调用到点 视频联系表/*NIX ,简称vcs

在后台,它还使用ffmpeg(默认)或mplayer,因此可以处理很多视频格式。它自动从电影中捕捉静止图像,并将其合成为带有页眉和页脚的图像。您可以选择您想要的捕捉次数,或者选择它们之间的时间差。

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

vcs -i 10m input.avi

查看完整的命令行选项列表以获得其他的调整。

这里是一个联系表的例子,取自主页

7
Advertisement
7
7
2012-09-11 03:17:14 +0000
Advertisement

在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帧(–场景比例=24),从00:00:10开始,到00:00:11结束。

刚刚测试并确认在全新的Windows 8系统上使用VLC 2.0.3可以工作(我没有额外的视频插件或软件)。

完整的文档。http://wiki.videolan.org/Howtocreate_thumbnails

2
2
2
2010-04-27 10:13:07 +0000
1
Advertisement
1
1
2010-04-27 16:22:46 +0000
Advertisement

你也可以试试这个

从VLC命令行……

vlc “C:\YOUR\file/path/file.avi” -V image –imag-out-prefix=capname –imag-out-ratio=60

file. avi是你要抓取的视频,capname是保存的图像的前缀,你可能想玩玩这个比例(60意味着60张图像中有1张被抓取),你可以添加更多的命令,例如–image-out-format jpeg会将你的盖帽保存为jpegs而不是pngs,–snapshot-path让你选择保存盖帽的位置。 以上来源

1
1
1
2011-11-30 22:06:24 +0000

你可以在VirtualDub中跳过一帧,只要在视频–>帧率菜单中使用 “Decimate By "选项。只要使用 "Decimate By "选项,位于Video -> Frame Rate菜单。例如,如果您设置 "Decimate By 100",然后使用文件->导出->图像序列,它将只保存每100帧。

Advertisement
Advertisement