При кодировании живого видео с помощью 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-кадр имеют размер около 250000 байтов, а B-кадр не выполнен. В чем дело?
благодарю вас.
1 ответ
У меня были проблемы с параметрами, когда я устанавливал их вручную. Моя проблема была решена, когда я использовал профиль вместо того, чтобы установить все параметры, которые вы перечислили:
m_pCodecCtx->profile = FF_PROFILE_H264_BASELINE;
После этого вы можете установить постоянное качество с помощью crf, например:
m_pCodecCtx->crf = 28;
Затем вы устанавливаете параметры width, height, time_base и pix_fmt, как и вы.
Надеюсь, поможет!