AVIF 与 HEIF 编码、位深(Bit Depth)与速度档位调优
AVIF 将 AV1 视频帧内编码封装在 HEIF(ISO Base Media File Format)容器中。在相同主观画质下,AVIF 通常比 JPEG 节省约 40%~50% 的体积,比 WebP 节省约 15%~25%,且支持 8-bit、10-bit 与 12-bit 位深以及 HDR 色域。
在 libvips 中,AVIF 与 HEIC/HEIF 共享底层的 heifload / heifsave 算子(通过 libheif 调用 aom、rav1e 或 svt-av1 编码器),并将 compression 参数设为 av1。
AVIF 编码参数跨绑定对照
Section titled “AVIF 编码参数跨绑定对照”| 参数项 | govips AvifExportParams |
sharp .avif(options) |
pyvips / vips CLI heifsave |
生产推荐值与说明 |
|---|---|---|---|---|
| 质量因子 | Quality(默认 80) |
quality(默认 50) |
Q=55 / --Q 55 |
注意默认值差异:AVIF 压缩效率高,线上常用 50 ~ 65(约对应 JPEG 80 ~ 85) |
| 编码速度 / 耗时 | Effort(0..9,默认 5;旧字段 Speed 已废弃) |
effort(0..9,默认 4) |
effort=4 / --effort 4 |
在 libvips >= 8.13 下方向一致:0 最快但体积较大,9 最慢压缩率最高(实时服务推荐 3 ~ 5) |
| 无损模式 | Lossless: true |
lossless: true |
lossless=True / --lossless |
AVIF 无损压缩率通常不如无损 WebP,且耗时较高 |
| 位深(Bit Depth) | Bitdepth(8 / 10 / 12) |
bitdepth(8 / 10 / 12) |
bitdepth=8 |
8-bit 兼容性最广;10/12-bit 适合广色域/HDR 且需编码器支持 |
| 色度抽样 | —(AvifExportParams 未暴露 subsample_mode) |
chromaSubsampling(默认 '4:4:4') |
subsample_mode |
sharp / pyvips / CLI 对摄影图显式设为 '4:2:0'(或 on)可进一步减小体积并兼容硬件解码器 |
四入口 AVIF 导出代码示例
Section titled “四入口 AVIF 导出代码示例”package main
import ( "fmt" "os"
"github.com/davidbyttow/govips/v2/vips")
func main() { if err := vips.Startup(nil); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer vips.Shutdown()
// 运行前可先探测当前编译环境是否支持 AVIF if !vips.IsTypeSupported(vips.ImageTypeAVIF) { fmt.Fprintln(os.Stderr, "AVIF is not supported by this libvips build") os.Exit(1) }
image, err := vips.NewImageFromFile("input.jpg") if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer image.Close()
params := vips.NewAvifExportParams() params.Quality = 55 params.Bitdepth = 8 params.Effort = 4 // 0..9,数值越小编码越快(NewAvifExportParams 默认 5) params.StripMetadata = true
data, _, err := image.ExportAvif(params) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } if err := os.WriteFile("output.avif", data, 0o644); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) }}import sharp from 'sharp';
await sharp('input.jpg') .avif({ quality: 55, effort: 4, // 0..9,数值越小编码越快 bitdepth: 8, chromaSubsampling: '4:2:0', }) .toFile('output.avif');import pyvips
image = pyvips.Image.new_from_file("input.jpg")
# .avif 扩展名会自动选择 heifsave 并设置 compression="av1"image.write_to_file( "output.avif", Q=55, effort=4, bitdepth=8, subsample_mode="on", keep="icc",)#!/usr/bin/env bashset -euo pipefail
vips heifsave input.jpg output.avif \ --compression av1 \ --Q 55 \ --effort 4 \ --bitdepth 8 \ --subsample-mode on \ --keep icc流式写出与编解码器可用性边界
Section titled “流式写出与编解码器可用性边界”govips v2.19.0的流式写出边界:govips提供了SaveToWriterHeif(w, heifParams),但没有单独的SaveToWriterAvif包装函数;导出 AVIF 时请使用image.ExportAvif(avifParams)(或在SaveToWriter中传入Format: vips.ImageTypeAVIF的ExportParams)。libheif后端差异:系统安装的libheif可能只编译了 AV1 编码器(支持 AVIF),而未编译具有专利限制的 HEVC/x265 编码器(不支持导出.heic)。若遇到Unsupported compression错误,请参阅缺少编解码器与格式不支持。