FFmpeg 切割视频

来自艺搜天下
跳到导航 跳到搜索

快速定位

将ss放在-i的前面

ffmpeg -ss 00:23:00 -i Mononoke.Hime.mkv -frames:v 1 out1.jpg

基于关键帧的搜索会非常快,现在新版也非常精确了!

精确定位

将ss放在-i的后面

ffmpeg -i Mononoke.Hime.mkv -ss 00:23:00 -frames:v 1 out2.jpg

输入文件会一帧一帧地进行解码直到到达ss所指定的位置,因此会非常慢。而且随着指定时间越长,需要等待的时间也会越长。

快速并且精确定位

需要在输入文件前后同时指定ss参数

ffmpeg -ss 00:22:30 -i Mononoke.Hime.mkv -ss 00:00:30 -frames:v 1 out3.jpg

这种方法综合了上面2种方法的优点。

首先快速定位到3分钟之前的某个时间点,然后从该时间点开始一帧一帧地慢慢解码到3分钟。

FFmpeg会首先快速定位到00:02:30附近的关键帧处,然后开始慢慢往后搜索30秒。结果与“精确定位”相同(左下角也是00:02:05:06),但是速度更快。不过现在新版快速定位也很准确了。

注意上面2个ss时间点(00:02:30和00:00:30)的设置依赖于关键帧的间隔(即GOP的大小)

切割片断

将ss和t参数联合使用,其中t参数指定时长,例如“-ss 60 -t 10”将切割一段从60秒到70秒的片断;

或者使用to选项指定结束时间点,如“ -ss 60 -to 70”也一样切割一段从60秒到70秒的片断;选项t和to不能同时使用,如果你同时指定,默认会使用参数t。

注意

如果仅仅在-i之前指定了ss选项,那么时间戳会被重置为0,此时选项t和选项to产生的效果一样。要保留原始时间戳,可以用-copyts选项(-c copy -copyts)

ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4 #得到从00:01:00 到 00:03:00的片断
ffmpeg -i video.mp4 -ss 00:01:00 -to 00:02:00 -c copy cut.mp4  # 真正得到从00:01:00 到 00:02:00的片断。

如果你切割的时候使用了流拷贝stream copy (-c copy),并且想用 concat demuxer来合并你切割出来的片断,你需要指定`-avoid_negative_ts 1`:

ffmpeg -ss 00:03:00 -i video.mp4 -t 60 -c copy -avoid_negative_ts 1 cut.mp4

时间格式

你可以使用[HH:MM:SS]格式或者以秒为单位,如00:02:30 或者 150。如果你使用了小数,如02:30.05,小数点后面的05表示1秒*5%,即50毫秒 ,如02:30.5表示2分钟,30秒,500毫秒(即半秒)。

参考

http://trac.ffmpeg.org/wiki/Seeking