使用 ffmpeg 更改 MP4 视频的帧速率

fir*_*key 10 video mp4 ffmpeg

我有一个 mp4 格式的视频,帧速率为.33(1 帧 3 秒)。我想将帧速率提高到 5 帧/秒。我试过下面的命令,但它没有做任何事情:

ffmpeg -i <input.mp4> -r 5 <output.mp4>
Run Code Online (Sandbox Code Playgroud)

知道为什么 ffmpeg 忽略-r选项吗?

pse*_*ant 9

我知道这是一个老问题,但目前的答案都不再是推荐的方式。

无损(视频)重混

正如评论指出的是有办法做到这一点,其中的视频并没有 要被重新编码。它需要remuxing文件到不同的containter格式MKV,然后remuxing它放回一个MP4。这是将视频更改为 12 帧/秒的示例:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4
Run Code Online (Sandbox Code Playgroud)

如果视频包含音频,您也可以在不改变音高的情况下放慢速度,但这不是无损转换。下面的示例假设源视频为 24 帧/秒,因此需要使用 ffmpeg 的节拍滤波器将音频减慢到一半 (0.5) 速度。

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4
Run Code Online (Sandbox Code Playgroud)

FFMPEG 维基指南

这是来自ffmpeg wiki的指南。请注意,所有这些选项都需要重新编码视频。

加速/减速视频

您可以使用 ?setpts 视频过滤器更改视频流的速度。请注意,在以下示例中,音频流未更改,因此理想情况下应使用 -an 禁用它。

要将视频速度加倍,您可以使用:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
Run Code Online (Sandbox Code Playgroud)

该过滤器通过更改每个视频帧的呈现时间戳 (PTS) 来工作。例如,如果在时间戳 1 和 2 处显示了两个连续帧,并且您想要加速视频,则这些时间戳需要分别变为 0.5 和 1。因此,我们必须将它们乘以 0.5。

请注意,此方法将丢帧以达到所需的速度。您可以通过指定比输入更高的输出帧率来避免丢帧。例如,要将 4 FPS 的输入速度提高到 4 倍 (16 FPS):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv
Run Code Online (Sandbox Code Playgroud)

要减慢视频速度,您必须使用大于 1 的乘数:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv
Run Code Online (Sandbox Code Playgroud)

光滑的

您可以使用 ?minterpolate 视频过滤器平滑慢速/快速视频。这也称为“运动插值”或“光流”。

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv
Run Code Online (Sandbox Code Playgroud)

其他选项包括?slowmoVideo 和?Butterflow。加速/减慢音频

您可以使用 ?atempo 音频过滤器加快或减慢音频速度。要将音频速度加倍:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
Run Code Online (Sandbox Code Playgroud)

atempo 过滤器仅限于使用 0.5 到 2.0 之间的值(因此它可以将其减慢到不低于原始速度的一半,并且加快到不超过输入的两倍)。如果需要,您可以通过将多个 atempo 过滤器串在一起来解决此限制。以下是音频速度的四倍:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv
Run Code Online (Sandbox Code Playgroud)

使用复杂的 filtergraph,您可以同时加速视频和音频:

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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ett 7

如果输入文件没有有效的帧速率,您可能必须明确设置它

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
Run Code Online (Sandbox Code Playgroud)


Mal*_*ous 5

如果输入文件被归类为“原始”文件,我只能使更改的帧速率生效:

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv
Run Code Online (Sandbox Code Playgroud)

如果不指定,-f h264它将默认为 25 fps 并且无法更改。显然这是因为流根本缺少任何帧速率信息,这是 ffmpeg 的默认帧速率。

显然,当您用作-r输出选项时,它会复制或丢弃帧,因此视频以相同的速度播放 - 在这种情况下,这不是您想要的!但按上述方式更改输入帧速率将导致视频加速或减慢,而不会丢失或重复帧。

  • @Paul:您的“.mp4”文件可能不是原始的 H264,那么您必须使用不同的“-f”值来匹配文件内的内部文件格式。 (2认同)