x264设置固定I帧问题

最近研究x264,在设定定期I帧的问题上卡了一天时间。

不论怎样设置,定期I帧总是不生效。


    param.i_keyint_max = 30;
    param.i_keyint_min = 30;


按理来说,只需要设置i_keyint_min 和 i_keyint_max的值即可,将两个值都设置为同一个值。


一开始不生效,是因为我在配置x264_param_t参数时设置两个参数的值,然后调用x264_encoder_open()函数创建encoder,后来打印数据是发现i_keyint_max的值不变,但i_keyint_min变成了16。
在源码中有这样一个逻辑,会自动优化i_keyint_min的值,在[1, i_keyint_max/2+1]之间取值。


创建encoder后再去设置值,发现仍然不生效,代码如下:
        h->param.i_keyint_max = 30;
        h->param.i_keyint_min = 30;
但可喜的是,录了几次数据,每次都超过一千帧数据,总有一小段会出现定期I帧,虽然为全部生效,不过这说明有戏。


然后追查设置的x264_param_t参数,应该是某个参数导致其不生效,最终定位到b_intra_refresh参数。
b_intra_refresh参数的作用是将I帧拆成一个一个I块,然后放到P帧中,这样做的好处是保证每一帧大小都不超过UDP/TCP包大小(网上的解释)。
这个参数固然强大,但也有其缺点(实测):
第一,该参数将代替IDR帧,做帧内刷新,因此无法设置固定I帧,除非使用b_fastupdte参数,在外部强制请求。
第二,使用该参数后,画面会像老式电影机一样,有一条竖线一遍遍的自左向右横扫,呃,看着很有年代感。


综上所述,x264设置定期I帧,要做到如下三点:
1. x264_encoder_open()时,x264_param_t.b_intra_refresh 应该为0;
2. h->param.i_keyint_max 和 h->param.i_keyint_min 需要设置相同的值;
3. h->param.i_keyint_max 和 h->param.i_keyint_min 的设置必须在x264_encoder_open()之后;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值