0
点赞
收藏
分享

微信扫一扫

使ffmpeg支持x264编码过程中改变gopsize

Jonescy 2022-01-13 阅读 168

ffmpeg本身不支持,只能改它的源码

libx264.c 的reconfig_encoder(),在

X264Context *x4 = ctx->priv_data;

AVFrameSideData *side_data;

之后添加

if (x4->x264opts) {

        const char* p = x4->x264opts;

        while (p) {

            char param[4096] = { 0 }, val[4096] = { 0 };

            if (sscanf(p, "%4095[^:=]=%4095[^:]", param, val) == 1) {

                x264_parse_opt(x4,param, "1");

            }

            else

                x264_parse_opt(x4,param, val);

            p = strchr(p, ':');

            p += !!p;

        }

    }



    if (x4->x264_params) {

        AVDictionary* dict = NULL;

        AVDictionaryEntry* en = NULL;



        if (!av_dict_parse_string(&dict, x4->x264_params, "=", ":", 0)) {

            while ((en = av_dict_get(dict, "", en, AV_DICT_IGNORE_SUFFIX))) {

                if (x264_param_parse(&x4->params, en->key, en->value) < 0) {

                    printf("Error parsing option '%s = %s'.\n", en->key, en->value);

                }

                else {

                    printf("Success parsing option '%s = %s'.\n", en->key, en->value);

                }

            }

            av_dict_free(&dict);

        }

    }

在reconfig_encoder()函数前,增加

static void x264_parse_opt(X264Context* x4,const char* opt,const char* param){
    do {
        
            int ret;                                                             
            if ((ret = x264_param_parse(&x4->params, opt, param)) < 0) {
                   printf( "parse bad value for '%s': '%s'\n", opt, param);           
                   return -1;                                                         
            }
            else {
                printf("parse good value for '%s': '%s'\n", opt, param);
            }
    } while (0);
} 

 核心思路就是把x264 encode init的 解析x264opts和x264-params的部分,到reconfig的时候再做一下。

举报

相关推荐

0 条评论