织梦CMS - 轻松建站从此开始!

罗索

ffmpeg下x264编码broken ffmpeg default settings

jackyhwei 发布于 2011-10-25 10:57 点击:次 
之前我用同一份Source Code(包括ffmpeg 和x264及我上层调用的代码都是一样的),在Windows下和下做同样的一件事情:编码H264视频,结果在Windows下跑是OK的,而在下则一直报下面这个错误
TAG:

之前我用同一份Source Code(包括ffmpeg 和x264及我上层调用的代码都是一样的),在Windows下和Linux下做同样的一件事情:编码H264视频,结果在Windows下跑是OK的, 而在Linux下则一直报broken ffmpeg default settings detected这个错误

之前我用同一份Source Code(包括ffmpeg 和x264及我上层调用的代码都是一样的),在Windows下和下做同样的一件事情:编码H264视频,结果在Windows下跑是OK的,而在下则一直报下面这个错误:

[libx264 @ 0x8b7d8b0]broken ffmpeg default settings detected
[libx264 @ 0x8b7d8b0]use an encoding preset (vpre)

详文请浏览:http://bbs.rosoo.net/thread-737-1-1.html

在翻阅了无数的文章后,发现其原因是在于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怎么设置这些编码参数呢?
代码为证:

 

m_VCtx->codec_type = CODEC_TYPE_VIDEO; m_VCtx->bit_rate = bitrate * 1000; m_VCtx->width = width; m_VCtx->height = height; m_VCtx->time_base.den = fps; m_VCtx->time_base.num = 1; m_VCtx->gop_size = fps * 10; //m_VCtx->gop_size = 1; m_VCtx->crf = 26; m_VCtx->refs = 3; m_VCtx->flags2 = CODEC_FLAG2_MIXED_REFS; m_VCtx->max_b_frames = 3; m_VCtx->deblockbeta = -1; m_VCtx->deblockalpha = -1; m_VCtx->trellis = 2; m_VCtx->partitions = X264_PART_I4X4 | X264_PART_I8X8 | X264_PART_P8X8 | X264_PART_P4X4 | X264_PART_B8X8; m_VCtx->flags2 |= CODEC_FLAG2_8X8DCT; m_VCtx->me_method = 8; m_VCtx->me_range = 16; m_VCtx->me_subpel_quality = 7; m_VCtx->qmin = 10; m_VCtx->qmax = 51; m_VCtx->rc_initial_buffer_occupancy = 0.9; m_VCtx->i_quant_factor = 1.0 / 1.40f; // x4->params.rc.f_ip_factor = 1 / fabs(avctx->i_quant_factor); m_VCtx->b_quant_factor = 1.30f; m_VCtx->chromaoffset = 0; m_VCtx->max_qdiff = 4; m_VCtx->qcompress = 0.6f; m_VCtx->complexityblur = 20.0f; m_VCtx->qblur = 0.5f; m_VCtx->directpred = 1; m_VCtx->noise_reduction = 0; m_VCtx->pix_fmt = PIX_FMT_YUV420P;  m_VCtx->thread_count = 1; m_VCtx->scenechange_threshold = 40; m_VCtx->bframebias = 0; m_VCtx->flags2 |= CODEC_FLAG2_AUD; m_VCtx->coder_type = FF_CODER_TYPE_AC; m_VCtx->flags |= CODEC_FLAG_LOOP_FILTER; m_VCtx->me_cmp = FF_CMP_CHROMA; m_VCtx->flags2 |= CODEC_FLAG2_FASTPSKIP; m_VCtx->flags2 |= CODEC_FLAG2_BPYRAMID; m_VCtx->flags2 |= CODEC_FLAG_NORMALIZE_AQP; m_VCtx->flags2 |= CODEC_FLAG2_WPRED; m_VCtx->keyint_min = 25; m_VCtx->flags2 |= CODEC_FLAG2_MBTREE;  //m_VCtx->rc_min_rate =1024 * 1000; //m_VCtx->rc_max_rate = 1024 * 1000;   //m_VCtx->bit_rate_tolerance = 1024 * 1000; //m_VCtx->rc_buffer_size=1024 * 1000; //m_VCtx->rc_initial_buffer_occupancy = m_VCtx->rc_buffer_size*3/4; //m_VCtx->rc_buffer_aggressivity= (float)1.0; //m_VCtx->rc_initial_cplx= 0.5;   //m_VCtx->ticks_per_frame = 2; m_VCtx->level = 30; m_VCtx->b_frame_strategy = 2; m_VCtx->codec_tag = 7; // FLV must not = 0  {CODEC_ID_H264,FLV_CODECID_H264  }, 

 

 

 

使用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,解决。
(luckyapple)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201110/15195.html]
本文出处:罗索工作室 作者:luckyapple
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容