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 还是值得深度研究,编码能力的伸缩性还是很强大的!