Search code examples
cx264libavcodeclibx264libav

How to encode h.264 with libavcodec/x264?


I am attempting to encode video using libavcodec/libavformat. Audio works great, but when I try to encode video I get the following errors:

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

easy to fix using the command line ffmpeg, but I am trying to do this in C. my options are

AVStream *pVideoOutStream = av_new_stream(pOutFormatCtx, 0);  
AVCodecContext *pVideoOutCodecCtx  = pVideoOutStream->codec;  

pVideoOutCodecCtx->codec_id        = CODEC_ID_H264;    
pVideoOutCodecCtx->codec_type      = CODEC_TYPE_VIDEO;  
pVideoOutCodecCtx->bit_rate        = pVideoInCodecCtx->bit_rate;  
pVideoOutCodecCtx->width           = pVideoInCodecCtx->width;    
pVideoOutCodecCtx->height          = pVideoInCodecCtx->height;  
pVideoOutCodecCtx->pix_fmt         = pVideoInCodecCtx->pix_fmt;    
pVideoOutCodecCtx->sample_rate     = pVideoInCodecCtx->sample_rate;    
pVideoOutCodecCtx->gop_size        = 30;  

but avcodec_open() fails.

What other values do I need to set to make x264 happy?


Solution

  • Not sure whether you got it working, but the following parameters work for me.

    ctx->bit_rate = 500*1000;
    ctx->bit_rate_tolerance = 0;
    ctx->rc_max_rate = 0;
    ctx->rc_buffer_size = 0;
    ctx->gop_size = 40;
    ctx->max_b_frames = 3;
    ctx->b_frame_strategy = 1;
    ctx->coder_type = 1;
    ctx->me_cmp = 1;
    ctx->me_range = 16;
    ctx->qmin = 10;
    ctx->qmax = 51;
    ctx->scenechange_threshold = 40;
    ctx->flags |= CODEC_FLAG_LOOP_FILTER;
    ctx->me_method = ME_HEX;
    ctx->me_subpel_quality = 5;
    ctx->i_quant_factor = 0.71;
    ctx->qcompress = 0.6;
    ctx->max_qdiff = 4;
    ctx->directpred = 1;
    ctx->flags2 |= CODEC_FLAG2_FASTPSKIP;
    

    The error message broken ffmpeg default settings detected is displayed in the x264 library in x264/encoder/encoder.c when too many settings are the default ffmpeg settings (e.g. qmin = 2, qmax = 31, qcompress = 0.5), changing these three values to something else, e.g. qmin = 10, qmax = 51, qcompress = 0.6, resolves the error.