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

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

libaom 码率控制模式介绍

  1. 在 libaom 中定义了四种码率控制模式,分别是 VBR、CBR、CQ、Q;枚举类型会被用在编码器配置结构体 aom_codec_enc_cfg 中,通过 rc_end_usage 字段来设置编码器的码率控制策略。具体应用范围如下:
    • AOM_VBR - 可变比特率模式
      • 允许比特率根据视频内容复杂度动态变化
      • 在简单场景使用较少比特,复杂场景使用更多比特
      • 适合本地存储等对码率波动不敏感的场景
    • AOM_CBR - 恒定比特率模式
      • 强制编码器保持恒定的目标比特率
      • 通过调整量化参数来实现
      • 适合带宽受限的实时流媒体传输
    • AOM_CQ - 受限质量模式
      • 在保证一定质量水平的前提下尽量降低码率
      • 质量与码率之间的折中方案
    • AOM_Q - 恒定质量模式
      • 完全以质量为目标,不考虑码率限制
      • 适合对质量要求极高且不关心文件大小的场景
/*!\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. 视频序列示意图
    在这里插入图片描述
  5. 实验数据
视频序列rc_end_usagePSNR(dB)码率(b/s)耗时(fps)
BasketballDrive_1920x1080_50.yuvvbry:37.538749 u:42.919160 v:43.573611 average:38.75076734706252.49
cbry:36.732039 u:41.782326 v:42.060963 average:37.88054929405002.78
cqy:37.546299 u:42.927692 v:43.576597 average:38.75812934616252.47
qy:42.072283 u:45.036628 v:46.910359 average:43.011125363458001.27
  1. vbr模式前 50 帧 bit 示意图 和 psnr 数据
    在这里插入图片描述
    在这里插入图片描述

  2. cbr 模式前 50 帧 bit 示意图和 psnr 数据
    在这里插入图片描述
    在这里插入图片描述

  3. cq 模式下前 50 帧 bit 示意图 和 psnr 数据
    在这里插入图片描述
    在这里插入图片描述

  4. q 模式前 50 帧 bit 示意图和 psnr 数据
    在这里插入图片描述在这里插入图片描述

  5. 用 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()

总结

  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的限制。

http://www.mrgr.cn/news/98498.html

相关文章:

  • ReportLab 导出 PDF(文档创建)
  • C++函数
  • 深入解析分类模型评估指标:ROC曲线、AUC值、F1分数与分类报告
  • VLLM V1 serve在线推理基本流程
  • gitdiagram源码架构分析
  • 协享云图分析--3用户模块
  • Cribl 数据脱敏 -02
  • 15.家庭影院,我选Jellyfin
  • 广汽滴滴Robotaxi首次亮相,中国自动驾驶加速领跑新赛道
  • Webflux声明式http客户端:Spring6原生HttpExchange实现,彻底摒弃feign
  • leetcode 121. Best Time to Buy and Sell Stock
  • Redis入门(Java中操作Redis)
  • IMX6ULL2025年最新部署方案2在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上
  • Java使用ANTLR4解析IDL文件
  • 【厦门大学】大模型概念、技术与应用实践
  • Linux命令+Git命令
  • 【Sequelize】关联模型和孤儿记录
  • 计算机网络 - 四次挥手相关问题
  • github配置ssh,全程CV
  • 2025年第十六届蓝桥杯省赛JavaB组真题回顾