[英]How do I reduce frames with blending in ffmpeg
我正在尝试将一些文件转换为 ProRes。 转换的一个相当重要的部分是:
我试过-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
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.