如何用FFmpeg批量转换指定格式视频并保留原目录结构
如何用FFmpeg批量转换指定格式视频并保留原目录结构
我懂你想要的效果——批量把文件夹(包括所有子文件夹)里的.mpg、.avi、.vob格式视频转成.mp4,还得保留原有的文件夹结构和文件名,只改后缀对吧?你的批处理思路其实没问题,只是有些细节可以优化,我帮你调整一下脚本,再给你拆解下关键部分:
修正后的完整批处理脚本
@echo off setlocal enabledelayedexpansion set "source_folder=C:\path\to\source\folder" :: 递归遍历所有子文件夹中的目标格式视频 for /r "%source_folder%" %%F in (*.avi *.mpg *.vob) do ( :: 先检查输出文件是否已存在,避免重复转换 if not exist "%%~dpnF.mp4" ( echo 正在转换: "%%F" :: 调用FFmpeg执行转换,去掉了过时的-strict参数,简化输出信息 ffmpeg -i "%%F" -c:v libx264 -c:a aac -b:a 192k -hide_banner -loglevel error "%%~dpnF.mp4" :: 检查转换是否成功 if !errorlevel! equ 0 ( echo 转换完成: "%%~dpnF.mp4" ) else ( echo 转换失败: "%%F" ) ) else ( echo 文件已存在,跳过: "%%~dpnF.mp4" ) ) echo 所有转换任务处理完成! pause
关键细节说明
- 路径与递归遍历:
for /r "%source_folder%"这个/r参数会自动遍历源文件夹下的所有子目录,完美匹配你需要处理所有嵌套文件夹的需求。 - 输出路径与文件名控制:
%%~dpnF.mp4是批处理的特殊变量用法:%%~d:提取原文件的驱动器号(比如C:)%%~p:提取原文件的完整路径(不含文件名)%%~n:提取原文件的文件名(不含后缀)
组合起来就保证了输出MP4和原视频在同一个文件夹,名字完全一致,只是后缀改成了.mp4。
- 优化的FFmpeg参数:去掉了
-strict experimental——这个参数是旧版FFmpeg用来启用AAC编码的,现在AAC已经是标准支持的编码,不需要额外声明了;加上-hide_banner -loglevel error是为了减少无关输出,只在出错时显示错误信息,让转换过程更清爽。 - 重复转换防护:新增了
if not exist检查,如果目标MP4已经存在就跳过,避免重复消耗资源。 - 状态提示:添加了转换中的状态信息,你能实时看到哪个文件在处理、是否成功。
注意事项
- 确保你的电脑上已经安装了FFmpeg,并且把FFmpeg的
bin目录添加到了系统环境变量里;如果没加环境变量,把脚本里的ffmpeg改成FFmpeg的完整路径,比如"C:\Program Files\ffmpeg\bin\ffmpeg.exe"。 - 转换过程中不要强行关闭命令窗口,否则可能生成损坏的MP4文件。
- 如果原文件的路径或文件名包含空格、特殊字符,脚本里的引号已经帮你处理好了,不用担心报错。
备注:内容来源于stack exchange,提问作者Tomer Shenkar
相关产品推荐
相关产品推荐

