如何用FFmpeg批量一对一合并两个文件夹中的音视频文件
解决Windows批处理中按顺序配对合并视频和音频文件的问题
你的问题核心在于两个文件夹内的文件名不匹配,没法直接用同一个循环变量关联视频和音频文件。要实现按字母顺序一对一合并,我们需要先分别收集两个文件夹的文件列表,再通过索引一一配对处理。下面是完整的解决方案:
批处理脚本实现步骤
1. 启用延迟扩展
批处理中在循环内读取动态变量需要开启延迟扩展,否则无法正确获取数组中的值。
2. 收集按字母排序的文件列表
分别遍历Video和Audio文件夹,将文件名按顺序存入"数组"变量中(批处理没有真正的数组,用带索引的变量模拟)。
3. 检查文件数量一致性
确保两个文件夹的文件数量相同,避免出现配对错误。
4. 循环配对合并
通过索引循环,取出对应位置的视频和音频文件,执行FFmpeg合并命令。
完整批处理代码
@echo off setlocal enabledelayedexpansion :: 创建Merged文件夹(如果不存在) if not exist ".\Merged" mkdir ".\Merged" :: 收集Video文件夹中按字母排序的.mkv文件 set "vid_count=0" for /f "delims=" %%f in ('dir /b /on .\Video\*.mkv') do ( set "vid_files[!vid_count!]=%%f" set /a vid_count+=1 ) :: 收集Audio文件夹中按字母排序的.avi文件 set "aud_count=0" for /f "delims=" %%f in ('dir /b /on .\Audio\*.avi') do ( set "aud_files[!aud_count!]=%%f" set /a aud_count+=1 ) :: 检查文件数量是否匹配 if !vid_count! neq !aud_count! ( echo 错误:Video和Audio文件夹中的文件数量不一致! echo Video文件夹有 !vid_count! 个文件,Audio文件夹有 !aud_count! 个文件 pause exit /b 1 ) :: 循环合并对应文件 echo 开始合并文件,共 !vid_count! 对... for /l %%i in (0,1,!vid_count!-1) do ( set "current_vid=!vid_files[%%i]!" set "current_aud=!aud_files[%%i]!" echo 正在合并:!current_vid! + !current_aud! ffmpeg -i ".\Video\!current_vid!" -i ".\Audio\!current_aud!" ^ -map 0 -map 1 -map -1:v -c copy ".\Merged\!current_vid!" ) echo 所有文件合并完成! pause endlocal
代码说明
dir /b /on:/b表示只输出文件名,/on表示按名称排序,确保文件按字母顺序排列。setlocal enabledelayedexpansion:启用延迟扩展后,用!变量名!代替%变量名%来读取循环内的动态变量。^:批处理中用于换行,让FFmpeg命令更易读。- 自动创建Merged文件夹:避免因文件夹不存在导致合并失败。
内容的提问来源于stack exchange,提问作者Marco Pagonia




