最近工作上有需求,需要批量将视频文件进行压缩,且保证视频的质量不能太糊。因此,我写了个使用FFmpeg批量压缩视频的批处理命令,直接将指定文件夹内所有的mp4文件进行压缩,并按照输入文件夹中的目录结构,在输出文件夹中形成转换后的文件。整体效果不错,录制的视频文件61GB,原始分辨率19201080,音频196kb/s,压缩后分辨率960540,音频96kb/s,文件大小1.85GB,且画面可接受,不太糊。具体代码如下:
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
rem 设置输入文件夹input和输出文件夹output,全用英文,路径中不能有空格
set "INPUT_DIR=D:\works\input\"
set "OUTPUT_DIR=D:\works\output\"
rem 如果输出文件夹不存在,则创建它
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"
rem 使用 /R 递归遍历所有子目录中的.mp4文件
for /R "%INPUT_DIR%" %%i in (*.mp4) do (
rem 提取纯文件名和扩展名
set "base_name=%%~ni"
set "file_ext=%%~xi"
rem 获取文件所在目录(去掉文件名)
set "file_dir=%%~dpi"
rem --- 核心:计算并创建对应的输出子目录 ---
rem 计算相对于输入目录的路径,确保路径正确替换
set "rel_path=!file_dir:%INPUT_DIR%=!"
rem 构建输出子目录路径
set "output_subdir=%OUTPUT_DIR%!rel_path!"
rem 确保输出子目录存在(mkdir会自动创建多级目录)
if not exist "!output_subdir!" mkdir "!output_subdir!"
rem 构建完整的输出文件路径
set "output_path=!output_subdir!!base_name!_converted.mp4"
rem -----------------------------------------
rem 显示信息
echo 正在处理: "%%i"
echo 输出到: "!output_path!"
rem 执行ffmpeg压缩命令 libx264编码方式,crf控制视频质量,28是质量参数,越小质量越好,但文件越大,
rem -vf "scale='min(960, iw)':-2" 视频缩放,-2是保持宽高比,min(960, iw)是宽度不超过960,不需要缩放直接删除即可
rem -c:a aac -b:a 96k 音频编码为aac,比特率96k
ffmpeg -y -i "%%i" -c:v libx264 -crf 28 -vf "scale='min(960, iw)':-2" -c:a aac -b:a 96k "!output_path!"
if !errorlevel! neq 0 (
echo 错误: 处理 "%%i" 时出现问题
) else (
echo 成功处理: "%%i"
)
echo ----------------------------------------
)
echo 所有文件处理完成!
pause这段代码可在win环境下使用,另存成bat或cmd文件,修改输入文件夹input和输出文件夹output(路径全英文,路径中不能有空格),然后执行就行,需要用到FFmpeg.exe,如果没有可以下载一个win版的。视频压缩效果可以修改ffmpeg -y -i "%%i" -c:v libx264 -crf 28 -vf "scale='min(960, iw)':-2" -c:a aac -b:a 96k "!output_path!"这句中的相关参数。
windows用的ffmpeg可以从[https://www.gyan.dev/ffmpeg/builds/#release-builds][1]或者[https://github.com/BtbN/FFmpeg-Builds/releases][2]下载。
还不快抢沙发