使用ffmpeg调整视频大小-保持纵横比

6
我正在尝试编写一个电报用户机器人的脚本,该脚本可以将任何视频/动画转换为 .mp4 格式。我已经实现了脚本与 cloudconvert.com API 的通信和利用。

现在我的问题在于 ffmpeg 命令传递给 CC 时,需要保持视频两侧都小于 1280 像素。最终视频是 720*1280、1280*1280 还是其他尺寸都无所谓,只要两侧都不超过 1280 像素。

这里有个棘手的问题,我不想破坏宽高比,也不想让视频在小于 1280 像素时进行放大。

实际相关的代码部分是缩放部分。以下代码将把视频调整为高度最大为 1280 像素,但不考虑宽度,只保持比例。

-vf "scale=min'(1280,iw)':-2"

那么,我应该如何修改它或更改它,以便根据哪一侧大于 1280 像素而实际调整大小呢?

我希望我表述得足够清楚,并期待您的帮助。

2个回答

7
问题只会出现在高度大于宽度的情况下,这会将宽度的限制从2个增加到3个:
  • 宽度必须小于或等于1280(不要超过宽度)
  • 宽度必须小于或等于初始宽度(不要放大)
  • 宽度必须小于或等于1280*宽度/高度(不要超过高度)
为了测试所有情况,您可以使用min(1280,min(iw,round(1280*iw/ih))),创建一个过滤器。
-vf "scale=min(1280,min(iw,round(1280*iw/ih))):-2"

编辑

在某些版本的ffmpeg中,上面的代码行不起作用,引用了自我引用问题。在这种情况下,我们可以创建另一种思路:

  • 如果宽度大于(或等于)高度,则使用min(iw,1280)缩放宽度
  • 如果高度大于宽度,则使用min(ih,1280)缩放高度

表达式将为-vf 'scale=if(gte(iw,ih),min(1280,iw),-2):if(lt(iw,ih),min(1280,ih),-2)'

不要忘记,您可能会通过某些shell解析机制来运行此代码行,这还需要对逗号进行转义。该表达式为

-vf 'scale=if(gte(iw\,ih)\,min(1280\,iw)\,-2):if(lt(iw\,ih)\,min(1280\,ih)\,-2)'

已验证可以在Ubuntu Linux上的版本2.7.2至3.4.4中运行


你有很多杂乱的单引号:-vf“scale=min'(1280,min'(iw,round'(1280*iw/ih)')'):-2” - 表达式解析器不喜欢它们。 - Eugen Rieck
我已经尝试用引号包围每个 min() 的“容器”,以便 FFMPEG 可能不会出问题,但这并没有帮助。我的一个朋友使用 -vf "scale=min('1280,'min('iw,round(1280*iw/ih)')''):-2" 成功了,并逐渐添加引号。尽管他成功了,但对我来说仍然不起作用... - ColinShark
我其实不知道,我是使用CloudConvertsAPI来完成这些任务的。 - ColinShark
修改了我的回答,请重试。 - Eugen Rieck
非常感谢,终于可以工作了!我想给你多个声望,但我无法做到 ^^ - ColinShark
显示剩余7条评论

0
ffmpeg -i a.mp4 -vf "scale=:-1:force_original_aspect_ratio=decrease"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接