无损(视频)重混

无损(视频)重混

我有一个 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其用作输出选项时,它会重复或丢弃帧,因此视频以相同的速度播放 - 在这种情况下,这不是您想要的!但如上所述更改输入帧速率将导致视频加速或减速,而不会丢失或重复帧。

答案4

有一个非常简单的方法——使用MKVToolNix

在内部,mp4 文件被无损转换(在几分之一秒内)为具有相同编解码器的 MKV 容器。

将 mp4 视频的帧速率从 100fps 更改为 30fps

相关内容