ffmpeg 详解裁剪素材 -ss、-t、-to 参数

先说点题外话。如果对ffmpeg的各种参数感兴趣的话,可以用“ffmpeg -h”命令行查询。如下:(具体就不截了)

ffmpeg -h 查看基本参数设置

ffmpeg -h long 查看更多的参数设置

ffmpeg -h full 查看全部的参数设置(包括全部容器格式和编解码器明确的设置参数,非常长)(好像在这个cmd窗口都看不完,推荐https://www.iteye.com/blog/keren-1773536)

ffmpeg -h type=name 查看全部的解码器、编码器、解封装器、封装器、滤镜、比特流滤镜参数设置

一、-ss、-t与-to参数的介绍

“-ss”,time offset,起始时间。我们通过“-ss”参数来设定要从媒体文件的哪个时间点开始进行操作,而在这个时间点之前的部分就默认舍弃不作输出了。

例如,想要从视频的2秒开始做什么处理,我们输入“-ss 2”。如果想要很精确的时间也可以,比如“-ss 1:23.456”,表示设定从1分23秒456毫秒开始。

“-t”,duration,持续时间。通过“-t”参数来设定我们对音视频等媒体文件的编辑处理要持续多长时间。最后看命令行具体内容来看是否输出这段时间所记载的部分。

与“-ss”一样的道理,“-t 4”表示需要持续4秒进行处理所输入的文件,“-t 0:14.678”表示持续14秒678毫秒处理所输入的文件。至于这个“处理”是什么编辑操作等,就要看其它具体的参数设置了,“-t”只是像提供一个“记录时间”的秒表而已。

“-to”,stop,截止时间。通过“-to”参数来设定对媒体文件的编辑处理到什么时间点结束。需要这个用法的话,“-to”一定要写在“-i”前面!!否则就和“-t“一样是描述持续时间的了。

“-to”与“-t”类似,用法也是诸如“-to 5”、“-to 2:18.963”,表示到5秒、2分18秒963毫秒截止。我们也可以用“-ss”与“-to”来剪辑,这样是设定好起点和终点,“-to”的时间点减去“-ss”的就是最后输出文件的时长。

因此,本文中我们运用的就是“-ss”、“-t”或“-to”来进行简单剪辑。“-ss”与“-t”这样是设定好起点和持续时间,“-t”所记录的时间就是最后输出文件的时长。“-ss”与“-to”是设定好起点与终点,而不用想持续时间是多长。

二、简单剪辑音视频及字幕

(这里以视频为例,音频、字幕文件同理的)现在有个很明显的问题:我怎么知道想剪的,比如精确到多少毫秒的时间点数据?

up推荐用potplayer播放器查看(官网下载http://potplayer.daum.net/?lang=zh_CN)(资源下载http://www.potplayercn.com),当然一些播放器也都能做到查看当前播放的精确时间点。

up就以potplayer为例,任意打开一个视频,按键盘的“D”键定位到当前播放的上一帧,“F”键定位当前的下一帧(对音频好像只有“D”键有用,不过感觉也行了)。左上角便有精确的当前时间点数据。

剪辑的命令行如下:

ffmpeg -ss 0:14.000 -i .\in.mp3 -c copy .\out.mp3

ffmpeg -i .\in.flv -ss 1:23.456 -t 15 -c copy .\out.mp4

(从起点开始保留15秒,顺便转码)

ffmpeg -ss 2 -to 0:16.123 -i .\in.ass -c copy .\out.ass

(设定剪辑的起点与终点,保留中间14秒123毫秒)

上述要注意两点:如果只有“-ss”设定的起点,那么意思是ffmpeg将剪去从最开头0:00到起点0:14这14秒,相当于剪去开头,留下的进行最后输出(就是前面说的默认舍弃的解释)。

如果没有“-c copy”也能剪,相当于让ffmpeg以它自己默认方式重新编码输出,这固然费力不讨好了。当然如果是想转码的话,也可以自行设定想要的编码格式,剪辑和转码一起做。就只是剪辑的话,up建议大家加上“-c copy”。如下图:

这表示从13秒开始,持续42秒,也就是到原本视频的55秒截止,保留中间这段,其它不要。像这样把“-t”写在“-i”前面也是可以的。红圈的speed表示运行速度,一般像这种几百的数就是1秒左右就完成剪辑和输出了(就是“高效转码”以及记得“-c copy”的道理)。

up建议将“-ss”、“-t”、“-to”放在“-i”的前面,如“ffmpeg -ss 12 -to 27 -i ……”。这涉及到ffmpeg命令行工作原理理解的问题。将这些“剪辑参数”放在输入文件前面的话意思是让ffmpeg先对输入文件进行“时间定位”,再去做接下来的其它事(这样剪辑省时但可能不够精确)。“剪辑参数”放在“-i”后面也可以,相当于让ffmpeg做完其它事后,最后对输出文件进行“时间定位”之后输出(这样剪辑比较费时但也许更精确)。

所以说,ffmpeg剪辑也不是没有缺点。例如可能会出现开头一点音画缺失、剪辑是时间点还是不够准确的情况。这样的话up建议将想剪的片段的起点往前5秒,终点往后5秒左右,这样无论对平时观看或者作素材用也影响不大。(另可参考https://blog.csdn.net/matrix_laboratory/article/details/53157383)

三、视频画面截图、导出帧图片

有时看影视剧,想把某些过瘾的画面存下来另作它用,或者有些需要“暂停成功”的画面,自己很难去截到,我们就可以用ffmpeg来存图,或者对已有图片进一步地裁剪。

很简单,视频画面截图或者导出帧图片的命令行如下:

ffmpeg -ss 19 -to 21 -i .\in.mp4 .\%03d.png

表示导出从视频的第19秒到21秒,这2秒内的所有帧图片。

这里解释两点。“帧”是“帧率”的意思,单位是“帧/每秒”,每秒多少帧就是说每秒播放了多少张图片(不懂可以自行去搜一搜“帧”)。“%03d”的意思是让电脑自己以3位数字从小到大依次命名输出的文件,例如001.png、002.png……

还有其它各种形式面对各种需求的视频截图命令行,这个感兴趣自己探究吧,up就以后再说啦。(up觉得这条已经很普适很够用了)如下图:

从视频第13秒开始,导出之后3秒的所有帧图片,一共75张