Answers:
我知道这是一个古老的问题,但是当前的答案都不是推荐的方式了。
正如评论指出的是有办法做到这一点,其中的视频并没有 要被重新编码。它需要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的指南。请注意,所有这些选项都需要对视频进行重新编码。
您可以使用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
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
mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv
更改MKV容器上的帧速率。您可以重新混合为MKV,然后返回MP4,或者找到直接为MP4执行此操作的工具。对视频进行X编码非常耗CPU且有损,因此这是一个可怕的选择。
如果输入文件没有有效的帧频,则可能需要显式设置它
ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
改变帧速率的这种功能称为“顺应性”,通常用于产生慢动作或快进效果,就像在几分钟内显示植物的生长。ffmpeg不允许在不重新编码的情况下覆盖/更改帧率。如果这样做,则持续时间将改变并且音频将不同步,除非另行修改。但是,对于您的情况,如果帧速率为.33,恐怕音频不会引起您的兴趣
您想要符合标准,因为您只想更改帧速率,但是ffmpeg会-r
默默忽略如果在输入文件中指定了帧速率。由于您的输入文件为.mp4格式,因此其自身的帧速率优先于当不需要重新编码时。为此,您需要使用其他工具:mencoder。-r
假设您的输入文件中没有声音-任何具有.33帧频的视频都可能是真实的-您需要的是:
$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>
请注意,默认情况下,mencoder会以AVI格式生成输出。
r
将其指定为输出开关,则ffmpeg将以指定的帧速率产生输出,而与输入的帧速率无关。如果r
将其指定为输入开关,ffmpeg将根据需要复制或删除帧,以将指定数量的每秒输入帧输入到过滤器/编码器。
r
是一个输入开关,这与我之前对.mp4格式的实验,Malvineous的注释(在此页面上)和错误描述相矛盾403 trac.ffmpeg.org/ticket/403 ; 您的描述何时r
用于输出会在重新编码时发生,而OP的情况似乎是一个符合要求的情况(固定帧率而不重新编码),因为他的帧率为.33。
r
fps 生成新的流。
-r
。这种用法不会影响我对OP的早期实验,因为考虑到一个合适的情况,我从未从ffmpeg删除copy参数,-r
因此被忽略了。我写了一个功能请求:trac.ffmpeg.org/ticket/5170
最快的方法是在包含以下行的目录中创建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文件,而不会降低质量。