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关键配置的主要内容,如果未能解决你的问题,请参考以下文章

RKMPP库快速上手--MPP编码入门

RKMPP库快速上手--RKMPP功能及使用详解

RKMPP API安装使用总结

基于RK3399的MPP库实现的视频编码

如何快速上手使用STM32库函数

Golang logrus 快速上手