如何在ffmpeg中使用混合来减少帧数



我正在尝试将一些文件转换为ProRes。转换的一个相当重要的部分是:

  • 将帧数从60帧减少到30帧
  • 将每2帧混合为一帧,实现更流畅的运动。(一种简单的运动模糊)

我已经尝试了-blend命令,但是它不被识别为命令。

-i source.mp4 -r 30 -vcodec prores_ks -profile:v 0 Output.mov

如何在ffmpeg中减少混合帧?

简单的frame drop:

ffmpeg -i input.mov -r 30 output.mov

minterpolate滤波器插值帧:

ffmpeg -i input.mov -vf minterpolate=fps=30 output.mov
  • 请参阅上面的链接,因为有许多其他选项。

framerate滤波器插值帧:

ffmpeg -i input.mov -vf framerate=fps=30 output.mov
  • 请参阅上面的链接,因为有许多其他选项。

Try

ffmpeg -h

ffmpeg --help

,你会得到一个简短的帮助。请读一读。:)

ffmpeg -filters

,你会有一个可用的过滤器列表

ffmpeg -help filter=name

你将有这个过滤器的语法和参数


我已经需要做这样的事情,降低帧率。如果你这样做

ffmpeg -i "input" -r outputframerate [video encoding options...] [-y] "output"

注意:括号[]中的内容是可选的

你将有一个简单的帧率改变,可能会丢失输入帧。


要在不丢失输入帧的情况下改变帧率,您必须使用视频过滤器

tblend filter 混合连续的帧。如果源帧率是目标帧率的整数倍(例如:60→30,75→15,75→25,…),则使用该滤波器
ffmpeg -i "input" -vf tblend=all_mode=average [video encoding options...] -r outputframerate⁽¹⁾ [-y] "output"

如果我没有自己测试过这个过滤器,我确定输出帧率必须设置在某个地方。tblend过滤器没有fps参数。也许它只是混合了两个连续的帧?你应该检查这一点,并做一些尝试?


存在另一个帧率改变器,更适合用于任何i/o帧率:

minterpolate: 使用运动插值进行帧率转换

输入:

ffmpeg -i "input" -vf minterpolate=fps=outputframerate [video encoding options...] [-y] "output"

其他插值参数有足够好的默认值,以确保良好的混合。用

检查一下
ffmpeg -help filter=minterpolate

如果你想在中间插入链中添加一些参数,你必须使用':'作为参数分隔符。假设你想使用运动插值模式 = blend,而不是默认的运动补偿插值 (mci),类型:

ffmpeg -i "input" -vf minterpolate=fps=outputframerate:mi_mode=blend [video encoding options...] [-y] "output"

如果你想使用许多视频过滤器,你一定不能链-vf选项。最后一个会覆盖之前的。必须使用','作为过滤器的分隔符(如':'表示过滤器参数)。例:

ffmpeg -i "input" -vf minterpolate=fps=outputframerate:mi_mode=blend,filter2=param1=value1:param2=value2[...] [video encoding options...] [-y] "output"

给定过滤器的顺序很重要。


事情已经用

完成了版权所有(c) 2000-2019 ffmpeg开发者

专门用于在时间推移帧之间进行混合,以在帧之间提供真正高质量的几乎模糊,您可以使用tblend=average

这就是我最终使用的,并为我的延时视频提供了一个令人难以置信的柔软,平滑的外观:

ffmpeg -i in_video.mp4 -vf "tblend=average,setpts=0.05*PTS" -r 60 -crf 2 -an out_video.mp4

或者,对于您的用例:

ffmpeg -i in_video.mp4 -vf "tblend=average,setpts=0.5*PTS" -r 30 -crf 2 -an out_video.mp4

最通用的解决方案是使用tmix:

ffmpeg -i source.mp4 -vf tmix=frames=60/30 -r 30 ...

其中60是输入帧率,30是输出帧率。

的背景

tmix视频滤波器取每个输入帧并将其与跟随帧取平均值。在这一点上,你有一个60fps的模糊流。-r 30子采样通过选择每隔一帧(并使其持续两倍的时间),这留给你想要的结果。

Nit选择

从技术上讲,这只适用于你的比率是整数(例如50/25,60/20,但不是60/24)。如果你真的想要精确,你可以从60- 24(=每输出帧2.5源帧),例如,中间帧权重为100%,相邻帧权重为75%,总共2.5:

ffmpeg -i source.mp4 -vf 'tmix=frames=3:weights=75 100 75' -r 25 ...

(虽然我不知道你为什么要麻烦。)

来源
  • https://ffmpeg.org/ffmpeg-filters.html tmix
  • https://video.stackexchange.com/a/34806

感谢Ian的链接和Max的回答

相关内容

  • 没有找到相关文章

最新更新