改变视频每一帧的显示时间戳(PTS),就能改变视频流的播放速度。可以采用两种方法:使用需要重新编码的 setpts 视频过滤器;或者先把视频导出为原始位流以去掉时间戳,再在封装回容器时生成新的时间戳。
注意:以下视频示例不改变音频流,因此最好使用 -an 禁用音频。
原始位流方法
这种方法不重新编码,除了改变时间戳之外,视频流按原样复制。如果不需要对输入视频做其他修改,可以使用它。
首先,把视频复制为原始位流格式。
对于 H.264:
ffmpeg -i input.mp4 -map 0:v -c:v copy -bsf:v h264_mp4toannexb raw.h264
对于 H.265:
ffmpeg -i input.mp4 -map 0:v -c:v copy -bsf:v hevc_mp4toannexb raw.h265
然后在封装到容器时生成新的时间戳:
ffmpeg -fflags +genpts -r 30 -i raw.h264 -c:v copy output.mp4
使用边界:这里的 raw.h264 与前面 H.264 导出示例对应;使用 H.265 时需要采用相应的 raw.h265 文件。改变输入帧率会重新解释播放时间,不会补回原始录制中不存在的帧。
把 -r 的值改为想要的播放帧率。
setpts 过滤器
使用 setpts 过滤器把视频速度加倍,可以执行:
ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
过滤器通过修改每一帧的显示时间戳(PTS)来工作。例如,两个连续帧原本显示在时间戳 1 和 2;要让视频加速,应把它们改为 0.5 和 1。因此,需要把时间戳乘以 0.5。
在保持原输出帧率的情况下,这种变速方式会通过丢帧实现目标速度。可以指定高于输入的输出帧率来避免丢帧。例如,输入是 4 FPS,要加速为四倍并用 16 FPS 输出:
ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv
要让视频减速,应使用大于 1 的乘数:
ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv
让视频更平滑
可以用 minterpolate 视频过滤器让慢放或快放的视频更平滑,这也称为运动插值或光流。
ffmpeg -i input.mkv -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv
功能核对:这条示例设置插值后的输出帧率为 120 FPS,本身不等同于改变播放速度;需要在适当位置与时间戳变速处理组合。插值可能出现运动伪影,不能保证还原真实运动细节。
其他可选工具有 slowmoVideo 与 Butterflow。
音频加速与减速
可以使用 atempo 音频过滤器加速或减速音频。要把音频速度加倍:
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
atempo 的单个实例取值范围为 0.5 到 100.0,也就是最慢为原速的一半、最快为输入的 100 倍。如果需要超出单个实例的范围,可以串联多个 atempo 过滤器。下面把音频加速到四倍:
ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv
使用复杂过滤图,可以同时加速视频和音频:
ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
使用前面的原始位流方法,则无需复杂过滤图。可以这样同时放慢一个 30 FPS 视频及其音频:
ffmpeg -fflags +genpts -r 15 -i raw.h264 -i input.mp4 -map 0:v -c:v copy -map 1:a -af atempo=0.5 -movflags faststart output.mp4
原文:Speeding up/slowing down video。署名:Contributors to the FFmpeg Community Documentation Wiki。原文社区文档依据 WikiStart 的许可声明 按 CC BY-SA 3.0 发布;本中文改编也采用 CC BY-SA 3.0。修改:完整汉化 18 段正文,保留全部 11 个命令示例,补充帧率同步、对应位流文件和插值的功能边界;未实际运行 FFmpeg,未生成或实测视频。











暂无评论内容