libaom 编码参数 g_usage 分析与实验
libaom
libaom是AOMedia Video 1 (AV1) 视频编码格式的参考实现库,由Alliance for Open Media (AOMedia) 开发和维护。它是一个开源项目,为开发者提供了实现AV1视频编码的工具。
- 主要特点 
- 开放和免版税:提供开放源代码的编码器,任何个人和组织都可免费使用,无需支付版税。
 - 高效的编码:旨在提供高效的视频压缩,适应不同网络条件和设备性能。
 - 跨平台支持:支持多种操作系统和平台,如Windows、Linux和macOS。
 - 多空间层和时间层编码:允许视频在不同分辨率和帧率下进行编码。
 - 社区支持:作为开源项目,得到活跃社区支持,不断有新功能和改进加入。
 - 可配置性:提供多种配置选项,开发者可根据应用需求调整编码参数。
 - 实时编码:支持实时编码,适用于直播和实时通信应用。
 - 兼容性:编码的视频可在支持AV1解码的任何播放器或设备上播放。
 
 - 应用场景
libaom被广泛应用于多种生产系统中,包括视频播放器、浏览器和视频服务提供商。尤其在流媒体、网页视频、视频会议等领域,因其高效的压缩性能和免版税的特性,成为降低带宽要求、提供高质量视频的理想选择。 
编码参数 g_usage 介绍
- 该编码参数用于指定编码器的使用场景,不同的 usage 值会影响编码器的内部参数配置和优化策略,定义了三个标准usage模式常量: 
- AOM_USAGE_GOOD_QUALITY: 高质量模式,适合存储和高质量流媒体
 - AOM_USAGE_REALTIME: 实时模式,优化低延迟
 - AOM_USAGE_ALL_INTRA: 全I帧模式,适合编辑和随机访问
 
 - 在使用命令行是关于该编码参数的说明:
 
  .usage = ARG_DEF("u", "usage", 1,"Usage profile number to use (0: good, 1: rt, 2: allintra)"),
 
- 在 validate_config 函数中配置验证当g_usage == AOM_USAGE_ALL_INTRA 的逻辑。
 
  if (cfg->g_usage == AOM_USAGE_ALL_INTRA) {RANGE_CHECK_HI(cfg, g_lag_in_frames, 0);  // 检查滞后帧数必须为0(全I帧模式不允许滞后编码)RANGE_CHECK_HI(cfg, kf_max_dist, 0);      // 检查关键帧最大间隔必须为0(全I帧模式每帧都是关键帧)}
 
- 在validate_config 函数会根据g_usage 的值检查cpu_used 参数的有效范围。 
- 实时模式( AOM_USAGE_REALTIME ):允许值0-11
 - 其他模式(高质量/全I帧):允许值0-9
 - cpu_used 参数控制编码速度与质量的权衡: 
- 值越小编码质量越高但速度越慢
 - 值越大编码速度越快但质量可能降低
 
 
 
  RANGE_CHECK(extra_cfg, cpu_used, 0,(cfg->g_usage == AOM_USAGE_REALTIME) ? 11 : 9);
 
- set_encoder_config 函数中有 g_usage 的设置逻辑,三种模式对应关系: 
- AOM_USAGE_REALTIME -> REALTIME :实时编码模式,优化低延迟
 - AOM_USAGE_ALL_INTRA -> ALLINTRA :全I帧编码模式,适合编辑和随机访问
 - 其他值 -> GOOD :默认高质量编码模式,适合存储和高品质流媒体
 
 
  switch (cfg->g_usage) {case AOM_USAGE_REALTIME: oxcf->mode = REALTIME; break;  // 实时编码模式case AOM_USAGE_ALL_INTRA: oxcf->mode = ALLINTRA; break; // 全I帧编码模式 default: oxcf->mode = GOOD; break;                      // 默认高质量编码模式}
 
编码参数 g_usage 实验
- 命令行:
./aomenc -w 1920 -h 1080 --fps=25/1 --passes=1 --usage=0 -o av1.ivf BasketballDrive_1920x1080_50.yuv - 视频序列说明:

 - 实验数据
 
| 视频序列 | g_usage | 码率(b/s) | PSNR(dB) | 编码耗时(ms) | 
|---|---|---|---|---|
| BasketballDrive_1920x1080_50.yuv | 0(good) | 309675 | y:31.861267 u:39.052929 v:37.547545 average:33.148538 | 12132722 | 
| 1(rt) | 307425 | y:27.402939 u:33.223680 v:32.291895 average:28.569930 | 11985 | 
总结
- 维持 300kb/s 的默认码率下, GOOD 模式编码耗时是REALTIME 模式的 1012 倍,GOOD 模式编码PSNR 比REALTIME 模式高出 4.6dB!
 - libaom 的 GOOD 模式感觉应用了 AV1 标准所有的编码工具集,而 REALTIME 模式为了实时性感觉只是应用了一些必备的简单的编码工具集,对比了压缩能力,感觉为了实现实时能力,压缩能力比 x264也没强太多!
 - libaom 还是值得深度研究,编码能力的伸缩性还是很强大的!
 
