=加速/减速视频=
可以通过改变每个视频帧的呈现时间戳(PTS)来改变视频流的速度。这可以通过两种方法完成:使用[http://ffmpeg.org/ffmpeg-all.html#setpts_002c-asetpts setpts]视频过滤器(需要重新编码),或者通过将视频导出为原始比特流格式并在创建新时间戳的同时对容器进行muxing来擦除时间戳。
请注意,在下面的示例中,音频流没有更改,因此最好使用“-an”禁用它。
==原始比特流方法==
这种方法是无损的,除了改变时间戳外,还按原样复制视频流。如果不需要对输入视频进行其他更改,请使用此选项。
首先,将视频复制为原始比特流格式。
对于H.264:
{{{
ffmpeg-i input.mp4-映射0:v-c:v副本-bsf:v h264_mp4toannexb 原始h264
}}}
对于H.265:
{{{
ffmpeg-i input.mp4-映射0:v-c:v副本-bsf:v hevc_mp4toannexb 生h265
}}}
然后在muxing到容器时生成新的时间戳:
{{{
ffmpeg-fflags+genpts-r 30-i raw.h264-c:v copy output.mp4
}}}
将“-r”的值更改为所需的播放帧速率。
==设置过滤器==
要使用setpts过滤器将视频速度提高一倍,可以使用:
{{{
ffmpeg-i输入.mkv-filter:v “setpts=0.5*PTS”输出.mkv
}}}
过滤器的工作原理是改变每个视频帧的显示时间戳(PTS)。例如,如果在时间戳1和2处显示了两个连续帧,并且您希望加快视频速度,则这些时间戳需要分别变为0.5和1。因此,我们必须将它们乘以0.5。
请注意,此方法将丢弃帧以达到所需的速度。通过指定高于输入的输出帧速率,可以避免丢弃帧。例如,要从4fps的输入变为4x(16fps)的输入:
{{{
ffmpeg-i输入.mkv-r 16-filter:v “setpts=0.25*PTS”输出.mkv
}}}
要降低视频速度,必须使用大于1的倍增:
{{{
ffmpeg-i输入.mkv-filter:v “setpts=2.0*PTS”输出.mkv
}}}
===平滑===
您可以使用[http://ffmpeg.org/ffmpeg-filters.html#minterpolate minterpolate]视频过滤器。这也称为“运动插值”或“光流”。
{{{
ffmpeg-i输入.mkv-filter:v “minterpolate='mi\u模式=mci:mc_mode=aobmc:vsbmc=1:fps=120'”输出.mkv
}}}
其他选择包括[https://github.com/slowmoVideo/slowmoVideo/ 斯洛姆莫维迪奥]和[https://github.com/dthpham/butterflow [蝴蝶流]。
=加速/减速音频=
您可以使用[http://ffmpeg.org/ffmpeg-all.html#atempo [音频]滤波器。要将音频速度提高一倍:
{{{
ffmpeg-i输入.mkv-filter:a “atempo=2.0”-vn输出.mkv
}}}
atempo滤波器仅限于使用0.5到2.0之间的值(因此它可以将其速度降低到不低于原始速度的一半,并将速度提高到不超过输入速度的两倍)。如果需要,可以通过将多个atempo过滤器串在一起来绕过此限制。以下是音频速度的四倍:
{{{
ffmpeg-i输入.mkv-filter:a “atempo=2.0,atempo=2.0”-vn输出.mkv
}}}
使用复杂的filtergraph,您可以同时加速视频和音频:
{{{
ffmpeg-i input.mkv-filter_complex“[0:v]setpts=0.5*PTS[v][0:a]atempo=2.0[a]“-map”[v]“-map”[a]“输出.mkv
}}}