FFmpeg批量转码脚本优化:跳过已存在输出文件的处理
FFmpeg批量转码脚本优化方案
核心需求
- 提前过滤已存在于输出目录的文件,跳过遍历与FFProbe分析流程
- 保留原脚本功能:批量转码MKV/MP4中EAC3、FLAC、DTS等音频为AAC
- 解决多文件/子目录场景下变量传递失效问题
优化后的脚本实现
@echo off setlocal enabledelayedexpansion :: 设置输出目录 set "output_dir=Transcoded" if not exist "%output_dir%" mkdir "%output_dir%" :: 递归遍历当前目录及子目录下的MKV/MP4文件 for /r %%f in (*.mkv *.mp4) do ( :: 生成输出文件路径(保持原文件名与后缀) set "input_file=%%f" set "output_file=!output_dir!\%%~nf%%~xf" :: 提前检查输出文件是否存在,存在则直接跳过后续所有处理 if exist "!output_file!" ( echo 跳过已存在文件: !input_file! goto next_file ) :: 使用FFProbe提取音频编码格式 for /f "delims=" %%a in ('ffprobe -v error -select_streams a:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 "!input_file!"') do ( set "audio_codec=%%a" ) :: 判断是否需要转码 if "!audio_codec!"=="eac3" ( goto do_transcode ) else if "!audio_codec!"=="flac" ( goto do_transcode ) else if "!audio_codec!"=="dts" ( goto do_transcode ) else ( echo 无需转码,直接复制文件: !input_file! copy "!input_file!" "!output_file!" >nul goto next_file ) :do_transcode echo 正在转码音频为AAC: !input_file! ffmpeg -hide_banner -loglevel error -i "!input_file!" -c:v copy -c:a aac -b:a 192k "!output_file!" :next_file ) echo 所有文件处理完成! endlocal
关键优化点
- 前置存在性检查:在FFProbe分析前执行
if exist "!output_file!"判断,彻底跳过已处理文件的遍历与分析流程,大幅提升效率 - 启用延迟变量扩展:通过
setlocal enabledelayedexpansion解决循环中变量解析失效问题,确保多文件、子目录场景下路径变量正确传递 - 递归遍历逻辑:使用
for /r实现当前目录及所有子目录的视频文件遍历,覆盖更多场景
注意事项
需确保FFmpeg与FFProbe已添加至系统环境变量,或在脚本中指定完整可执行文件路径(例如
"C:\Tools\ffmpeg\bin\ffprobe.exe")
若需调整音频质量,可修改FFmpeg命令中的-b:a 192k参数,数值越高音质越好但文件体积更大
内容的提问来源于stack exchange,提问作者hsgg4
相关产品推荐
相关产品推荐

