目录
一. 精确截取视频
1.1 根据原视频,截取产生1个包含很多关键帧的视频step1_output_larger.mkv
1.2 根据step1_output_larger.mkv微调原截取开始时间和持续时间
1.3 根据step1_output.mkv和微调后的开始时间和持续时间产生step2_output.mkv
1.4 其他的处理
1.5 截取的一个示例
网上有很多ffmpeg对视频进行精确剪切的讨论,因为关键帧的问题,导致剪切时间不太精确,本文对视频的精确截取进行了探索,有两个目标:
1. 能精确截取视频。
2. 能保证剪切处声音不会突然截断。
以下的命令均在Ubuntu环境下实现,windows下的ffmpeg不太友好,播放mkv经常出现无法加载字幕的情况。
一. 精确截取视频
仅以1个例子说明,步骤如下:
1.1 根据原视频,截取产生1个包含很多关键帧的视频step1_output_larger.mkv
ffmpeg -y -ss 01:25:24.64 -t 9.8 -intra -accurate_seek -i *.mkv -ss 0 -t 9.8 -g 2 -keyint_min 2 step1_output_larger.mkv
这一步是根据*.mkv产生1个带有很多关键帧的step1_output_larger.mkv,假定截取开始时间为01:25:24.64,持续时间t=9.8s,这个larger是指产生一个比你预期长度要大一点的mkv,这样做的目的是解决上面所述的第2个目标:保证剪切处声音不会突然截断,后面有叙述。
根据实际测试,说明几点:
1)-intra不可以去掉,似乎ffmpeg文档中说-intra可以用-g 1替代,但实际运行会有差异,没有详细研究。
2)accurate_seek用在-i之前。
3)-g 2 -keyint_min 2用来限定2个关键帧的间隔帧数为2,这个2可以根据具体情况自由选取。
4)*.mkv后的-ss 0 -t 9.8如果去掉,会导致*.mkv在重新进行编码时会花费大量的时间,我有点心疼我的电脑...,所以就加上了,加上后效果很明显,编码很快,和闪电侠一样快。
5)*.mkv之后不要再加-codec copy了,否则-g 2 -keyint_min 2就没用了。
如果想了解产生的step1_output_larger.mkv的关键帧数量、音视频长度、视频帧率、音频采样率等信息可以使用ffprobe,有需要的可以研究下。
1.2 根据step1_output_larger.mkv微调原截取开始时间和持续时间
ffmpeg -y -ss timestamp_begin_new -t duration_new -intra -accurate_seek -i step1_output_larger.mkv -codec copy -avoid_negative_ts make_zero step1_output.mkv
说明几点:
1)timestamp_begin_new和duration_new都是微调后的值,确保在timestamp_begin_new时刻的声音不会突然截断,在timestamp_begin_new duration_new时刻声音也不会突然截断,可以先获取step1_output_larger.mkv的音频数据,wav或mp3格式的均可,然后需对音频进行采样,模拟转成数字后,处理上就容易多了,此时的处理类似于在数组中查找第1个0或最后1个0的索引,转化为时间后,再计算该时间相对于原时间的时间偏差,这个偏差 原时间戳开始时间就是timestamp_begin_new。
1.3 根据step1_output.mkv和微调后的开始时间和持续时间产生step2_output.mkv
ffmpeg -y -intra -accurate_seek -ss 0 -t duration_new -i step1_output.mkv -codec copy -avoid_negative_ts make_zero step2_output.mkv
说明几点:
1)此时的ss从0开始,持续时间t改成duration_new。
2)直接使用-codec copy就可以了,无需重新编码了。
1.4 其他的处理
主要是指:
声音和视频的渐入fade_in和渐出fade_out,详细可研究ffmpeg文档;
将mkv转成mp4,同时将mkv的字幕烧写到mp4中,详细可研究ffmpeg文档。
1.5 截取的一个示例
我将MP4转成gif了,可以看到渐出的效果。