使用avcodec / H264编码实时视频时

时间:2011-10-04 11:36:17

标签: encoding h.264 live-video avcodec

我想用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帧。 怎么了?

谢谢。

1 个答案:

答案 0 :(得分:2)

当我手动设置参数时,我遇到了参数问题。当我使用配置文件而不是设置您列出的所有选项时,我的问题就解决了:

m_pCodecCtx->profile = FF_PROFILE_H264_BASELINE;

之后,您可以使用crf设置恒定质量,例如:

m_pCodecCtx->crf = 28;

然后像你一样设置选项width,height,time_base和pix_fmt。

希望它有所帮助!

相关问题