效果图
格式av1@0.3M的码率,跟格式h.264@5M的码率,画质竟然差不多!
GPU拉满全速编码!
目标
1.视频瘦身储存,画质不变
2.自动批量压缩视频,多层目录递归处理 (脚本https://www.amjun.com/2327.html)
3.免费 (ffmpeg)
4.转换快 (CUDA硬件加速)
硬件要求
cpu: 随便
gpu: GTX 1060 或 Quadro P400 及以上
压缩方案对比
编码 | 文件大小 (仅编码不同) | 发布 | 优点 | 缺点 | 其他 |
H.264 | 1G | 2003.05 | 支持广泛 | 占地方 | 软硬件支持超好 |
H.265 | 300M | 2013.04 | 文件小 | 设备解码累 | 需版权,导致软硬件支持不好 |
AV1 | 200M | 2018.03 | 文件更小 | 设备解码累 | 开源免费 |
实现步骤
- 下载安装“ffmpeg-git-full.7z”
https://www.gyan.dev/ffmpeg/builds/ - 准备显卡 - N卡1060以上
- 安装好显卡驱动
- 安装 cuda tool kit
CUDA Toolkit 12.9 Downloads | NVIDIA Developer - 查询当前环境下 ffmpeg&cuda支持的格式
./ffmpeg.exe -hide_banner -encoders | grep nvenc
然后看到支持av1的格式为:av1_nvenc
- 准备好 D:\原视频.mp4
- 开始转换 (具体参数参考手册 https://ffmpeg.p2hp.com/ffmpeg.html)
./ffmpeg.exe -hwaccel cuda -i "源文件路径" -c:v av1_nvenc -preset p7 -crf 30 -b:v 512k -vf scale=-1:720 -cpu-used 6 -threads 0 -c:a aac -b:a 128k -movflags +faststart -strict -2 "输出文件路径"
- 批量转换 (目录下多层目录,多视频)
需要修改三个地方:
bat脚本:@echo off chcp 65001 > nul setlocal enabledelayedexpansionrem 设置 ffmpeg 路径、需要压缩的文件目录,输出文件目录 set "ffmpeg_path=D:\Rudon\Tools\ffmpeg\bin\ffmpeg.exe" set "input_dir=D:\全局共享\压缩前" set "output_root_dir=D:\全局共享\压缩后"for /r "%input_dir%" %%F in (*.mp4) do (set "input_file=%%F"echo 待压缩文件: !input_file!call set "output_file=!input_file:%input_dir%=%output_root_dir%!"rem echo 压缩后文件: !output_file!for %%I in ("!output_file!") do set "output_dir=%%~dpI"rem echo 输出目录: !output_dir!mkdir "!output_dir!" 2>nulrem 检查输入文件是否存在if exist "!output_file!" (rem 调用函数比较输入文件和输出文件的时长echo 输出文件已存在: !output_file!call :compare_durations "!input_file!" "!output_file!")else (call :compress_file "!input_file!" "!output_file!")echo "================================分隔符================================" )echo 脚本执行完成!!!!!按任意键退出. pauserem 方法===比较视频时长 :compare_durations set "input_file=%~1" set "output_file=%~2"rem 获取输入文件、输出文件的时长 for /F "delims=" %%A in ('%ffmpeg_path% -i "!input_file!" 2^>^&1 ^| findstr /C:"Duration"') do (set "input_duration=%%A" ) for /F "delims=" %%B in ('%ffmpeg_path% -i "!output_file!" 2^>^&1 ^| findstr /C:"Duration"') do (set "output_duration=%%B" )for /F "tokens=2 delims= " %%C in ("!input_duration!") do (set "input_duration=%%C" ) for /F "tokens=2 delims= " %%D in ("!output_duration!") do (set "output_duration=%%D" )rem 忽略毫秒级别比较 for /F "tokens=1 delims=." %%F in ("!input_duration!") do (set "input_duration=%%F" ) for /F "tokens=1 delims=." %%G in ("!output_duration!") do (set "output_duration=%%G" )rem 比较输入文件和输出文件的时长 rem echo "%input_file%" 时长 ==== "!input_duration!" rem echo "%output_file%" 时长 ==== "!output_duration!" if "!input_duration!" neq "!output_duration!" (echo 时长不一致,重新压缩文件...call :compress_file "!input_file!" "!output_file!" ) else (echo 时长一致,无需重新压缩文件. )goto :eofrem 方法===压缩文件 :compress_file set "input_file=%~1" set "output_file=%~2" echo 正在压缩文件: !input_file! 请稍等... "%ffmpeg_path%" -loglevel quiet -hwaccel cuda -i "!input_file!" -c:v av1_nvenc -preset p7 -crf 30 -b:v 512k -vf scale=-1:720 -cpu-used 6 -threads 0 -c:a aac -b:a 128k -movflags +faststart -strict -2 "!output_file!" -y -progress progress.txt 2>&1 | findstr "time=" > con echo 压缩完成,输出文件为: !output_file! 请稍等... call :compare_durations "!input_file!" "!output_file!"goto :eof
参考自 https://www.amjun.com/2327.html
更高目标
Web前端视频压缩省流,最小av1、中等h265、兼容h264,参考
https://zhuanlan.zhihu.com/p/1900946363786691369
ending...