在翻阅了无数的文章后,发现其原因是在于x264内部的参数检测,归要到底还是由于自己在ffmpeg中设置的参数不正确导致的。以下是x264针对此判断代码如下:
相关判断位于encoder/encoder.c 393行:
/* Detect default ffmpeg settings and terminate with an error. */ { int score = 0; score += h->param.analyse.i_me_range == 0; score += h->param.rc.i_qp_step == 3; score += h->param.i_keyint_max == 12; score += h->param.rc.i_qp_min == 2; score += h->param.rc.i_qp_max == 31; score += h->param.rc.f_qcompress == 0.5; score += fabs(h->param.rc.f_ip_factor - 1.25) < 0.01; score += fabs(h->param.rc.f_pb_factor - 1.25) < 0.01; score += h->param.analyse.inter == 0 && h->param.analyse.i_subpel_refine == 8; if( score >= 5 ) { x264_log( h, X264_LOG_ERROR, "broken ffmpeg default settings detected\n" ); x264_log( h, X264_LOG_ERROR, "use an encoding preset (vpre)\n" ); return -1; } }
应用X264进行H.264编码,如果编码不能成功,大部分情况是编码参数选择不正确
使用ffmpeg x264进行编码的时候,avcodec_open报错:
[libx264 @ 00021bb0]broken ffmpeg default settings detected
[libx264 @ 00021bb0]use an encoding preset (vpre)
解决方法:在 x264 的source file encoder/encoder.c 中找到该报错的地方
/* Detect default ffmpeg settings and terminate with an error. */
{
int score = 0;
score += h->param.analyse.i_me_range == 0;
score += h->param.rc.i_qp_step == 3;
score += h->param.i_keyint_max == 12;
score += h->param.rc.i_qp_min == 2;
score += h->param.rc.i_qp_max == 31;
score += h->param.rc.f_qcompress == 0.5;
score += fabs(h->param.rc.f_ip_factor - 1.25) < 0.01;
score += fabs(h->param.rc.f_pb_factor - 1.25) < 0.01;
score += h->param.analyse.inter == 0 && h->param.analyse.i_subpel_refine == 8;
if( score >= 5 )
{
x264_log( h, X264_LOG_ERROR, "broken ffmpeg default settings detected\n" );
x264_log( h, X264_LOG_ERROR, "use an encoding preset (vpre)\n" );
return -1;
}
}
We can see that if score >= 5,the function to open the codec will fail.
We must at least set 4 param of the AVCodecContext before open it.
在avcodec_open函数之间增加如下几个AVCodecContext 的初始化:
/*default settings for x264*/
ctx->me_range = 16;
ctx->max_qdiff = 4;
ctx->qmin = 10;
ctx->qmax = 51;
ctx->qcompress = 0.6;
OK,解决。