libaom 码率控制实验:从理论到实践的深度探索
libaom 码率控制模式介绍
- 在 libaom 中定义了四种码率控制模式,分别是 VBR、CBR、CQ、Q;枚举类型会被用在编码器配置结构体 aom_codec_enc_cfg 中,通过 rc_end_usage 字段来设置编码器的码率控制策略。具体应用范围如下:
- AOM_VBR - 可变比特率模式
- 允许比特率根据视频内容复杂度动态变化
- 在简单场景使用较少比特,复杂场景使用更多比特
- 适合本地存储等对码率波动不敏感的场景
- AOM_CBR - 恒定比特率模式
- 强制编码器保持恒定的目标比特率
- 通过调整量化参数来实现
- 适合带宽受限的实时流媒体传输
- AOM_CQ - 受限质量模式
- 在保证一定质量水平的前提下尽量降低码率
- 质量与码率之间的折中方案
- AOM_Q - 恒定质量模式
- 完全以质量为目标,不考虑码率限制
- 适合对质量要求极高且不关心文件大小的场景
- AOM_VBR - 可变比特率模式
/*!\brief Rate control mode */
enum aom_rc_mode {AOM_VBR, /**< Variable Bit Rate (VBR) mode */AOM_CBR, /**< Constant Bit Rate (CBR) mode */AOM_CQ, /**< Constrained Quality (CQ) mode */AOM_Q, /**< Constant Quality (Q) mode */
};
libaom码率控制模式实验
- 编码命令行:
./aomenc -w 1920 -h 1080 --fps=25/1 --passes=1 --end-usage=vbr --target-bitrate=3000 --cpu-used=6 -o av1.ivf BasketballDrive_1920x1080_50.yuv
- 解码命令行:
ffmpeg -i av1.ivf vbr.yuv
- PSNR 计算命令行:
./ffmpeg -s <宽x高> -pix_fmt <像素格式> -i <受损YUV文件> -s <宽x高> -pix_fmt <像素格式> -i <原始YUV文件> -lavfi psnr=stats_file=psnr.log -f null -
- 视频序列示意图
- 实验数据
视频序列 | rc_end_usage | PSNR(dB) | 码率(b/s) | 耗时(fps) |
---|---|---|---|---|
BasketballDrive_1920x1080_50.yuv | vbr | y:37.538749 u:42.919160 v:43.573611 average:38.750767 | 3470625 | 2.49 |
cbr | y:36.732039 u:41.782326 v:42.060963 average:37.880549 | 2940500 | 2.78 | |
cq | y:37.546299 u:42.927692 v:43.576597 average:38.758129 | 3461625 | 2.47 | |
q | y:42.072283 u:45.036628 v:46.910359 average:43.011125 | 36345800 | 1.27 |
-
vbr模式前 50 帧 bit 示意图 和 psnr 数据
-
cbr 模式前 50 帧 bit 示意图和 psnr 数据
-
cq 模式下前 50 帧 bit 示意图 和 psnr 数据
-
q 模式前 50 帧 bit 示意图和 psnr 数据
-
用 Python 画出前 50 帧 psnr 的曲线图
# -*- coding: utf-8 -*-
# created by 码流怪侠
# 2025.4.15
import matplotlib.pyplot as plt# 提取前50帧的psnr_avg数据
# VBR
psnr_values_vbr = [41.90, 40.17, 40.18, 39.88, 40.13, 39.68, 39.84, 39.64, 39.71, 40.31,39.78, 39.92, 39.80, 40.14, 39.87, 40.01, 39.85, 39.94, 40.35, 40.32,40.39, 40.68, 40.38, 40.39, 40.97, 40.32, 40.23, 40.59, 40.11, 40.34,40.23, 40.69, 39.88, 39.86, 39.61, 39.84, 39.45, 39.54, 39.42, 39.93,39.33, 39.34, 39.13, 39.41, 38.96, 39.08, 38.99, 40.16, 38.93, 38.96
]
# CBR
psnr_values_cbr = [43.03, 38.69, 38.39, 38.16, 37.95, 38.08, 38.23, 38.41, 38.68, 38.89,39.16, 39.35, 39.54, 39.77, 39.88, 39.95, 39.96, 40.03, 40.03, 40.06,40.06, 40.04, 39.99, 39.96, 39.90, 39.80, 39.69, 39.56, 39.45, 39.36,39.40, 34.18, 39.36, 38.54, 38.79, 38.80, 38.76, 38.70, 38.64, 38.62,38.63, 38.55, 38.50, 38.32, 38.18, 38.01, 37.84, 37.73, 37.71, 37.72
]
# CQ
psnr_values_cq = [41.90, 40.17, 40.18, 39.89, 40.15, 39.71, 39.84, 39.64, 39.74, 40.38,39.83, 39.97, 39.85, 40.19, 39.92, 40.05, 39.92, 39.99, 40.43, 40.36,40.40, 40.74, 40.41, 40.43, 41.04, 40.37, 40.27, 40.66, 40.16, 40.38,40.30, 40.85, 39.95, 39.91, 39.65, 39.88, 39.47, 39.58, 39.43, 39.98,39.36, 39.37, 39.15, 39.46, 38.98, 39.11, 39.00, 40.24, 38.95, 38.99
]
# Q
psnr_values_q = [41.52, 42.63, 43.32, 42.58, 44.10, 42.57, 43.37, 42.77, 42.57, 44.15,42.54, 43.35, 42.55, 44.11, 42.58, 43.36, 42.80, 42.79, 42.65, 42.65,42.55, 43.88, 42.60, 42.54, 44.19, 42.60, 42.56, 42.58, 43.38, 42.30,42.56, 42.79, 42.85, 42.56, 43.44, 42.57, 42.55, 42.53, 42.66, 42.58,42.54, 42.86, 42.56, 43.50, 42.58, 42.46, 42.62, 44.46, 42.66, 43.01
]# 创建图表
plt.figure(figsize=(12, 6))
plt.plot(psnr_values_vbr, marker='o', linestyle='-', color='b', label='VBR', alpha=0.7)
plt.plot(psnr_values_cbr, marker='s', linestyle='--', color='r', label='CBR', alpha=0.7)
plt.plot(psnr_values_cq, marker='^', linestyle=':', color='g', label='CQ', alpha=0.7)
plt.plot(psnr_values_q, marker='D', linestyle='-.', color='m', label='Q', alpha=0.7) # 新增Q曲线plt.title('PSNR Comparison (VBR vs CBR vs CQ vs Q) for First 50 Frames') # 更新标题
plt.xlabel('Frame Number')
plt.ylabel('PSNR (dB)')
plt.grid(True)
plt.xticks(range(0, 50, 5))
plt.yticks(range(28, 46, 2)) # 调整Y轴范围
plt.ylim(28, 45) # 调整Y轴显示范围
plt.legend()# 显示图表
plt.tight_layout()
plt.savefig('/Users/admin/Documents/gitcode/libaom/psnr_comparison.png')
plt.show()
总结
- AOM_Q模式有点类似 x264、x265 中的 CQP 模式,与目标码率 target-bitrate 互斥关系;
- AOM_CBR 模式虽然控制的码率更符合目标码率,但整体视频质量把控的很差,且出现极低质量的情况;
- AOM_VBR 模式和 AOM_CQ 模式几乎有一样的编码效果和能力,AOM_CQ相对有更低一点的码率控,psnr 有略微优势,但二者整体差距微乎其微;
- AOM_CQ模式有点类似 x264、x265 中的 CRF,但不同点是AOM_CQ也收到目标码率 target-bitrate的限制。