x264设置固定I帧问题

编程入门 行业动态 更新时间:2024-10-10 03:31:18

x264设置固定I帧问题

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()之后;

更多推荐

x264设置固定I帧问题

本文发布于:2024-02-14 08:01:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762944.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!