我正试图在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@0x7fff53a9340]缺少")"或太多"if(a,1),650,-1)"中的参数[scale@0x1d48a40][Eval@0x7fff53a9340]缺少")"或"if(a,1),-1650)"中的参数过多评估表达式"if(a,1),-1650)"时出错
**编辑:我已经尝试使用新的@slhck语法:
-vf "scale=if(gt(a,1),650,-2):if(gt(a,1),-2,650)"
我得到的结果是:
ffmpeg版本0.8.16-4:0.8.16-0ubuntu1.12.04.1,版权所有(c)2000-2014 Libav开发商于2014年9月16日18:33:49与gcc 4.6.3提供ffmpeg程序只是为了与脚本兼容并将在将来的版本中删除。在Libav项目允许不兼容的命令行语法它的替代品avconv的改进(有关详细信息)。请改用avconv。
流0编解码器帧速率似乎与容器帧速率不同:180000.00(180000/1)->90000.00(180000/2)输入#0,mov,mp4,m4a,3gp,3g2,mj2,来自"1.mp4":元数据:major_brand:isomminor_version:0compatible_brands:isom3gp4创建时间:2015-02-05 14:54:24持续时间:00:00:45.30,开始时间:0.000000,比特率:17058kb/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,立体声,s16124kb/s元数据:creation_time:2015-02-05 14:54:24文件"output_File.mp4"已存在。是否覆盖?[y/N]y
[fbuffer@0x747ec0]w:1920 h:1080 pixmfmt:yuv420p[scale@0x745a40][Eval@0x7fffac94b220]中缺少")"或参数过多'if(gt(a,1),650,-2)'[scale@0x745a40][Eval@0x7fffac94b220]if(gt(a,1),-2650)中缺少")"或参数过多错误计算表达式"if(gt(a,1),-2650)"打开时出错过滤器
我该怎么办?
首先,这不起作用,因为libx264的高度/宽度必须被2整除,因此需要将-2
而不是-1
作为高度/宽度参数。有关详细信息,请参阅缩放视频过滤器文档。
另一个问题:您的ffmpeg已经过时,可能不支持您尝试使用的筛选器表达式。下载最近的静态构建或自己编译。
要使表达式工作,必须转义逗号:
-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)'"
由于后者是您已经在使用的,也许可以尝试第一种带有转义的变体。