MPP关键配置(讲解在注释中)
代码链接:https://download.csdn.net/download/qq_39839546/67314289
已设置成了0积分下载,欢迎大家下载分享。
为了方便配置功能,我们一般将Mpp配置的关键参数定义为结构体:
struct MPP_ENC_DATA //编码所需要的数据
{
// global flow control flag
uint32_t frm_eos;
uint32_t pkt_eos;
uint32_t frame_count;
uint64_t stream_size;
// base flow context
MppCtx ctx;
MppApi *mpi;
MppEncPrepCfg prep_cfg;
MppEncRcCfg rc_cfg;
MppEncCodecCfg codec_cfg;
// input / output
MppBuffer frm_buf;//为编码时数据存放开辟的内存
MppEncSeiMode sei_mode;
uint32_t width;//图像宽
uint32_t height;//图像高
/*Stride:
stride其实是图像处理中常用的概念,是关于数据对齐的一种概念。
一行有 11 个像素(Width = 11), 对一个 32 位(每个像素 4 字节)的图像, Stride = 11 * 4 = 44.
但还有个字节对齐的问题, 譬如:
一行有 11 个像素(Width = 11), 对一个 24 位(每个像素 3 字节)的图像, Stride = 11 * 3 + 3 = 36.
为什么不是 Stride = 33? 因为它是按 4 字节对齐的.
根据上面道理, 我们可以手动计算 Stride 的值:
1)Stride = 每像素占用的字节数(也就是像素位数/8) * Width;
2)如果 Stride 不是 4 的倍数, 那么 Stride = Stride + (4 - Stride mod 4);
*/
uint32_t hor_stride;
uint32_t ver_stride;
//输入图像格式
MppFrameFormat fmt = MPP_FMT_YUV422_YUYV;
//输出视频流格式
MppCodingType type = MPP_VIDEO_CodingAVC;
uint32_t num_frames;
// resources
size_t frame_size;
/*在视频编码中,GOP的意思是画面组,指定了intra-和inter-帧的顺序。
GOP是一个编码视频流中的一组连续的画面。每一个编码的视频流都由连续的GOP组成。
压缩的视频流中GOP相对独立,解码器解码新的GOP时需要之前的帧来解码后面的帧,
GOP的存在也可以实现在视频中更快地定位。*/
int32_t gop = 60;
//帧率
int32_t fps = 30;
//码率
int32_t bps;
//输出文件头
FILE *fp_output;
};
然后是编码的基本配置流程:
#define MPP_ALIGN(x, a) (((x)+(a)-1)&~((a)-1))
memset(&mpp_enc_data, 0, sizeof(mpp_enc_data));
mpp_enc_data.width = width;
mpp_enc_data.height = height;
//获取宽高的stride
mpp_enc_data.hor_stride = MPP_ALIGN(mpp_enc_data.width, 16);
mpp_enc_data.ver_stride = MPP_ALIGN(mpp_enc_data.height, 16);
mpp_enc_data.fmt = fmt;//MPP_FMT_BGR565;//MPP_FMT_YUV422_YUYV等;
mpp_enc_data.type = type;
mpp_enc_data.fps = fps;
mpp_enc_data.gop = gop;
//不同的图像格式有着不同的数据量大小,
//比如MPP_FMT_YUV420SP_VU格式的图像数据量大小就是其图像像素量的3/2;
if (mpp_enc_data.fmt <= MPP_FMT_YUV420SP_VU