RKMPP库快速上手--MPP关键配置
Posted Geek.Fan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RKMPP库快速上手--MPP关键配置相关的知识,希望对你有一定的参考价值。
一、RKMPP编码配置总结:
为了方便配置功能,我们一般将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)
mpp_enc_data.frame_size = mpp_enc_data.hor_stride * mpp_enc_data.ver_stride * 3/2;
else if (mpp_enc_data.fmt <= MPP_FMT_YUV422_UYVY)
mpp_enc_data.hor_stride *= 2;
mpp_enc_data.frame_size = mpp_enc_data.hor_stride * mpp_enc_data.ver_stride;
else
mpp_enc_data.frame_size = mpp_enc_data.hor_stride * mpp_enc_data.ver_stride * 4;
mpp_enc_data.fp_output = fopen(outPutFileName, "wb+");// 打开输出文件
//开辟编码所需的内存
ret = mpp_buffer_get(NULL, &mpp_enc_data.frm_buf, mpp_enc_data.frame_size);
if (ret)
printf("failed to get buffer for input frame ret %d\\n", ret);
goto MPP_INIT_OUT;
//创建 MPP context 和 MPP api 接口
ret = mpp_create(&mpp_enc_data.ctx, &mpp_enc_data.mpi);
if (ret)
printf("mpp_create failed ret %d\\n", ret);
goto MPP_INIT_OUT;
/*初始化编码还是解码,以及编解码的格式
MPP_CTX_DEC : 解码
MPP_CTX_ENC : 编码
MPP_VIDEO_CodingAVC : H.264
MPP_VIDEO_CodingHEVC : H.265
MPP_VIDEO_CodingVP8 : VP8
MPP_VIDEO_CodingVP9 : VP9
MPP_VIDEO_CodingMJPEG : MJPEG*/
ret = mpp_init(mpp_enc_data.ctx, MPP_CTX_ENC, mpp_enc_data.type);
if (ret)
printf("mpp_init failed ret %d\\n", ret);
goto MPP_INIT_OUT;
后续的代码按照官方配置来即可,需要改动则按照官方注释按需修改。
以上是关于RKMPP库快速上手--MPP关键配置的主要内容,如果未能解决你的问题,请参考以下文章