FFmpeg批量压缩视频时的文件名动态修改及递归处理子文件夹问题
FFmpeg批量压缩视频时的文件名动态修改及递归处理子文件夹问题
嗨,我来帮你搞定这两个头疼的问题!咱们一步步拆解解决:
一、解决文件名冲突与动态命名问题
你现在碰到的“无法写入同一文件”和覆盖提示,核心问题出在输出文件名格式错误,还有环境变量命名不规范:
- 首先,环境变量不能以数字开头(你用了
set 0=compressed),这会导致变量无法正常解析,改成更合理的命名比如suffix=_compressed就好。 - 之前用
%%i.mp4的话,原文件如果是test.mkv,输出会变成test.mkv.mp4(带双扩展名);而%%~ni是取不带扩展名的原文件名,这才是你真正需要的。
修正后的单文件夹处理代码如下:
@echo off set suffix=_compressed :: 遍历当前文件夹下的指定格式视频 for %%i in (*.mkv, *.mp4, *.mov) do ( :: 输出格式:原文件名+suffix+.mp4,比如test.mkv → test_compressed.mp4 ffmpeg -i "%%i" -vcodec libx265 -crf 24 "%%~ni%suffix%.mp4" )
这样输出文件名和原文件完全不重复,FFmpeg就能正常写入,不会再弹出覆盖提示或者报错了。
二、递归处理所有子文件夹
要让脚本自动遍历当前文件夹及所有子文件夹,只需要把普通的for命令换成for /r(/r参数表示递归遍历子目录),同时要保证压缩后的文件和原文件在同一子目录下,所以输出路径要用%%~dpni(d代表驱动器,p代表路径,n代表文件名):
完整的递归处理脚本:
@echo off set suffix=_compressed :: 递归遍历当前目录及所有子目录下的视频文件 for /r %%i in (*.mkv, *.mp4, *.mov) do ( :: 输出文件和原文件同目录,文件名带_compressed后缀 ffmpeg -i "%%i" -vcodec libx265 -crf 24 "%%~dpni%suffix%.mp4" )
额外补充几个参数含义:
%%~dpni:提取原文件的驱动器+路径+不带扩展名的文件名,比如D:\videos\sub\test.mkv会被解析成D:\videos\sub\test,加上后缀和mp4扩展名后,最终输出D:\videos\sub\test_compressed.mp4。- 如果你之后要删除原文件,可以在ffmpeg命令执行成功后加一句
del "%%i",但建议先测试几批压缩效果,确认没问题再添加删除命令哦!
备注:内容来源于stack exchange,提问作者Voidmaster01
相关产品推荐
相关产品推荐

