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的时候再做一下。