我有一个 mp4 格式的视频,帧速率为.33
(1 帧 3 秒)。我想将帧速率提高到 5 帧/秒。我试过下面的命令,但它没有做任何事情:
ffmpeg -i <input.mp4> -r 5 <output.mp4>
Run Code Online (Sandbox Code Playgroud)
知道为什么 ffmpeg 忽略-r
选项吗?
我知道这是一个老问题,但目前的答案都不再是推荐的方式。
正如评论指出的是有办法做到这一点,其中的视频并没有 要被重新编码。它需要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 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)
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)
如果输入文件没有有效的帧速率,您可能必须明确设置它
ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
Run Code Online (Sandbox Code Playgroud)
如果输入文件被归类为“原始”文件,我只能使更改的帧速率生效:
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
输出选项时,它会复制或丢弃帧,因此视频以相同的速度播放 - 在这种情况下,这不是您想要的!但按上述方式更改输入帧速率将导致视频加速或减慢,而不会丢失或重复帧。