前沿
理论基础 :在相同视频质量下,AV1的压缩率比H.264高约30%-50%。实时模式 :视频编码中的实时模式,其核心目标是平衡编码效率与延迟要求,尤其在视频会议、直播、实时通信等场景中至关重要。
低延迟要求 :编码过程需在毫秒级完成,通常要求端到端延迟控制在100ms以内,例如视频通话场景。复杂度与效率平衡 :牺牲部分压缩率以提升编码速度,例如AV1的实时模式通过简化算法(如减少运动预测模式)降低计算量。 BD-rate :BD-rate(Bjøntegaard-delta-rate)是视频编码领域用于衡量编码算法优化效果的核心指标,通过对比率失真(RD)曲线的积分差异,量化码率节省或质量提升的幅度;一般有在相同码率下比较 PSNR,或者在相同 PSNR 比较码率两种方法。GitHub
x264:https://code.videolan.org/videolan/x264.git libaom:https://aomedia.googlesource.com/aom
实时模式下 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为例)
import matplotlib. pyplot as plt
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
]
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 ) )
plt. ylim( 28 , 45 )
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 的编码能力的伸缩性更强,为了实现实时编码,会关闭更多的编码工具;更多细节还需要进一步分析源码和原理。