使用ffmpeg更改MP4视频的帧频


8

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

ffmpeg -i <input.mp4> -r 5 <output.mp4>

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


如果你想加速/减速的视频,而不是重复/丢帧,见superuser.com/questions/854753/...和/或askubuntu.com/questions/370692/...
彼得·科德斯

Answers:


7

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

无损(视频)重混合

正如评论指出的是有办法做到这一点,其中的视频并没有 要被重新编码。它需要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

如果视频中包含音频,您也可以在不改变音调的情况下放慢声音,但这并不是无损的转换。下面的示例假定源视频为24帧/秒,因此需要使用ffmpeg的atempo滤波器将音频速度减慢到一半(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

FFMPEG Wiki指导

这是ffmpeg Wiki的指南。请注意,所有这些选项都需要对视频进行重新编码。

加快/减慢视频

您可以使用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

光滑

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

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之间的值(因此,它可以将其减慢到不小于原始速度的一半,并将速度减慢至不超过输入速度的两倍)。如果需要,可以通过将多个临时过滤器串联在一起来解决此限制。以下是音频速度的四倍:

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

1
仅通过重新混合就可以加快/减慢速度,但是FFmpeg不知道该怎么做。例如对于mkv,mkvtoolnix可以做到。例如,mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv 更改MKV容器上的帧速率。您可以重新混合为MKV,然后返回MP4,或者找到直接为MP4执行此操作的工具。对视频进行X编码非常耗CPU且有损,因此这是一个可怕的选择。
彼得·科德斯

完全同意,重新分配为较低的帧速率是首选,因为这是一种无损方法,占用资源少得多。在实践中,我还没有找到用于MP4的良好工具。我最近还没有尝试过,但是当我第一次编写此答案时,我已经进行了MP4-> MKV-> MP4重混音,并且无法使用mkvtoolnix,ffmpeg和/或mp4box使其工作。我将不得不尝试您建议的参数。
pseudosavant

6

如果输入文件没有有效的帧频,则可能需要显式设置它

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4

当您真的只需要重新混合时,此代码会转码。(除非您实际上是要复制/丢帧而不是放慢/加快视频。)
Peter Cordes

3

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

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

如果未指定,-f h264则默认值为25 fps,并且无法更改。显然这是因为流根本没有任何帧速率信息,这是ffmpeg的默认帧速率。

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


1
我有用的答案。这里没有重新编码
yota

1

改变帧速率的这种功能称为“顺应性”,通常用于产生慢动作或快进效果,就像在几分钟内显示植物的生长。ffmpeg不允许在不重新编码的情况下覆盖/更改帧率。如果这样做,则持续时间将改变并且音频将不同步,除非另行修改。但是,对于您的情况,如果帧速率为.33,恐怕音频不会引起您的兴趣

您想要符合标准,因为您只想更改帧速率,但是ffmpeg会-r默默忽略如果在输入文件中指定了帧速率。由于您的输入文件为.mp4格式,因此其自身的帧速率优先于-r当不需要重新编码时。为此,您需要使用其他工具:mencoder。

假设您的输入文件中没有声音-任何具有.33帧频的视频都可能是真实的-您需要的是:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

请注意,默认情况下,mencoder会以AVI格式生成输出。


1
错了 如果r将其指定为输出开关,则ffmpeg将以指定的帧速率产生输出,而与输入的帧速率无关。如果r将其指定为输入开关,ffmpeg将根据需要复制或删除帧,以将指定数量的每秒输入帧输入到过滤器/编码器。
Gyan

您描述的时候的行为r是一个输入开关,这与我之前对.mp4格式的实验,Malvineous的注释(在此页面上)和错误描述相矛盾403 trac.ffmpeg.org/ticket/403 ; 您的描述何时r用于输出会在重新编码时发生,而OP的情况似乎是一个符合要求的情况(固定帧率而不重新编码),因为他的帧率为.33。
坦克手六四2016年

1
检查报告粘贴在这里。注意顶部的命令行,输入和输出元数据,最后是no。编码的帧数。
Gyan

1
同意OP仅符合文件要求,但由于未指定复制开关,因此给定的命令将重新编码。在这种情况下,ffmpeg应该以rfps 生成新的流。
Gyan

感谢Mulvya提供令人信服的示例输出。是的,您正确使用-r。这种用法不会影响我对OP的早期实验,因为考虑到一个合适的情况,我从未从ffmpeg删除copy参数,-r因此被忽略了。我写了一个功能请求:trac.ffmpeg.org/ticket/5170
Tankman六四,2016年

0

最快的方法是在包含以下行的目录中创建BAT文件:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

您需要在同一目录中包含mkvmerge和ffmpeg。它会在几秒钟内自动更改每个mp4文件,而不会降低质量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.