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

标签 video ffmpeg cloudconvert

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

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

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

实际上相关的代码部分是比例部分。
下面的部分会将视频的高度调整为最大 1280 像素,但不考虑宽度,它只是保持比例。
-vf "scale=min'(1280,iw)':-2"
现在我将如何调整或更改它,以便它实际上会根据哪一侧大于 1280 像素来调整大小?

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

最佳答案

问题仅出现,如果高度大于宽度,这会将宽度的限制数量从 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 版本

    关于video - 使用 ffmpeg 调整视频大小 - 保持纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54063902/

    相关文章:

    ffmpeg mp4 到 hls vod,提取片段持续时间,无需重新编码

    ffmpeg - 如何使用 ffmpeg 从 1,25%,50%,75%,100% 的视频帧中捕获 5 个缩略图

    webcrypto-api - 使用 Cloudflare Workers 验证 HMAC 哈希

    audio - 如何使用 ffmpeg 从 mp4 文件中提取特定的音轨(轨道 2)?

    c++ - 更有效地遍历原始视频

    android - 旋转手机在 Android 上重新启动视频

    Android:我想录制可能的超低质量视频源并以离散数据包发送。可能吗?你会如何处理它?

    node.js - 流利的 ffmpeg "not a suitable output format"