当前位置: 首页 > news >正文

下一代图片格式 AVIF 在 vivo 社区的落地实践

作者:vivo 互联网前端团队- Liu Daqiang
本文分享 vivo 社区在 WebP 已全面落地的基础上,引入下一代图片格式 AVIF 的实践经验。通过 CDN 边缘缓存 + 服务端异步转码的方案,在保证画质的前提下,图片体积相比 WebP 进一步降低 20%+,有效提升了用户的浏览体验。

1分钟看图掌握核心要点👇

动图封面
 

图 1 VS 图 2,您更倾向于哪张图来辅助理解全文呢?欢迎在评论区留言。

一、背景:性能瓶颈与技术选型

vivo 社区作为内容聚合平台,图片与视频流量占比较高。在弱网等复杂环境下,首屏图片加载缓慢会直接导致 LCP(最大内容绘制)、FCP(首次内容绘制)等核心性能指标不佳,进而影响用户的浏览深度与留存。

尽管我们已经通过 WebP 格式将图片体积优化了约 50%,但对极致用户体验的追求是持续不断的。随着 AVIF 格式的成熟与浏览器支持率的提升,我们决定对其进行调研与落地,旨在 WebP 的基础上进行"二次瘦身"

二、技术调研:为什么是 AVIF?

卓越的压缩效率:

AVIF 基于先进的 AV1 视频编码标准。在同等主观画质下,其体积相比 JPEG 可减小 60% 以上;即使在相同码率下,其 PSNR(峰值信噪比)和 SSIM(结构相似性)指标也优于 WebP,能保留更多图像细节。

强大的生态支持:

Chrome、Firefox、Edge 及 Safari 16+ 已全面支持,移动端覆盖率达 90% 以上。主流 CDN 与服务商(如 Cloudflare、阿里云)均已提供转码支持,开源工具链也趋于完善。

可行的收益目标:

我们设定的技术目标是,在 PSNR ≥ 35 dB 的前提下,AVIF 体积相比 WebP 能有 20% 以上的缩减。调研数据表明,这一目标具备可行性。

三、方案设计:平滑、可控的降级策略

我们的核心设计原则是:为支持 AVIF 的客户端提供最优体验,对不支持的客户端实现无缝降级,并确保服务端稳定性。

整体流程如下图所示:

方案核心点解析:

  1. 智能请求:前端判断客户端对 AVIF 的支持,向服务端请求 AVIF 格式图片。
  2. CDN 缓存优先:充分利用 CDN 边缘节点缓存,同一图片只需转换一次,即可服务全网用户。
  3. 服务端异步转码:为避免实时转码带来的延迟,我们采用 异步转码 策略。首次请求 AVIF 时,若未生成,则返回 404 并触发异步转码任务,同时前端降级显示 WebP 版本。当转码完成后,后续所有请求都将命中缓存,用户体验无损。
  4. 完备的降级方案:在任何环节出现失败时,系统都将自动降级至 WebP 格式,确保页面功能的正常可用。

四、前端实现:智能格式选择与降级策略

我们的核心思路是:

在前端首先检测浏览器是否支持 AVIF 格式,如果支持,则在图片请求的 URL 中附加参数(或修改 URL 路径)以请求 AVIF 格式;否则回退至 WebP 格式。

1.能力检测

我们使用 Image 对象进行异步检测,以判断浏览器是否支持 AVIF 解码。

/*** 检测浏览器是否支持 AVIF 图片格式* @returns {Promise<boolean>}*/async function checkAvifSupport(){// 创建一个 Image 对象,并设置 src 为一个最小的、有效的 AVIF 图片数据returnnew Promise((resolve) => {const image = new Image();image.onload = image.onerror = () => {resolve(image.height === 2);};image.src ="data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=";});
}// 由于检测是异步操作,我们通常会在应用初始化时执行一次检测,并将结果缓存起来以供后续使用。let isAvifSupported = false;(async () => {isAvifSupported = await checkAvifSupport();
})();

2.图片 URL 组装

根据检测结果,动态组装请求图片的 URL。

/*** 根据浏览器支持情况,生成最优格式的图片 URL* @param {string} imageId 图片的唯一标识符* @param {string} defaultFormat 默认格式,如 'webp'* @returns {string}*/function getOptimizedImageUrl(imageId, defaultFormat = "webp"){const format = isAvifSupported ? "avif" : defaultFormat;return `https://cdn.example.com/images/${imageId}.${format}`;
}

3.自动降级

如果图片加载失败,无论是还未生成 avif 图片,还是其他原因导致的异常,都会自动降级到 WebP 格式。

<img :src="getOptimizedImageUrl(imageId)">
<script>const img = document.querySelector('img');// 设置降级逻辑
img.onerror = function() {const currentSrc = this.src;const baseUrl = currentSrc.substring(0, currentSrc.lastIndexOf('.'));if (currentSrc.endsWith('.avif')) {this.src = baseUrl + '.webp';} elseif (currentSrc.endsWith('.webp')) {this.src = baseUrl + '.jpg';}
};</script>

五、效果验证:数据驱动的优化迭代

1.验证标准与实验设计

我们采用客观数据与主观评测相结合的方式:

客观指标:体积压缩率、PSNR (≥35 dB 为目标)、SSIM(≥0.95 为目标)。

  • PSNR(峰值信噪比):衡量重建图像与原始图像之间的误差,值越高代表图像质量越好
  • SSIM(结构相似性):从亮度、对比度和结构三个维度评估图像相似度,越接近 1 表示与原图越相似

主观评测:团队内部对转换后的图片进行盲测,确保无肉眼可见的质量损失

实验条件:

  • 测试设备:Mac + Chrome 浏览器无痕模式
  • 网络环境:同一网络条件下测试,排除带宽波动影响
  • 对比基准:WebP 使用质量参数 Q=75%
  • 样本分层:分别测试 1M 以下、1-5M、5M 以上的 PNG 和 JPG 图片

2.数据对比

以下为一期(CRF=32)与二期(CRF=35)调优后的部分数据对比:

表注:

  • 负值表示体积增加:当 AVIF 相比 WebP 的体积缩减率为负值时,表示 AVIF 文件体积反而比 WebP更大
  • PNG 画质指标说明:由于 PNG 为无损格式,转换为有损格式(AVIF)的 PSNR/SSIM 指标对比意义有限,故未纳入测量
  • 体积缩减率计算公式:(1 - 目标格式体积/基准格式体积) × 100%
  • PSNR/SSIM 参考标准:PSNR ≥ 35 dB,SSIM ≥ 0.95 为优质画质标准

3.数据结果

  • AVIF 相比 JPG 实现了 77%-90% 的体积优化,相比 WebP 进一步减少 30%-40%
  • 在大图场景(>5MB)收益最为显著,绝对体积减少最多
  • CRF35 参数在体积优化上表现更好,但 PSNR 略有下降

4.渲染&加载效果

下图为人物风景图片和海报类图片的渲染效果,这是我们使用到的主要图片类型,原图,WebP 图片,AVIF 图片放到一起比较基本看不出差别,海报类图片中文字清晰无损失。

▼【人物风景图】

▼【海报类图】

在加载速度方面,于同一设备及网络条件下,AVIF 图片的加载速度明显快于 WebP 要快(原图较大,考虑到带宽影响,验证视频未加载原图,左边为原图,中间为 WebP,右边为 AVIF)

动图封面
 

5.上线效果

通过线上 A/B 测试验证,采用 AVIF 格式后:

  • LCP 时间优化 15-25%:核心用户体验指标获得有效提升。
  • 首屏图片加载效率提升 30%+:页面内容渲染速度大幅加快。
  • 页面总带宽消耗下降超过 30%:在提升体验的同时,有效降低了流量成本。

6.结论

通过引入 AVIF 并采用稳健的降级方案,vivo 社区在未牺牲兼容性与用户体验的前提下,显著降低了带宽成本,并提升了核心页面的加载性能,验证了 AVIF 在大型内容平台落地的价值。

六、实践中遇到的挑战与思考

1. PNG 转 AVIF 对比 Webp 似乎收益不明显?

  • AVIF 和 WebP 对 PNG(通常为无损)的压缩率均达到了 90% 以上,使其体积下降了 1-2 个数量级,导致二者压缩后的绝对体积差异很小。
  • 在相同码率下,AVIF 可以保留更多的图片纹理和细节,对用户更友好。
  • AVIF 相比其前身 VP9,在相同解码视频质量下实现了超过 30% 的码率降低。

2.转码速度与性能开销怎么样?

  • AVIF 编码耗时确实高于 WebP。因此,我们放弃了实时转码方案,转而采用异步任务模式。这将计算压力后置,避免了对用户请求响应的直接影响。
  • 解码性能在现代浏览器内置优化下,其损耗远小于体积减小带来的加载性能收益,整体体验为正优化。

 

参考资料

  • AVIF has landed
  • Comparing AVIF vs WebP file sizes at the same DSSIM
  • How to Use AVIF: The New Next-Gen Image Compression Format
  • AVIF for Next-Generation Image Coding
  • A Technical Overview of AV1
http://www.jsqmd.com/news/769824/

相关文章:

  • 别再让H5长列表卡死你的Vue3应用了!手把手教你用vue-virtual-scroller搞定虚拟滚动
  • 容器安全实战指南:用Trivy与Clair守护你的Searx隐私搜索引擎
  • Can-I-Take-Over-XYZ终极指南:未来发展与安全防护路线图
  • FPGA时序优化小技巧:为什么你的三段式状态机跑不快?试试给输出加个寄存器
  • 终极指南:5步解决text-generation-webui在Linux的Python环境冲突
  • 基于栅格法的机器人工作空间划分系统
  • 从用量看板观察不同模型调用延迟与 token 消耗对比
  • 2026称重传感器质量好,广东犸力匠心制造值得信赖 - 品牌速递
  • 如何在5分钟内快速上手OpenBoardView:电路板设计文件查看终极指南
  • LabVIEW 2023 Q3 下 DAQ 助手罢工?别慌,用底层 DAQmx VI 照样玩转数据采集
  • AI智能体如何通过MCP协议操控电脑?human-mcp项目实战解析
  • 2026测力传感器哪家靠谱?广东犸力深耕行业多年,用品质赢得市场广泛赞誉 - 品牌速递
  • 避开预警期刊!手把手教你筛选2024年计算机领域SCI/SSCI投稿期刊(附CCF推荐列表)
  • 终极Electron React Boilerplate系统托盘开发指南:实现后台运行与状态监控的完整方案
  • 长期使用 Taotoken 聚合服务对业务稳定性的实际支撑体会
  • 卫星通信物联网:如何构建全球覆盖的数据传输网络终极指南
  • 如何快速解码社交音频:面向普通用户的Silk v3解码器完整指南
  • 常州六楼没电梯,福正美拎着设备上去,同业电话说改天 - 福正美黄金回收
  • 数控铣床工作台仿真实验系统的开发
  • 终极桌面分区指南:如何用NoFences免费打造整洁高效的Windows桌面?
  • 摄影作品批量水印终极指南:3步实现专业级参数标注
  • 2026深圳眼镜店大比拼:哪家最值得信赖? - 品牌企业推荐师(官方)
  • 用JavaScript自动化生成PowerPoint演示文稿的终极指南:PptxGenJS完整教程
  • 终极免费风扇控制软件:FanControl完整配置教程
  • EdXposed Hook代码规范终极指南:编写高质量Hook模块的10个黄金法则
  • Vim插件分类管理Vundle.vim:智能归类插件类型的终极指南
  • Manga OCR终极指南:3步搞定日漫文字识别,轻松阅读日语漫画
  • IEEE Vis会议投稿指南:从短文到长文,如何准备一篇能被TVCG收录的可视化论文?
  • 2026年Gemini3.1Pro写作加速全流程指南
  • Qt安装后第一件事:手把手带你用Qt Creator 12.0.1创建并运行第一个窗口程序