FFMPEG生成N个均匀间隔的PNG屏幕截图

Kev*_*tre 4 ffmpeg

我正在尝试使用FFMPEG为上传的视频生成8个屏幕截图.我目前有:

ffmpeg -i Trailer-720p.mov -r .2 -vcodec png Preview-%d.png

每5秒生成一次屏幕截图.如何添加为分配超过总时间百分比的帧生成屏幕截图的功能.谢谢.此外,是否可以生成50%的屏幕截图?谢谢.

rel*_*let 9

如果仅使用-i参数运行ffmpeg,它将为您提供stderr上的视频长度(以及许多其他内容).你可以写一些东西,将持续时间和预期的帧数转换为正确的-r参数.

这是python中的一个快速示例,它基本上完成了我所描述的内容.出于某种原因,我的ffmpeg版本生成的前两个静止图像都显示帧0,但预览-3到预览n的帧间隔正确.运行它,将第二个参数设置为'1',它将生成中间帧为Preview-3.png.

#!/usr/bin/env python

import sys,os,re
from subprocess import *

if len(sys.argv)<=1:
  print("usage: python oneinn.py filename frames")
  sys.exit(0)

try:
  fvideo = sys.argv[1]
  frames = float(sys.argv[2])
except:
  sys.stderr.write("Failed to parse parameters.\n")
  sys.exit(1)

output = Popen(["ffmpeg", "-i", fvideo], stderr=PIPE).communicate()

# searching and parsing "Duration: 00:05:24.13," from ffmpeg stderr, ignoring the centiseconds
re_duration = re.compile("Duration: (.*?)\.")
duration = re_duration.search(output[1]).groups()[0]

seconds = reduce(lambda x,y:x*60+y,map(int,duration.split(":")))
rate = frames/seconds

print("Duration = %s (%i seconds)" % (duration, seconds))
print("Capturing one frame every %.1f seconds" % (1/rate))

output = Popen(["ffmpeg", "-i", fvideo, "-r", str(rate), "-vcodec", "png", 'Preview-%d.png']).communicate()
Run Code Online (Sandbox Code Playgroud)


小智 7

或者只是使用shell命令:

ffmpeg -i input.m4v -vf fps = 1/$(echo'scale = 6;'$(ffprobe -loglevel quiet -of'compact = nokey = 1:print_section = 0'-show_format_entry duration input.m4v)'/ 10 '| bc)-vframes 10 -qscale:v 2 thumbnail-%d.png

这将创建10个缩略图,其尺寸与源视频相同.