X264参数之zerolatency的分析

来源:互联网 发布:淘宝话费充值软件 编辑:程序博客网 时间:2024/06/07 20:04

最近在测试服务器的在线转码性能时发现,加入zerolatency之后,转码路数会明显降低。

我们都知道,加入zerolatency的目的是为了降低在线转码的编码延迟,那么,该参数是如何影响到x264的转码性能了呢?

首先,先来看看代码中编码延迟的影响因素:

h->frames.i_delay = max(h->param.i_bframe, h->param.rc.i_lookahead)       

                                   +  h->i_thread_frames - 1       

                                   +  h->param.i_sync_lookahead     

                                   + h->param.b_vfr_input

设置zerolatency后,相应的参数配置如下:

        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;        }

下面我们来看一下zerolatency设置中各个参数的意义:

rc_lookahead: Set number of frames to look ahead for frametype and ratecontrol. 

该参数为mb-tree码率控制和vbv-lookahead设置可用的帧数量,最大值为250。对于mbi-tree来说,rc_lookahead值越大,会得到更准确的结果,但编码速度也会更慢,因为编码器需要缓存慢rc_lookahead帧数据后,才会开始第一帧编码,增加编码延时,因此在实时视频通信中将其设置为0。

sync_lookahead: 设置用于线程预测的帧缓存大小,最大值为250。在第二遍及更多遍编码或基于分片线程时自动关闭。sync_lookahead = 0为关闭线程预测,可减小延迟,但也会降低性能。

bframes: I帧和P帧或者两个P帧之间可用的最大连续B帧数量,默认值为3。B帧可使用双向预测,从而显著提高压缩率,但由于需要缓存更多的帧数以及重排序的原因,会降低编码速度,增加编码延迟,因此在实时编码时也建议将该值设置为0。

sliced_threads: 基于分片的线程,默认值为off,开启该方法在压缩率和编码效率上都略低于默认方法,但没有编码延时。除非在编码实时流或者对低延迟要求较高的场合开启该方法,一般情况下建议设为off。

vfr_input: 与force-cfr选项相对应:

    OPT("force-cfr")        p->b_vfr_input = !atobool(value);

vfr_input= 1时,为可变帧率,使用timebase和timestamps做码率控制;vfr_input = 0时,为固定帧率,使用fps做码率控制。

mb_tree: 基于宏块树的码率控制。对于每个MB,向前预测一定数量的帧(该数量由rc_lookahead和keyint中的较小值决定),计算该MB被引用的次数,根据被引用次数的多少决定为该MB分配的量化QP值。该方法会生成一个临时stats文件,记录了每个P帧中每个MB被参考的情况。使用mb_tree的方法能够节约大概30%的码率,但同时也会增加编码延迟,因此实时流编码时也将其关闭。

原创粉丝点击