ffmpeg截图

来源:互联网 发布:qq自动群发软件 编辑:程序博客网 时间:2024/05/16 18:58
以下样例基于ffmpeg-0.10.4和ffmpeg-1.2.4均能测试通过

截图命令
./ffmpeg -ss 00:05:00 -i h264_aac_20M.mp4 -t 2 -vframes 10 -s 128x76 -r 1/2 -filter:v "crop=320:240:10:10:keep_aspect=1" -f image2 test-%02d.jpg
命令详解:

-ss: 开始截图时间,有两种格式,一种是秒数,一种是hh:mm:ss[.xxx]

-i: 截图的源文件
    
-t: 截图时长,格式与-ss相同

-vframes: 截图帧数

-s: 图片宽高,格式WxH

-r: 指定帧率,即每秒钟输出的帧数:如果指定为25帧,则每秒截取25帧图;如果指定为1/2,则每秒截取半帧图,可达到两秒钟一张图的目的。
        如果需要在指定时间段内均匀截取固定帧数的(指定了-vframes)图片,则使用该公式计算-r应该指定的值:固定帧数/时间段内的秒数

-filter:v: 设置视频的过滤条件:
crop: 裁剪,crop=output_width:output_height:x:y:keepaspect=1,五个参数分别为:
output_width: 裁减之后输出视频的宽
output_height: 裁减之后输出视频的高
x: 在输入视频上开始裁减的横坐标
y: 在输入视频上开始裁减的纵坐标
keep_aspect: 1表示保持裁剪后输出的纵横比与输入一致,0表示不保持

-f: 指定输出格式

test-%02d.jpg: 支持格式化命名,输出的命名为: test-01.jpg, test-02.jpg, ...

除了输入与输出必须以外,以上其他参数均可相互组合使用

下面是设定了截图的起止时间(-ss和-t)之后并组合使用-vframes或者-r时的区别:
1. 组合使用-vframes来指定截取的帧数时,程序会按时间顺序截取够-vframes这么多的图片为止

2. 组合使用-r来指定每秒的输出帧数,程序则会在这段时间内按照均匀的时间分布来截取图片

Tips:
1. 当-ss设置得越大,程序需要找到位置(或者解码到指定的位置)的时间就越长

2. 以下是从ffmpeg官方文档中摘抄下来的: 
'-ss position (input/output)'
    When used as an input option (before -i), seeks in this input file to position...
    When used as an output option (before an output filename), decodes but discards input until the timestamps reach position...
当-ss用作输入参数(存在于-i参数之前)时,程序会先找到输入文件的指定的这个位置,然后再进行后面的处理...
当-ss用作输出参数(存在于一个输出文件名参数之前)时,程序会先对输入文件进行解码并丢弃这些帧,直到找到指定的这个位置为止...

所以在截图时,如果*将-ss置于-i参数之前*,效率会远远高于作为输出参数时的效率:

视频时长为05:32.12,同样从00:01:30开始截图,第一条命令-ss在-i前,第二条反之

由上图明显可看出,截取同样的时间点的图片,将-ss置于-i参数之前,效率比置于-i后的效率高了不止一个数量级
0 0