一、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.264MPP_VIDEO_CodingHEVC :  H.265MPP_VIDEO_CodingVP8 :  VP8MPP_VIDEO_CodingVP9 :  VP9MPP_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关键配置相关推荐

  1. RKMPP库快速上手--(四)MPP编码入门

    首先,了解MPP编码之前,先了解一下MPP的MPI接口. 1.MPI接口结构 MPP设计的MPI接口,下面的图都来自于官方参考文档: MppMem:C库malloc内存的封装: MppBuffer:d ...

  2. RKMPP库快速上手--(三)MPP解码入门

    一.RKMPP整个解码流程简单介绍一下: 1. 创建 MPP context 和 MPP api 接口. (注意,和RGA一样,多个线程多个实例需要多个独立的的context) ret = mpp_c ...

  3. RK3399Pro-硬件编解码器MPP库快速上手--(三)MPP编码关键代码讲解

    MPP关键配置(讲解在注释中) 代码链接:https://download.csdn.net/download/qq_39839546/67314289 已设置成了0积分下载,欢迎大家下载分享. 为了 ...

  4. Eigen矩阵运算库快速上手

    目录 1. 配置 2. 初始化 2.1 Array类 2.2 Vector类 2.3 Matrix类 2.4 Vector赋值 2.5 高级初始化 3. 矩阵计算 3.1 矩阵基本计算 3.2 线性求 ...

  5. 密码学C语言函数库——Miracl库快速上手中文指南(VC)

    一.简介 密码学学习.研究人员往往着重于理论研究,难以与实践直接挂钩,今天介绍一下国外著名密码学C语言函数库--Miracl库的使用方法. Miracl库的官方网站是http://www.shamus ...

  6. python爬虫requests-Python爬虫---requests库快速上手

    一.requests库简介 requests是Python的一个HTTP相关的库 requests安装: pip install requests 二.GET请求 import requests #首 ...

  7. STM32F411核心板固件库开发(二) USART配置

    (一)芯片USART信息 我自己手上的F411CEU6只有48个引脚,属于UFQFPN48封装.对于同一系列型号的芯片,封装不一样,引脚的个数也会不一样,芯片上的外设资源自然也会不一样.UFQFPN4 ...

  8. c语言添加miracl库,密码学C语言函数库——Miracl库快速上手中文指南(VC)

    一.简介 密码学学习.研究人员往往着重于理论研究,难以与实践直接挂钩,今天介绍一下国外著名密码学C语言函数库--Miracl库的使用方法. 该库针对公钥密码学和椭圆曲线密码学的实现,写了很多函数,在这 ...

  9. element-plus组件库快速上手教程

    前言 一般我们开发单页面应用(关于单页面应用是什么在本专栏的另一篇文章中有介绍)时,特别是针对和我一样打算走后端开发的同学,对于前端只需要有了解的程度就行了,但是平常做项目练手时经常会要自己写前端的东 ...

最新文章

  1. linux系统版本间的区别是什么?内核又是什么
  2. 责任链模式 mashibing代码
  3. kotlin学习之类的扩展(四)
  4. 【聊一聊】css中的经典布局——圣杯布局
  5. mysql表打包到程序中_C#/winform程序打包布署 如何把SQL 数据库 一起打包进去?
  6. java数组图片_在JAVA中定义图片数组
  7. 一个数组中的元素头尾两端依次对调
  8. cisco 基本命令
  9. 使用QXDM Log 來分析LTE環境資訊
  10. 苏州旅游骗局黑幕经历
  11. 移动联通设置呼叫转移
  12. Linux基础命令(补充:命令行提示字符加颜色)
  13. 安卓日志:拍照、文件读取的问题
  14. 计算机开机黑屏并有报警声,开机报警5声,开机黑屏报警8声
  15. 什么是*.yml文件
  16. Python爬虫:猫眼电影反爬—动态字体处理(2020)
  17. 计算机网络之网络应用--Email应用
  18. PCA-APCA-MLR
  19. 计算机基础职中,职业高中计算机基础试卷一
  20. CCF系列题解--2016年9月第二题 火车购票

热门文章

  1. 电子书管理软件Calibre使用
  2. EXCEL中快速在下方插入空白行,并且与下方空白单元格合并
  3. python余弦定理_余弦定理与文本相似度
  4. The Things Network LoRaWAN Stack V3 学习笔记 2.7.1 Web 前端开发调试
  5. 逆幂律模型_逆幂律曲线的基本架构永远不会改变
  6. 程序员加班看不上球赛崩溃,外卖小哥伸出援手:我帮你改代码
  7. java imgui,发布使用 IMGui 基于 msys2 平台编写的软件
  8. CDN真的有用吗?效果好不好
  9. 171023 逆向-BDCTF(Re)
  10. 24种中文一流核心期刊