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"
done

Windows 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 调用,支持七种格式互转

十、重要注意事项汇总

  1. AVIF 是图片格式,标准实现下不含音频轨道
  2. RTX 30 系列显卡不支持 AV1 硬件编码,仅支持解码
  3. 转换时应从原始文件直接编码,避免多次有损压缩
  4. 单张图片转静态 AVIF 必须加 -still-picture 1(CPU 软编码时)
  5. 硬件编码器(av1_nvenc)不支持 -still-picture 参数
  6. 编码卡在 frame=0 是正常现象,是编码器的初始化阶段
  7. 批量转换静态图片不要用图片序列语法,需用循环脚本
  8. 网页中使用 AVIF 建议配合 <picture><source> 做降级处理
  9. -cpu-used 值越大编码越快,但画质越低
  10. -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.mp4947 KBzhao2n.mp4891 KB-5.9%
MP4 → AVIFzhao2n.mp4891 KBzhao2n2.avif279 KB-68.7%
MP4 → GIF(直接)zhao2n.mp4891 KBzhao2n2.gif594 KB-33.3%
MP4 二次压缩zhao2n.mp4891 KBzhao2n2.mp4187 KB-79.0%
压缩 MP4 → GIFzhao2n2.mp4187 KBzhao2n22.gif522 KB相对直接 GIF -12.1%
AVIF → GIFzhao2n2.avif279 KBzhao2n3.gif5.17 MB+1753%

四、关键结论

  1. 去除音频:对视频体积影响有限(约 6%),但有助于后续处理。
  2. AVIF 压缩效率极高:从 891 KB 压缩至 279 KB,压缩率约 68.7%,是所有测试中压缩比最高的方案。
  3. GIF 格式膨胀严重

    • 从 MP4 转 GIF,文件反而可能增大
    • 从 AVIF 转 GIF,文件可膨胀 18 倍
    • 原因:GIF 使用古老的 LZW 压缩算法,不支持帧间压缩
  4. AVIF 包含多流:AVIF 文件可能包含封面流(低帧率)和动画流(高帧率),转换时需使用 -map 正确选择目标流。
  5. GIF 优化建议

    • 降低帧率(fps)
    • 缩小分辨率(scale)
    • 先压缩 MP4 再转 GIF 可略微减小体积

五、网页使用建议

格式文件大小加载速度兼容性适用场景
MP4891 KB(可进一步压缩)所有现代浏览器首选视频格式
AVIF279 KB较快较新浏览器静态图片或支持 AVIF 的现代浏览器
GIF594 KB - 5.17 MB所有平台仅作为低版本浏览器的降级方案

推荐方案:网页中使用 MP4 格式,配合 <video> 标签的 <source> 实现多格式降级。

标签: none

添加新评论