阿水的世界。

01月 06

批量压缩MP4文件

最近工作上有需求,需要批量将视频文件进行压缩,且保证视频的质量不能太糊。因此,我写了个使用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]下载。

 

 

 

标签:none

还不快抢沙发

添加新评论

captcha