libaom 码率控制实验:从理论到实践的深度探索

libaom 码率控制模式介绍

  1. 在 libaom 中定义了四种码率控制模式,分别是 VBR、CBR、CQ、Q;枚举类型会被用在编码器配置结构体 aom_codec_enc_cfg 中,通过 rc_end_usage 字段来设置编码器的码率控制策略。具体应用范围如下:
    • AOM_VBR - 可变比特率模式
      • 允许比特率根据视频内容复杂度动态变化
      • 在简单场景使用较少比特,复杂场景使用更多比特
      • 适合本地存储等对码率波动不敏感的场景
    • AOM_CBR - 恒定比特率模式
      • 强制编码器保持恒定的目标比特率
      • 通过调整量化参数来实现
      • 适合带宽受限的实时流媒体传输
    • AOM_CQ - 受限质量模式
      • 在保证一定质量水平的前提下尽量降低码率
      • 质量与码率之间的折中方案
    • AOM_Q - 恒定质量模式
      • 完全以质量为目标,不考虑码率限制
      • 适合对质量要求极高且不关心文件大小的场景
cpp 复制代码
/*!\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码率控制模式实验

  1. 编码命令行:./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
  2. 解码命令行:ffmpeg -i av1.ivf vbr.yuv
  3. PSNR 计算命令行: ./ffmpeg -s <宽x高> -pix_fmt <像素格式> -i <受损YUV文件> -s <宽x高> -pix_fmt <像素格式> -i <原始YUV文件> -lavfi psnr=stats_file=psnr.log -f null -
  4. 视频序列示意图
  1. 实验数据
  1. 用 Python 画出前 50 帧 psnr 的曲线图
python 复制代码
# -*- 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()

总结

  1. AOM_Q模式有点类似 x264、x265 中的 CQP 模式,与目标码率 target-bitrate 互斥关系;
  2. AOM_CBR 模式虽然控制的码率更符合目标码率,但整体视频质量把控的很差,且出现极低质量的情况;
  3. AOM_VBR 模式和 AOM_CQ 模式几乎有一样的编码效果和能力,AOM_CQ相对有更低一点的码率控,psnr 有略微优势,但二者整体差距微乎其微;
  4. AOM_CQ模式有点类似 x264、x265 中的 CRF,但不同点是AOM_CQ也收到目标码率 target-bitrate的限制。

原文

相关推荐
伶俜monster3 小时前
音频炼金术:Threejs 让 3D 场景「听」起来更真实
three.js·音视频开发
非典型程序猿9 小时前
【Vulkan 入门系列】创建 Vulkan 实例、Surface 和选择物理设备(二)
gpu·音视频开发
非典型程序猿9 小时前
【Vulkan 入门系列】什么是 Vulkan API?(一)
游戏开发·音视频开发
_XU2 天前
使用FFmpeg和MediaMTX实现本地推流
前端·ffmpeg·音视频开发
字节跳动视频云技术团队2 天前
CVPR 2025 | 火山引擎获得NTIRE 视频质量评价挑战赛全球第一
llm·音视频开发
声知视界3 天前
音视频基础能力之 iOS 视频篇(六):使用Metal进行视频渲染
ios·音视频开发
路漫漫心远4 天前
音视频学习笔记十六——图像处理之OpenCV基础一
音视频开发
散歌7 天前
小程序 RecorderManager 录音分贝解析及来电检测
微信小程序·音视频开发
爱吃猪排8 天前
用AI监听语音通话的方案和实践
人工智能·音视频开发