【问题标题】:Resize videos with ffmpeg - Keep aspect ratio使用 ffmpeg 调整视频大小 - 保持纵横比
【发布时间】:2020-06-08 08:21:17
【问题描述】:

我正在尝试为可以将任何视频/动画转换为.mp4 的电报用户机器人编写脚本。我已经有了它,所以脚本可以通信并使用cloudconvert.com 的 API。

现在我的问题在于我传递给 CC 的 ffmpeg 命令,因为我需要将视频的两边都保持在 1280 像素以下。最终的视频是 720*1280 还是 1280*1280 或者完全是别的什么都没有关系,只要两边都不超过 1280 像素即可。

棘手的部分来了,我不想破坏宽高比,也不想让小于 1280 的视频放大。

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

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

现在我将如何调整或更改它,以便根据哪一侧大于 1280 像素实际调整大小?

我希望我足够具体,我期待您的帮助。

【问题讨论】:

    标签: video ffmpeg cloudconvert


    【解决方案1】:

    问题只是出现了,如果高度大于宽度,这会将宽度的限制数量从 2 增加到 3:

    • 宽度必须小于或等于1280(不要超过宽度)
    • 宽度必须小于或等于初始宽度(不要放大)
    • 宽度必须小于或等于 1280*width/height(不要超过高度)

    要测试所有情况,您将使用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 版本

    【讨论】:

    • 好的,这看起来确实很有帮助,但我仍然会从中得到错误。我已经发布了那些on hastebin.com
    • 你有很多杂散的单引号:-vf "scale=min'(1280,min'(iw,round'(1280*iw/ih)')')':-2" - 表达式解析器不喜欢它们
    • 我试图用引号将 min() 的每个“容器”括起来,这样 FFMPEG 可能没有问题,但这并没有帮助。我的一个朋友让它与-vf "scale=min('1280,'min('iw,round(1280*iw/ih)')''):-2" 一起工作,因为他逐渐添加了引号。虽然这对我仍然不起作用,但对他来说......
    • 不要在表达式中使用任何引号 - 只需像我一样在 -vf 的完整参数周围使用引号。
    • 我做到了。这是我得到的错误。 hastebin.com/uwojajudez.sql
    【解决方案2】:
    ffmpeg -i a.mp4 -vf "scale=:-1:force_original_aspect_ratio=decrease"
    

    【讨论】: