场景:有些视频删掉可惜,不删占用空间,几秒钟的视频有几百到1G的大小,还有一些监控视频,有时候想调用,发现被覆盖了,如果要留着,空间占用太多,所以想有方法把视频极致的压缩,能看清楚但体积尽量的小,所以我吧问题丢给了deepseek,让他利用ffmpeg,写一个bat脚本。
效果展示:
压缩参数:
:: 视频参数
set "RESOLUTION=-2:720" :: 分辨率设置(保持宽高比),格式为 宽度:高度
:: 示例:-2:480(480p),1280:-2(宽度1280保持比例)
:: 默认-2:720表示高度压缩到720p,宽度自动计算
set "CRF=28" :: 压缩质量(0-51,越小质量越高)
:: 建议范围:23-28(肉眼无明显质量损失)
:: 极致压缩推荐28-35(可感知质量下降)
set "PRESET=slow" :: 编码器预设(可选:ultrafast, superfast, veryfast, faster, fast,
:: medium, slow, slower, veryslow)
:: 越慢压缩率越高,文件越小,但编码时间越长
set "VIDEO_CODEC=libx265" :: 视频编码器(推荐libx265/HEVC压缩率最高)
:: 兼容性考虑可用libx264(但压缩率较低)
:: 音频参数
set "AUDIO_BITRATE=64k" :: 音频比特率(建议32k-128k)
:: 极致压缩可降至32k,正常使用64k-96k
set "AUDIO_CHANNELS=2" :: 音频声道数(1单声道,2立体声)
脚本代码:
@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion
::##############################################################################
:: 用户可修改参数区
::##############################################################################
set "FFMPEG_PATH=C:\FFmpeg\bin" ::ffmpeg所在路径
set "OUTPUT_DIR=CompressedVideos" ::保存文件夹
set "RESOLUTION=-2:720" ::分辨率,默认-2:720表示高度压缩到720p,宽度自动计算
set "CRF=28" ::压缩质量(0-51,越小质量越高)|建议范围:23-28(肉眼无明显质量损失)| 极致压缩推荐28-35(可感知质量下降)
set "PRESET=slow" ::编码器预设(可选:ultrafast, superfast, veryfast, faster, fast,medium, slow, slower, veryslow)| 越慢压缩率越高,文件越小,但编码时间越长
set "VIDEO_CODEC=libx264"
set "AUDIO_BITRATE=64k"
set "AUDIO_CHANNELS=2"
set "FILE_EXTS=*.ts *.mp4 *.mkv *.mov *.avi"
::##############################################################################
:: 脚本核心逻辑修正版
::##############################################################################
if not exist "%FFMPEG_PATH%\ffmpeg.exe" (
echo [ERROR] FFmpeg路径错误:%FFMPEG_PATH%
timeout /t 15
exit /b 1
)
if defined OUTPUT_DIR (
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"
set "OUTPUT_FLAG=1"
)
if "%~1"=="" (call :batch_process) else (call :drag_drop_process "%~1")
timeout /t 30
exit /b 0
::──────────────────────────────────────────────────────────────────────────────
:drag_drop_process
set "input=%~1"
set "filename=%~nx1"
call :compress "!input!" "!filename!"
exit /b
::──────────────────────────────────────────────────────────────────────────────
:batch_process
echo 正在扫描当前目录视频文件...
for %%i in (%FILE_EXTS%) do (
if exist "%%i" (
set "input=%%i"
set "filename=%%~nxi"
call :compress "!input!" "!filename!"
)
)
exit /b
::──────────────────────────────────────────────────────────────────────────────
:compress
setlocal
set "input=%~1"
set "filename=%~2"
:: 输入文件存在性检查
if not exist "!input!" (
echo [错误] 输入文件不存在:!input!
endlocal
exit /b 1
)
:: 编码格式后缀生成
if /i "!VIDEO_CODEC!"=="libx264" (
set "codec_suffix=h264"
) else if /i "!VIDEO_CODEC!"=="libx265" (
set "codec_suffix=h265"
) else (
set "codec_suffix=!VIDEO_CODEC!"
)
:: 解析分辨率
for /f "tokens=1,2 delims=:" %%a in ("%RESOLUTION%") do (
set "width=%%a"
set "height=%%b"
)
:: 构建输出路径(强制UTF-8处理)
set "base_name=!filename:%~x1=!"
if defined OUTPUT_FLAG (
set "output=!OUTPUT_DIR!\!base_name!_!codec_suffix!_!height!p.mp4"
) else (
set "output=!input:~0,-4!_!codec_suffix!_!height!p.mp4"
)
echo 正在处理:"!filename!"
echo 输出格式:!codec_suffix!_!height!p
:: FFmpeg执行命令(添加双引号处理空格路径)
"%FFMPEG_PATH%\ffmpeg.exe" -hide_banner -y -i "!input!" ^
-c:v %VIDEO_CODEC% ^
-crf %CRF% ^
-preset %PRESET% ^
-vf "scale=%RESOLUTION%" ^
-c:a aac ^
-b:a %AUDIO_BITRATE% ^
-ac %AUDIO_CHANNELS% ^
-f mp4 ^
"!output!"
endlocal
exit /b
视频片段截取工具
@echo off
setlocal enabledelayedexpansion
:: 配置FFmpeg路径(结尾不要带反斜杠)
set "FFMPEG_PATH=C:\FFmpeg\bin"
:: 检查文件拖放操作
if "%~1"=="" (
echo 请将视频文件拖拽到此批处理文件上
pause
exit /b 1
)
:: 设置输入输出路径
set "input_file=%~f1"
set "output_file=%~dpn1_trimmed%~x1"
:: 验证文件存在性
if not exist "%input_file%" (
echo 错误:文件不存在
echo "%input_file%"
pause
exit /b 1
)
:: 验证FFmpeg可执行文件
if not exist "%FFMPEG_PATH%\ffmpeg.exe" (
echo FFmpeg未找到于指定路径:
echo "%FFMPEG_PATH%"
pause
exit /b 1
)
:: 执行快速截取命令
"%FFMPEG_PATH%\ffmpeg" -hide_banner -y -ss 290 -i "%input_file%" -t 3 -c copy "%output_file%"
:: 结果反馈
if errorlevel 1 (
echo 截取失败,请检查以下可能原因:
echo 1. 视频长度不足10秒
echo 2. 文件格式不支持流拷贝
echo 3. 输入文件损坏
) else (
echo 成功生成10秒片段:
echo "%output_file%"
)
pause