AVIF图片格式及FFmpeg转换
AVIF 图片格式及 FFmpeg 转换完整笔记
一、AVIF 格式概述
AVIF(AV1 Image File Format)是一种基于 AV1 视频编码技术的现代图片格式,由开放媒体联盟(AOMedia)开发,免费免版税。
核心特性
- 压缩效率极高:相比 JPEG,在画质相近时体积减少约 50%
- 相比 WebP,可再节省约 30-35% 的体积
- 支持有损/无损压缩、透明通道、动画、HDR
浏览器支持
主流浏览器最新版本均已支持,开发时建议使用 <picture> 标签做降级处理。
二、本地查看 AVIF 文件
Windows 系统
- 自带照片应用需安装 AV1 Video Extension 插件
- 推荐使用第三方软件:JarkViewer、PicView、GIMP、digiKam
- 注意:安装插件后仍可能无法打开 10bit 及以上色深的 AVIF 文件
macOS 系统
- macOS Ventura 及更新版本自带的预览和照片 App 已支持
- 部分用户反映通过 Safari 或快速查看(空格预览)查看动图时可能卡顿
- 可安装 iPreview 等扩展增强快速查看功能
通用方案
将 .avif 文件拖入最新版 Chrome 或 Edge 浏览器窗口即可打开。
三、FFmpeg 转换为 AVIF
前置检查
检查 FFmpeg 是否包含 AV1 编码器:
ffmpeg -encoders | grep av1输出包含 libaom-av1 或 libsvtav1 则表示可用。
单张图片转静态 AVIF
ffmpeg -i input.png -c:v libaom-av1 -still-picture 1 output.avif参数说明:
-i input.png:指定输入文件-c:v libaom-av1:使用 libaom-av1 编码器(CPU 软编码)-still-picture 1:输出为静态图片而非动画(关键参数)
视频或图片序列转动画 AVIF
ffmpeg -i input.mp4 -c:v libaom-av1 output.avif图片序列输入(注意:此命令会将多张图片合成一个动图):
ffmpeg -i frame_%02d.png -c:v libaom-av1 animated.avif循环控制:添加 -loop 0 表示无限循环。
批量转换多张图片为独立静态 AVIF
Linux/macOS:
for f in *.png; do
ffmpeg -i "$f" -c:v libaom-av1 -still-picture 1 "${f%.png}.avif"
doneWindows CMD:
for %f in (*.png) do ffmpeg -i "%f" -c:v libaom-av1 -still-picture 1 "%~nf.avif"加速 CPU 编码
ffmpeg -i input.mp4 -c:v libaom-av1 -cpu-used 8 -row-mt 1 output.avif参数说明:
-cpu-used 8:速度优先预设,范围 0-8,数值越大速度越快,画质损失越轻微-row-mt 1:启用行级多线程,充分利用多核 CPU
调整文件大小(CRF 控制)
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 35 output.avif- CRF 值越大,画质越低,文件越小
- 默认约 30,可尝试 35 或 40
四、硬件编码支持
调用显卡的通用语法
ffmpeg -hwaccel cuda -i input.mp4 -c:v av1_nvenc output.avif参数说明:
-hwaccel cuda:启用 CUDA 硬件加速上下文-c:v av1_nvenc:使用 NVIDIA 的 AV1 硬件编码器
RTX 3060 的实际情况
重要结论:RTX 3060 不支持 AV1 硬件编码。
测试命令:
ffmpeg -encoders | findstr nvenc错误信息示例:
[av1_nvenc @ ...] Codec not supported
[av1_nvenc @ ...] Provided device doesn't support required NVENC features这说明:
- RTX 30 系列显卡仅支持 AV1 硬件解码(播放),不支持硬件编码(生成)
- AV1 硬件编码是 RTX 40 系列才新增的功能
硬件编码的替代方案:HEVC (H.265)
由于 RTX 3060 对 HEVC 硬件编码支持完善,可以优先考虑此格式。
ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc -preset p7 output.mp4参数说明:
-hwaccel cuda:启用 CUDA 加速-c:v hevc_nvenc:使用 NVIDIA 的 HEVC 硬件编码器-preset p7:速度优先预设(p1-p7,p7 最快)
五、常见错误及处理
错误:转换长时间卡在 frame=0
现象:
frame= 0 fps=0.0 q=0.0 size= 0KiB time=N/A ...原因:
- 编码器正在初始化,AV1 编码极其消耗资源
- 并非死机,而是编码前的运算准备阶段
处理:
- 不要按 Ctrl+C 中断
- 如果超过 5-10 分钟仍无进展,可终止后尝试加速参数
- 添加
-cpu-used 8 -row-mt 1重新执行
错误:still-picture 参数警告
Codec AVOption still-picture ... has not been used for any stream原因:硬件编码器(如 av1_nvenc)不支持该参数。
处理:硬件编码时去掉 -still-picture 1,或改用 CPU 软编码。
错误:Codec not supported
原因:显卡不支持该硬件编码器。
处理:改用 CPU 软编码,或换用支持硬件编码的格式(如 HEVC)。
六、MP4 基础操作
移除音频(生成无声视频)
ffmpeg -i input.mp4 -an -c:v copy output.mp4参数说明:
-an:audio no,丢弃音频-c:v copy:视频流直接复制,不重新编码,速度极快且无损
提取音频(移除视频)
ffmpeg -i input.mp4 -vn -c:a copy output.aac参数说明:
-vn:video no,丢弃视频-c:a copy:音频流直接复制
转 MP3 格式:
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 4 output.mp3精确选择保留的轨道
ffmpeg -i input.mp4 -map 0:v -map 0:a:0 -c copy output.mp4-map 0:v:保留第一个视频流-map 0:a:0:保留第一个音频流- 其他轨道全部丢弃
七、压缩 MP4 的完整流程
不推荐的做法(会导致文件反而变大)
步骤一:先用 H.264 高压缩率压缩 MP4
ffmpeg -i zhao2.mp4 -c:v libx264 -crf 32 output_smaller.mp4步骤二:再将压缩后的 MP4 转 AVIF
ffmpeg -i output_smaller.mp4 -c:v libaom-av1 -cpu-used 8 -row-mt 1 output.avif问题:
- 两次有损压缩,画质严重损失
- 第一次压缩引入的伪影(块状模糊)无法被 AV1 高效压缩
- 最终 AVIF 文件可能比中间产物更大
推荐做法:直接从原始文件一次转换
ffmpeg -i zhao2.mp4 -c:v libaom-av1 -cpu-used 8 -row-mt 1 output.avif如需进一步缩小体积,可调高 CRF:
ffmpeg -i zhao2.mp4 -c:v libaom-av1 -cpu-used 8 -row-mt 1 -crf 35 output.avif八、网页视频方案对比
| 格式 | 压缩率 | 浏览器兼容性 | 是否支持音频 | 硬件加速(RTX 3060) |
|---|---|---|---|---|
| AVIF | 最高 | 较新浏览器 | 否 | 不支持编码 |
| HEVC (H.265) | 高 | 部分浏览器 | 是 | 支持 |
| H.264 (MP4) | 中 | 全部浏览器 | 是 | 支持 |
网页兼容性处理示例
<video controls>
<source src="video.avif" type="video/avif">
<source src="video.mp4" type="video/mp4">
你的浏览器不支持视频播放。
</video>九、除 FFmpeg 外的 AVIF 转换工具
图形界面工具
- AVJPWConverter:开源,支持多线程批量转换和文件夹拖拽
- AnyConverter:macOS 专用,离线批量转换
- Converto:iOS/iPad/Mac 平台,本地处理,注重隐私
浏览器扩展
- 果核图片助手:Chrome 扩展,右键本地转换并保存为 AVIF
- Convert and Save Image As:Chrome 扩展,右键一键转换
命令行与开发者工具
- ata:Go 语言编写,支持命令行和图形界面,依赖 FFmpeg
- jpgconverter:Python 工具,支持多格式双向批量转换
- avifify:Node.js CLI,集成 sharp 库,适合 CI/CD 流程
云端服务
- 腾讯云数据万象:COS 图片高级压缩功能,支持实时转 AVIF
- WaveSpeedAI Image Converter:API 调用,支持七种格式互转
十、重要注意事项汇总
- AVIF 是图片格式,标准实现下不含音频轨道
- RTX 30 系列显卡不支持 AV1 硬件编码,仅支持解码
- 转换时应从原始文件直接编码,避免多次有损压缩
- 单张图片转静态 AVIF 必须加
-still-picture 1(CPU 软编码时) - 硬件编码器(av1_nvenc)不支持
-still-picture参数 - 编码卡在 frame=0 是正常现象,是编码器的初始化阶段
- 批量转换静态图片不要用图片序列语法,需用循环脚本
- 网页中使用 AVIF 建议配合
<picture>或<source>做降级处理 -cpu-used值越大编码越快,但画质越低-crf值越大文件越小,画质越低(AV1 编码器)
操作实例
FFmpeg 视频压缩与格式转换实验笔记
一、原始文件信息
- 原始文件:zhao2.mp4
- 原始大小:947 KB
- 视频时长:3 秒
二、操作记录与结果
1. 去除音频
命令:
ffmpeg -i zhao2.mp4 -an -c:v copy zhao2n.mp4参数说明:
-i zhao2.mp4:指定输入文件-an:audio no,丢弃音频轨道-c:v copy:视频流直接复制,不重新编码,保持原始画质
结果:
- 输出文件:zhao2n.mp4
- 文件大小:891 KB
- 减小:56 KB(约 5.9%)
2. MP4 转 AVIF
命令:
ffmpeg -i zhao2n.mp4 -c:v libaom-av1 -cpu-used 8 -row-mt 1 zhao2n2.avif参数说明:
-i zhao2n.mp4:指定输入文件(无声版 MP4)-c:v libaom-av1:使用 libaom-av1 编码器(CPU 软编码)-cpu-used 8:速度优先预设,范围 0-8,数值越大编码越快-row-mt 1:启用行级多线程,充分利用多核 CPU
结果:
- 输出文件:zhao2n2.avif
- 文件大小:279 KB
- 压缩率:从 891 KB 压缩至 279 KB,减小约 68.7%
3. MP4 直接转 GIF
命令:
ffmpeg -i zhao2n.mp4 -vf "fps=10,scale=480:-1:flags=lanczos" -c:v gif zhao2n2.gif参数说明:
-i zhao2n.mp4:指定输入文件-vf:视频滤镜(Video Filter)fps=10:设置输出帧率为每秒 10 帧scale=480:-1:宽度缩放到 480 像素,高度自动按比例调整flags=lanczos:使用 Lanczos 缩放算法,保持较好画质-c:v gif:指定 GIF 编码器
结果:
- 输出文件:zhao2n2.gif
- 文件大小:594 KB
- 从 891 KB 压缩至 594 KB,减小约 33.3%
4. MP4 二次压缩(H.264)
命令:
ffmpeg -i zhao2n.mp4 -c:v libx264 -crf 32 zhao2n2.mp4参数说明:
-i zhao2n.mp4:指定输入文件-c:v libx264:使用 H.264 编码器-crf 32:Constant Rate Factor,质量控制参数- 范围通常为 0-51
- 值越大,画质越低,文件越小
- 默认值为 23
- 32 属于较高压缩率,画质有明显损失
结果:
- 输出文件:zhao2n2.mp4
- 文件大小:187 KB
- 从 891 KB 压缩至 187 KB,减小约 79.0%
5. 压缩后 MP4 转 GIF
命令:
ffmpeg -i zhao2n2.mp4 -vf "fps=10,scale=480:-1:flags=lanczos" -c:v gif zhao2n22.gif参数说明: 同第 3 步,输入文件替换为压缩后的 MP4
结果:
- 输出文件:zhao2n22.gif
- 文件大小:522 KB
- 相比直接转 GIF(594 KB),进一步减小约 12.1%
6. AVIF 转 GIF
第一步:查看文件流信息
ffprobe zhao2n2.avif输出关键信息:
- Stream #0:0:Video,1 fps(静态封面/缩略图)
- Stream #0:1:Video,24 fps(动画视频流)
第二步:选择正确的流进行转换
ffmpeg -i zhao2n2.avif -map 0:1 zhao2n3.gif参数说明:
-i zhao2n2.avif:指定输入文件-map 0:1:强制选择第二个视频流(索引从 0 开始)- 0:0 为第一个流(封面)
- 0:1 为第二个流(实际动画)
结果:
- 输出文件:zhao2n3.gif
- 文件大小:5.17 MB
- 从 279 KB 的 AVIF 膨胀至 5.17 MB,增大约 18.5 倍
三、数据对比汇总
| 操作 | 输入文件 | 输入大小 | 输出文件 | 输出大小 | 变化 |
|---|---|---|---|---|---|
| 去除音频 | zhao2.mp4 | 947 KB | zhao2n.mp4 | 891 KB | -5.9% |
| MP4 → AVIF | zhao2n.mp4 | 891 KB | zhao2n2.avif | 279 KB | -68.7% |
| MP4 → GIF(直接) | zhao2n.mp4 | 891 KB | zhao2n2.gif | 594 KB | -33.3% |
| MP4 二次压缩 | zhao2n.mp4 | 891 KB | zhao2n2.mp4 | 187 KB | -79.0% |
| 压缩 MP4 → GIF | zhao2n2.mp4 | 187 KB | zhao2n22.gif | 522 KB | 相对直接 GIF -12.1% |
| AVIF → GIF | zhao2n2.avif | 279 KB | zhao2n3.gif | 5.17 MB | +1753% |
四、关键结论
- 去除音频:对视频体积影响有限(约 6%),但有助于后续处理。
- AVIF 压缩效率极高:从 891 KB 压缩至 279 KB,压缩率约 68.7%,是所有测试中压缩比最高的方案。
GIF 格式膨胀严重:
- 从 MP4 转 GIF,文件反而可能增大
- 从 AVIF 转 GIF,文件可膨胀 18 倍
- 原因:GIF 使用古老的 LZW 压缩算法,不支持帧间压缩
- AVIF 包含多流:AVIF 文件可能包含封面流(低帧率)和动画流(高帧率),转换时需使用
-map正确选择目标流。 GIF 优化建议:
- 降低帧率(fps)
- 缩小分辨率(scale)
- 先压缩 MP4 再转 GIF 可略微减小体积
五、网页使用建议
| 格式 | 文件大小 | 加载速度 | 兼容性 | 适用场景 |
|---|---|---|---|---|
| MP4 | 891 KB(可进一步压缩) | 快 | 所有现代浏览器 | 首选视频格式 |
| AVIF | 279 KB | 较快 | 较新浏览器 | 静态图片或支持 AVIF 的现代浏览器 |
| GIF | 594 KB - 5.17 MB | 慢 | 所有平台 | 仅作为低版本浏览器的降级方案 |
推荐方案:网页中使用 MP4 格式,配合 <video> 标签的 <source> 实现多格式降级。