You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:05:32