考虑一下脚本的这一部分:
FOR %%G IN (Eqr_360_????.jpg) DO (
ffmpeg -f lavfi -i nullsrc=size=3888x3888 -vf format=pix_fmts=gray16le,geq=Y-^(20*^(Y/1939^)*^(3887-X^)/3887^)*gt(Y,1880) -frames 1 -y %FF%YmapCenter.pgm
)
pause
在此行周围添加“”并不能使脚本正常工作。 选择了替代方法,然后添加了 ^ 来保护括号 ( ),但 gt() 无法受到保护。
使用“”围绕该行或使用^来保护括号()总是返回错误...未知函数gt(Y,1880
删除 *gt(Y,1880) 可使脚本正常运行。
在第二次尝试中,我删除了 CMD FOR 语句并直接设置文件名。这意味着没有命令 shell 冲突,但错误消息仍然存在......未知函数 gt(Y,1880
答案1
我发现了两个问题:
- gt() 不起作用
- FOR %%G IN (Eqr_360_????.jpg) DO ( 与 gt() 括号冲突,因为引号不能保护 gt(),^ 也不能保护。
问题 1) 的解决方案通过理解 gt() 仅返回 True 或 False 而不是 1 或 0 来解决。这意味着 gt() 不能用作算术函数。相反,IF(x,y,z) 函数与 gt() 和问题 2) 的解决方案一起使用。使用的脚本是:
ffmpeg -f lavfi -i nullsrc=size=3888x3888 -vf "format=pix_fmts=gray16le,geq=if(gt(Y,1880),Y-^(20*^(Y/1939^)*^(3887-X^)/3887^),Y)" -frames 1 -y %FF%YmapCenter.pgm
问题 2) 的解决方案是用表达式替换 FOR %%G IN (Eqr_360_????.jpg) DO (。取而代之的是以下内容:
@echo off
:START
if "%~1" == "" goto END
Set "G=%~n1%~x1" ::This is the file name with extension
shift
goto START
:END
当然,这并不能启用文件的批处理,但它可以与 FFMPEG 括号一起使用。