本文分析下x264做视频编码时的低延时配置

低延时配置与参数说明

x264的zerolatency配置代码:

else if( !strncasecmp( s, "zerolatency", 11 ) )
{
    param->rc.i_lookahead = 0;
    param->i_sync_lookahead = 0;
    param->i_bframe = 0;
    param->b_sliced_threads = 1;
    param->b_vfr_input = 0;
    param->rc.b_mb_tree = 0;
}
i_lookahead
该参数为mb-tree码率控制和vbv-lookahead设置可用的帧数量,最大值为250。对于mbi-tree来说,rc_lookahead值越大,会得到更准确的结果,但编码速度也会更慢,因为编码器需要缓存慢rc_lookahead帧数据后,才会开始第一帧编码,增加编码延时,因此在实时视频通信中将其设置为0。
i_sync_lookahead
设置用于线程预测的帧缓存大小,最大值为250。在第二遍及更多遍编码或基于分片线程时自动关闭。sync_lookahead = 0为关闭线程预测,可减小延迟,但也会降低性能。
i_bframe
I帧和P帧或者两个P帧之间可用的最大连续B帧数量,默认值为3。B帧可使用双向预测,从而显著提高压缩率,但由于需要缓存更多的帧数以及重排序的原因,会降低编码速度,增加编码延迟,因此在实时编码时也建议将该值设置为0。
b_sliced_threads
基于分片的线程,默认值为off,开启该方法在压缩率和编码效率上都略低于默认方法,但没有编码延时。除非在编码实时流或者对低延迟要求较高的场合开启该方法,一般情况下建议设为off。
b_vfr_input
与force-cfr选项相对应:vfr_input=1时,为可变帧率,使用timebase和timestamps做码率控制;vfr_input=0时,为固定帧率,使用fps做码率控制。
b_mb_tree
基于宏块树的码率控制。对于每个MB,向前预测一定数量的帧(该数量由rc_lookahead和keyint中的较小值决定),计算该MB被引用的次数,根据被引用次数的多少决定为该MB分配的量化QP值。该方法会生成一个临时stats文件,记录了每个P帧中每个MB被参考的情况。使用mb_tree的方法能够节约大概30%的码率,但同时也会增加编码延迟,因此实时流编码时也将其关闭。

并行编码

设置i_threads=1,明确告诉编码器,不使用并行编码。zerolatency场景下设置param.rc.i_lookahead=0; 那么编码器来一帧编码一帧,无并行、无延时。

参考