繁体   English   中英

如何在 ffmpeg 中通过混合减少帧数

[英]How do I reduce frames with blending in ffmpeg

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

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

我试过-blend命令,但它没有被识别为命令。

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

如何在 ffmpeg 中通过混合减少帧数?

简单的丢帧:

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

插值帧与minterpolate滤波器:

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

使用framerate过滤器插入framerate

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

尝试

ffmpeg -h

或者

ffmpeg --help

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

尝试

ffmpeg -filters

并且您将获得可用过滤器的列表

尝试

ffmpeg -help filter=name

您将拥有此过滤器的语法和参数


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

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

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

您将有一个简单的帧速率更改,可能会丢失输入帧。 而且,这尤其是你不想得到的。


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

tblend过滤器混合连续的帧 如果源帧率是目标帧率的整数倍(例如:60→30、75→15、75→25,...),则使用该过滤器

ffmpeg -i "input" -vf tblend=all_mode=average [video encoding options...] -r outputframerate⁽¹⁾ [-y] "output"

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


存在另一个帧速率更改器,更适合与任何 i/o 帧速率一起使用:

mininterpolate :使用运动插值的帧率转换。

所以,输入:

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

其他插值参数具有足够好的默认值,以确保良好的混合。 用一个检查它们

ffmpeg -help filter=minterpolate

如果要在插值链中添加一些参数,则必须使用“:”作为参数分隔符。 假设您要使用运动插值模式= 混合,而不是默认的运动补偿插值(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"

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


事情已经完成

ffmpeg 版本 3.2.14-1~deb9u1 版权所有 (c) 2000-2019 FFmpeg 开发人员

最通用的解决方案使用tmix

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

其中 60 是您的输入帧率,30 是您的 output。

背景

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

吹毛求疵

从技术上讲,这仅在您的比率为 integer(例如 50/25、60/20,但不是 60/24)时才有效。 如果你真的想要精确,你可以 go 从 60->24(=每 output 帧 2.5 个源帧)通过例如将中间帧加权为 100% 并将其两个相邻帧加权为 75%,总共 2.5:

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

(虽然我不确定你为什么要打扰。)

来源

感谢 Ian 的链接和 Max 的回答。

专门用于在一段时间内在帧之间进行混合以在帧之间提供真正高质量的几乎模糊,您可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM