2011-10-04 27 views
1

我想編碼avcodec/H264的實時視頻。 我嘗試了一些設置參數。當使用avcodec/H264編碼實況視頻時

m_pCodec = avcodec_find_encoder(CODEC_ID_H264); 
    m_pCodecCtx = avcodec_alloc_context3(m_pCodec); 

    m_pCodecCtx->coder_type=1; 
    m_pCodecCtx->flags|=CODEC_FLAG_LOOP_FILTER; 
    m_pCodecCtx->me_cmp |= FF_CMP_CHROMA; 
    m_pCodecCtx->partitions|=X264_PART_I8X8+X264_PART_I4X4+X264_PART_P8X8+X264_PART_B8X8; // partitions=+parti8x8+parti4x4+partp8x8+partb8x8 
    m_pCodecCtx->me_method=ME_HEX; 
    m_pCodecCtx->me_subpel_quality = 6; 
    m_pCodecCtx->me_range=16; 
    m_pCodecCtx->gop_size=30; 
    m_pCodecCtx->keyint_min=10; 
    m_pCodecCtx->scenechange_threshold=40; 
    m_pCodecCtx->i_quant_factor=0.71; 
    m_pCodecCtx->b_frame_strategy=1; 
    m_pCodecCtx->qcompress=0.6; 
    m_pCodecCtx->qmin=10; 
    m_pCodecCtx->qmax=51; 
    m_pCodecCtx->max_qdiff=4; 
    m_pCodecCtx->max_b_frames=1; 
    m_pCodecCtx->refs=2; 
    m_pCodecCtx->directpred=3; 
    m_pCodecCtx->trellis=1; 
    m_pCodecCtx->flags2|=CODEC_FLAG2_BPYRAMID|CODEC_FLAG2_WPRED|CODEC_FLAG2_8X8DCT|CODEC_FLAG2_FASTPSKIP;// +bpyramid+wpred+dct8x8+fastpskip 
    m_pCodecCtx->width = 720; 
    m_pCodecCtx->height = 480; 
    m_pCodecCtx->time_base.num = 1; 
    m_pCodecCtx->time_base.den = 15; 
    m_pCodecCtx->pix_fmt = PIX_FMT_YUV420P; 

它的工作原理。解碼方很好。 但幀尺寸太大。 I幀和P幀大約250,000字節,並且B幀不成立。 有什麼問題?

謝謝。

+0

我剛剛upvoted。不是你的問題,但你實際上給了我一個很好的提示,以解決我的代碼轉換問題。謝謝! – mmoment

回答

1

我在手動設置參數時遇到了問題。我的問題解決了,當我使用的配置文件的設置而不是你列出的所有選項:

m_pCodecCtx->profile = FF_PROFILE_H264_BASELINE; 

之後,你可以設置穩定的質量與CRF,如:

m_pCodecCtx->crf = 28; 

然後設置選項寬度,height,time_base和pix_fmt像你一樣。

希望它能幫助!