FFmpeg批量合并MP4与字幕的批处理命令无法运行求助
批处理合并MP4与同名英文字幕转MKV的修正方案
原命令的核心问题
- 路径错误:
for /R遍历的是InputFolder下所有子目录的MP4文件,但你用%%~ni.mp4和%%~ni-eng.srt时,只会在批处理所在目录查找文件,而非MP4实际所在目录,导致ffmpeg找不到字幕文件。 - 缺少存在性检查:未判断对应字幕文件是否存在,即使找不到srt也会执行ffmpeg命令,引发报错。
修正后的完整批处理代码
@echo off setlocal enabledelayedexpansion mkdir inputs 2>nul mkdir outputs 2>nul set "InputFolder=%~dp0inputs" for /R "%InputFolder%" %%i in (*.mp4) do ( :: 构建同目录下的字幕文件路径 set "SubFile=%%~dpni-eng.srt" :: 检查字幕文件是否存在 if exist "!SubFile!" ( ffmpeg -n -i "%%i" -i "!SubFile!" -c copy -max_interleave_delta 0 ^ -map 0 -map -0:v:1? -map -0:v:2? -map 1 ^ -fflags +bitexact -map_metadata:g -1 -map_metadata -1 ^ -metadata title="" -metadata comment="" ^ -metadata:s:v title="" -metadata:s:v language="und" -metadata:s:v VENDOR_ID="" ^ -metadata:s:a title="" -metadata:s:a:0 language="eng" -metadata:s:a:0 handler_name="English" -metadata:s:a VENDOR_ID="" ^ -metadata:s:s:0 language="eng" ^ "outputs\%%~ni.mkv" ) else ( echo 未找到对应字幕文件:!SubFile!,跳过处理%%i ) ) endlocal pause
关键修正点说明
- 路径匹配:用
%%~dpni获取MP4文件的目录路径+文件名,拼接成字幕文件路径%%~dpni-eng.srt,确保能定位到同目录下的字幕。 - 延迟变量扩展:通过
setlocal enabledelayedexpansion启用延迟扩展,保证循环内的变量SubFile能正确读取赋值结果。 - 错误抑制:
mkdir命令添加2>nul,避免目录已存在时输出冗余错误提示。 - 代码可读性优化:用
^将长命令拆分换行,避免命令行过长导致的执行异常。 - 存在性检查:添加
if exist判断,仅在找到对应字幕时执行ffmpeg转换,避免无意义报错。
内容的提问来源于stack exchange,提问作者user12261902
相关产品推荐
相关产品推荐

