mpp 编码264开发关键流程
1. 初始化:
a)设置分配内存类型:
MppBufferGroup grp = nullptr;
mpp_buffer_group_get_internal(&grp, MPP_BUFFER_TYPE_ION);
b)分配每一帧缓存大小
MppBuffer frameBuf;
size_t frameSize;
MppFrameFormat fmt = MPP_FMT_ABGR8888;
if (fmt == MPP_FMT_BGRA8888) {
frameSize = 1920* 1080 * 4;
}
mpp_buffer_get(grp, &frameBuf, frameSize);
c)分配编码后的一帧缓存
MppBuffer pktBuf;
mpp_buffer_get(mppEncData.grp, &pktBuf, frameSize);
d)创建编码器
MppCtx ctx = nullptr;
MppApi *mpi = nullptr;
mpp_create(&ctx, &mpi);
e)设置编码超时(堵塞)
MppPollType timeout = MPP_POLL_BLOCK;
mpi->control(ctx, MPP_SET_OUTPUT_TIMEOUT, &timeout);
f)初始化编码器
MppCodingType type = MPP_VIDEO_CodingAVC;
mpp_init(ctx, MPP_CTX_ENC, type);
g)初始化编码参数配置
mpp_enc_cfg_init(&cfg);
mpp_enc_cfg_set_s32(cfg, "prep:width", 1920);
mpp_enc_cfg_set_s32(cfg, "prep:height", 1080);
mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", 1920);
mpp_enc_cfg_set_s32(cfg, "prep:ver_stride", 1080);
mpp_enc_cfg_set_s32(cfg, "prep:format", fmt);
mpp_enc_cfg_set_s32(cfg, "rc:mode", MPP_ENC_RC_MODE_VBR);
mpp_enc_cfg_set_s32(cfg, "rc:fps_in_flex", 0);
mpp_enc_cfg_set_s32(cfg, "rc:fps_in_num", 20);
mpp_enc_cfg_set_s32(cfg, "rc:fps_in_denorm", 1);
mpp_enc_cfg_set_s32(cfg, "rc:fps_out_flex", 0);
mpp_enc_cfg_set_s32(cfg, "rc:fps_out_num", 20);
mpp_enc_cfg_set_s32(cfg, "rc:fps_out_denorm", 1);
mpp_enc_cfg_set_s32(cfg, "rc:gop", 50);
/* drop frame or not when bitrate overflow */
mpp_enc_cfg_set_u32(cfg, "rc:drop_mode", MPP_ENC_RC_DROP_FRM_DISABLED);
mpp_enc_cfg_set_u32(cfg, "rc:drop_thd", 20); /* 20% of max bps */
mpp_enc_cfg_set_u32(cfg, "rc:drop_gap", 1); /* Do not continuous drop frame */
bps = 1920 * 1080 / 8 * 20;
mpp_enc_cfg_set_s32(cfg, "rc:bps_target", bps);
mpp_enc_cfg_set_s32(cfg, "rc:bps_max", bps * 17 / 16);
mpp_enc_cfg_set_s32(cfg, "rc:bps_min", bps * 1 / 16);
mpp_enc_cfg_set_s32(cfg, "codec:type", type);
if (type == MPP_VIDEO_CodingAVC) {
// rc_mode = MPP_ENC_RC_MODE_VBR
mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 26);
mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 51);
mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 10);
mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 51);
mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 10);
mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 2);
mpp_enc_cfg_set_s32(cfg, "h264:profile", 100);
mpp_enc_cfg_set_s32(cfg, "h264:level", 40);
mpp_enc_cfg_set_s32(cfg, "h264:cabac_en", 1);
mpp_enc_cfg_set_s32(cfg, "h264:cabac_idc", 0);
mpp_enc_cfg_set_s32(cfg, "h264:trans8x8", 1);
}
mpi->control(ctx, MPP_ENC_SET_CFG, cfg);
h)设置帧信息
MppEncSeiMode seiMode = MPP_ENC_SEI_MODE_ONE_FRAME;
ret = mppEncData.mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &seiMode);
header_mode = MPP_ENC_HEADER_MODE_EACH_IDR;
mpi->control(ctx, MPP_ENC_SET_HEADER_MODE, &header_mode);