我有一个 mp4 格式的视频,帧率为.33
(1 帧 3 秒)。我想将帧率提高到 5 帧/秒。我尝试了以下命令,但没有任何效果:
ffmpeg -i <input.mp4> -r 5 <output.mp4>
知道为什么 ffmpeg 忽略了-r
选项吗?
答案1
我知道这是一个老问题,但当前的答案都不再是推荐的方式。
无损(视频)重混
正如评论中指出的那样,有一种方法可以做到这一点,视频确实不是 必须重新编码。它需要重混将文件转换为不同的 MKV 格式,然后将其重新混合回 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
如果视频包含音频,你也可以减慢速度而不改变音调,但这是不是无损转换。下面的示例假设源视频为 24 帧/秒,因此需要使用 ffmpeg 的阿滕波筛选。
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
FFMPEG Wiki 指南
这是ffmpeg 维基。请注意,所有这些选项都需要重新编码视频。
加速/减慢视频速度
您可以使用 setpts 视频过滤器更改视频流的速度。请注意,在以下示例中,音频流没有改变,因此最好使用 -an 将其禁用。
要使视频速度加倍,您可以使用:
ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
该滤镜通过更改每个视频帧的显示时间戳 (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
要减慢视频速度,您必须使用大于 1 的乘数:
ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv
光滑的
您可以使用 minterpolate 视频滤镜来平滑慢速/快速视频。这也称为“运动插值”或“光流”。
ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv
其他选项包括slowmoVideo和Butterflow。加快/减慢音频
您可以使用 atempo 音频滤镜加快或减慢音频速度。要将音频速度加倍:
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
atempo 过滤器只能使用 0.5 到 2.0 之间的值(因此它可以将速度减慢到不低于原始速度的一半,并且加速到不超过输入的两倍)。如果需要,您可以通过将多个 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
答案2
如果输入文件没有有效的帧速率,你可能必须明确设置它
ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
答案3
如果输入文件被归类为“原始”文件,我才能使改变的帧速率生效:
ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv
如果不指定,-f h264
它将默认为 25 fps,并且无法更改。显然这是因为流缺少任何帧速率信息,而这是 ffmpeg 的默认帧速率。
显然,当您将-r
其用作输出选项时,它会重复或丢弃帧,因此视频以相同的速度播放 - 在这种情况下,这不是您想要的!但如上所述更改输入帧速率将导致视频加速或减速,而不会丢失或重复帧。