ffmpeg 错误:“缺少 ')' 或 'if(gt(a,1),650,-1)' 中的参数过多”
Posted
技术标签:
【中文标题】ffmpeg 错误:“缺少 \')\' 或 \'if(gt(a,1),650,-1)\' 中的参数过多”【英文标题】:ffmpeg error: "Missing ')' or too many args in 'if(gt(a,1),650,-1)'"ffmpeg 错误:“缺少 ')' 或 'if(gt(a,1),650,-1)' 中的参数过多” 【发布时间】:2015-04-24 13:10:25 【问题描述】:我正在尝试在 linux shell 中运行这个 ffmpeg 命令,以缩小视频(如果是纵向,则比最大高度 650,同时调整宽度。如果是横向,则最大宽度为 650,并调整高度纵横比):
ffmpeg -i 1.mp4 -r 30 -vf scale="'if(gt(a,1),650,-1)':'if(gt(a,1),-1,650)'" -vcodec libx264 output_file1.mp4
但我收到以下错误:
[scale @ 0x1d48a40] [Eval @ 0x7fff53a49340] 缺少 ')' 或太多 'if(gt(a,1),650,-1)' [scale @ 0x1d48a40] [Eval @ 0x7fff53a49340] 缺少 ')' 或 'if(gt(a,1),-1,650)' 中的 args 太多 计算表达式“if(gt(a,1),-1,650)”时出错
**编辑:我尝试过使用新的@slhck 语法:
-vf "scale=if(gt(a\,1)\,650\,-2):if(gt(a\,1)\,-2\,650)"
我得到的结果是:
ffmpeg 版本 0.8.16-4:0.8.16-0ubuntu0.12.04.1,版权所有 (c) 2000-2014 Libav 开发人员于 2014 年 9 月 16 日 18:33:49 构建 gcc 4.6.3 ffmpeg 程序仅提供脚本兼容性 并将在未来的版本中删除。它已在 Libav 项目允许不兼容的命令行语法 对其替代品的改进称为 avconv(请参阅 Changelog 了解 细节)。请改用 avconv。
似乎流 0 编解码器帧速率与容器帧速率不同: 180000.00 (180000/1) -> 90000.00 (180000/2) 输入 #0, mov,mp4,m4a,3gp,3g2,mj2,来自“1.mp4”:元数据: 主要品牌:isom 次要版本:0 兼容品牌:isom3gp4 创建时间:2015-02-05 14:54:24 持续时间:00:00:45.30,开始:0.000000,比特率:17058 kb/s 流 #0.0(eng):视频:h264(高)、yuv420p、1920x1080、17021 kb/s、30.01 fps、90k tbr、90k tbn、180k tbc 元数据: 创建时间:2015-02-05 14:54:24 流 #0.1(eng):音频:aac,48000 Hz,立体声,s16,124 kb/s 元数据: creation_time : 2015-02-05 14:54:24 文件'output_file1.mp4'已经存在。覆盖? [是/否]是的
[buffer @ 0x747ec0] w:1920 h:1080 pixfmt:yuv420p [scale @ 0x745a40] [Eval @ 0x7fffac94b220] 缺少 ')' 或太多 args 'if(gt(a,1),650,-2)' [scale @ 0x745a40] [Eval @ 0x7fffac94b220] 'if(gt(a,1),-2,650)' 中缺少 ')' 或太多参数 评估表达式 'if(gt(a,1),-2,650)' 错误打开 过滤器!
我该怎么办?
【问题讨论】:
请也显示完整的、未删减的命令行输出,并说明您正在使用哪个 shell。 在尝试@slhck 语法后,我已经编辑了问题,并添加了完整的输出。我使用的 shell 是连接到我的 AWS EC2 linux 服务器的 Putty 会话。 您使用的是由 Libav 分叉以错误名称发布的损坏的旧版本的 ffmpeg。所以本质上是假的。请使用真实的最新版本,您可以从 ffmpeg.org/download.html 下载该版本 — 如果您想要无需安装的简单方法,请选择静态构建。 非常感谢!我应该如何安装它?还是使用静态构建? 我已经按照本指南安装了ffmpeg:trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu。哪个应该是 ffmpeg 的最新版本,不是吗?怎么可能是我的版本太旧了? 【参考方案1】:嗯,首先这不起作用,因为对于 libx264,高度/宽度必须能被 2 整除,因此您需要将 -2
而不是 -1
作为高度/宽度参数。有关详细信息,请参阅scale video filter documentation。
另一个问题:您的 ffmpeg 已经过时,可能不支持您尝试使用的过滤器表达式。 Download a recent static build 或 compile it yourself。
要使表达式起作用,您必须escape 逗号:
-vf "scale=if(gt(a\,1)\,650\,-2):if(gt(a\,1)\,-2\,650)"
或者用单引号括起来:
-vf scale="'if(gt(a,1),650,-2)':'if(gt(a,1),-2,650)'"
由于后者是您已经在使用的,也许可以尝试第一个带有转义的变体。
【讨论】:
以上是关于ffmpeg 错误:“缺少 ')' 或 'if(gt(a,1),650,-1)' 中的参数过多”的主要内容,如果未能解决你的问题,请参考以下文章
“错误:未找到 FFMPEG”但应安装 FFMPEG - Discord Bot