FFmpeg脚本中变量%~n1无法正常传递的问题咨询
FFmpeg脚本中变量%~n1无法正常传递的问题咨询
看起来你遇到了批处理脚本里变量解析的两个常见问题,导致生成的视频文件名不对,而且只保留了最后一张图的结果。咱们一步步拆解问题,然后修正脚本:
核心问题分析
问题1:
%~n1的用法完全错误
在批处理语法里,%~n1代表的是你运行这个脚本时传入的第一个命令行参数,而不是当前FOR循环中正在处理的%%G文件的文件名。如果你想获取当前图片的文件名(不带扩展名),应该用%%~nG——这是FOR循环变量的扩展语法,~n就是专门用来提取文件名部分的。问题2:批处理的变量延迟扩展坑
就算你把%~n1改成%%~nG,如果用Set "FF=%%~nG"然后直接用%FF%.mp4,在FOR循环里依然会出问题。因为批处理默认会在执行循环前,就把所有%变量%的内容一次性解析完毕,所以循环里的%FF%只会保留最后一次赋值的结果,甚至可能是空值(这就是为什么你最后得到了MP4.mp4)。
修正方案
方案1:直接使用循环变量扩展(最简单)
不需要中间变量,直接在FFmpeg命令里用%%~nG指定输出文件名,避免变量解析问题:
FOR %%G IN (Image*.png) DO ( ffmpeg -i %%G -vf scale=4096:-1 -y out.png ffmpeg -loop 1 -i out.png -c:v libx264 -t 1 -crf 25 -pix_fmt yuv420p -y %%~nG.mp4 del out.png )
方案2:启用延迟扩展(适合需要对文件名做额外处理的场景)
如果后续需要对文件名做更多操作,就得先启用延迟扩展,用!FF!代替%FF%来引用变量:
@echo off setlocal enabledelayedexpansion FOR %%G IN (Image*.png) DO ( ffmpeg -i %%G -vf scale=4096:-1 -y out.png Set "FF=%%~nG" ffmpeg -loop 1 -i out.png -c:v libx264 -t 1 -crf 25 -pix_fmt yuv420p -y !FF!.mp4 del out.png ) endlocal
修正后,每个ImageX.png都会生成对应的ImageX.mp4,每次循环都会正确处理当前图片,临时文件out.png也会在每次循环后删除,不会出现互相干扰的情况。
备注:内容来源于stack exchange,提问作者CANJMP
相关产品推荐
相关产品推荐

