前沿
- 理论基础:在相同视频质量下,AV1的压缩率比H.264高约30%-50%。
- 实时模式:视频编码中的实时模式,其核心目标是平衡编码效率与延迟要求,尤其在视频会议、直播、实时通信等场景中至关重要。
- 低延迟要求:编码过程需在毫秒级完成,通常要求端到端延迟控制在100ms以内,例如视频通话场景。
- 复杂度与效率平衡:牺牲部分压缩率以提升编码速度,例如AV1的实时模式通过简化算法(如减少运动预测模式)降低计算量。
- BD-rate:BD-rate(Bjøntegaard-delta-rate)是视频编码领域用于衡量编码算法优化效果的核心指标,通过对比率失真(RD)曲线的积分差异,量化码率节省或质量提升的幅度;一般有在相同码率下比较 PSNR,或者在相同 PSNR 比较码率两种方法。
- GitHub
实时模式下 libaom 与 x264 实验
- 视频序列:
视频序列 | 分辨率 | 复杂度 |
---|---|---|
FourPeople_1280x720_60.yuv | 1280x720 | 简单 |
BasketballDrive_1920x1080_50.yuv | 1920x1080 | 复杂 |
- 编码命令行:
编码器 | 命令行 |
---|---|
x264 | ./x264 --input-res wxh input.yuv --fps 25 --bitrate x --tune zerolatency -o 264.h264 |
libaom | ./aomenc -w x -h y --fps=25/1 --passes=1 --usage=1 --cpu-used=11 -o av1.ivf input.yuv |
- 解码与计算 PSNR 命令行:
方式 | 命令行 |
---|---|
解码 | ./ffmpeg -i input.h264(/ivf) output.yuv |
PSNR | ./ffmpeg -s <宽x高> -pix_fmt <像素格式> -i <受损YUV文件> -s <宽x高> -pix_fmt <像素格式> -i <原始YUV文件> -lavfi psnr=stats_file=psnr.log -f null - |
- 实验数据:
视频序列 | 编码器 | 对比方式 | 码率(kbps) | PSNR(dB) | 编码速度(fps) |
---|---|---|---|---|---|
FourPeople_1280x720_60.yuv | x264 | BD-rate | 772 | y:38.543713 u:43.920132 v:45.169686 average:39.785921 | 143 |
FourPeople_1280x720_60.yuv | libaom | BD-rate | 775 | y:40.670989 u:45.478396 v:46.747394 average:41.846336 | 143 |
BasketballDrive_1920x1080_50.yuv | x264 | BD-rate | 2960.63 | y:34.384102 u:40.506557 v:40.226674 average:35.628988 | 51.01 |
BasketballDrive_1920x1080_50.yuv | libaom | BD-rate | 2909.15 | y:35.433867 u:40.605196 v:40.475102 average:36.571560 | 32.31 |
- 用 Python 比较前 50 帧 psnr-y 数据(以BasketballDrive_1920x1080_50.yuv为例)
python 代码解读复制代码# -*- coding: utf-8 -*-
# created by 码流怪侠
import matplotlib.pyplot as plt
# 提取前50帧的psnr_y数据
# x264
psnr_y_x264 = [
36.79, 35.65, 35.90, 35.98, 35.99, 35.99, 35.98, 35.98, 36.04, 36.08,
36.14, 36.14, 36.19, 36.31, 36.34, 36.35, 36.41, 36.42, 36.45, 36.52,
36.59, 36.58, 36.58, 36.52, 36.44, 36.37, 36.18, 36.06, 35.93, 35.87,
36.02, 36.09, 35.98, 35.84, 35.81, 35.72, 35.62, 35.57, 35.56, 35.49,
35.43, 35.32, 35.24, 35.11, 34.92, 34.80, 34.59, 34.51, 34.48, 34.51
]
# libaom
psnr_y_libaom = [
43.01, 36.71, 36.44, 36.19, 36.05, 36.09, 36.31, 36.59, 36.91, 37.15,
37.28, 37.36, 37.42, 37.56, 37.60, 37.65, 37.68, 37.73, 37.72, 37.72,
37.76, 37.75, 37.71, 37.64, 37.57, 37.41, 37.28, 37.11, 36.98, 36.94,
36.98, 36.95, 36.87, 36.74, 36.68, 36.60, 36.54, 36.42, 36.37, 36.32,
36.31, 36.21, 36.10, 35.98, 35.74, 35.53, 35.35, 35.25, 35.23, 35.18
]
# 创建图表
plt.figure(figsize=(12, 6))
plt.plot(psnr_y_x264, marker='o', linestyle='-', color='b', label='x264', alpha=0.7)
plt.plot(psnr_y_libaom, marker='s', linestyle='--', color='r', label='libaom', alpha=0.7)
plt.title('PSNR Comparison (x264 vs libaom) 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('psnr_comparison.png')
plt.show()
结论
- 实时模式下,720p 简单视频场景下,BD-rate 方式,即编码码率 800kbps 下, x264 的编码速度是 libaom 的 1.36 倍,x264 的 亮度 Y 的 PSNR 比 libaom 低 2.13dB,色度 U 低 1.55dB,色度 V 低 1.58dB,平均低 2.06dB;
- 实时模式下,1080p 复杂视频场景下,BD-rate 方式,即编码码率 2900kbps 下, x264 的编码速度是 libaom 的 1.59 倍,x264 的 亮度 Y 的 PSNR 比 libaom 低 1.04dB,色度 U 低 0.1dB,色度 V 低 0.25dB,平均低 0.94 dB;
- 对比低、高分辨率,libaom 在高分辨率优势降低比较多;
- 对比亮度分量、色度分量,libaom 在色度分量表现相对比较疲软;
- 用 elecard 分析BasketballDrive_1920x1080_50.yuv 的编码后码流,libaom 的 I 帧占据的 bit 是 x264 的 4.18 倍,这就是为什么 libaom 的第一帧的 PSNR 高了很多;
- 总结一下,实时模式下,如果保持 x264 和 libaom 相同编码速度,libaom 的编码能力相对 x264 会更微乎其微,也进一步证明 libaom 的编码能力的伸缩性更强,为了实现实时编码,会关闭更多的编码工具;更多细节还需要进一步分析源码和原理。
原文与参考
- 原文:实时模式下 libaom 与 x264 编码对比实验
- 博客主页:码流怪侠
- 公众号:码流怪侠
评论记录:
回复评论: