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.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关键配置相关推荐
- RKMPP库快速上手--(四)MPP编码入门
首先,了解MPP编码之前,先了解一下MPP的MPI接口. 1.MPI接口结构 MPP设计的MPI接口,下面的图都来自于官方参考文档: MppMem:C库malloc内存的封装: MppBuffer:d ...
- RKMPP库快速上手--(三)MPP解码入门
一.RKMPP整个解码流程简单介绍一下: 1. 创建 MPP context 和 MPP api 接口. (注意,和RGA一样,多个线程多个实例需要多个独立的的context) ret = mpp_c ...
- RK3399Pro-硬件编解码器MPP库快速上手--(三)MPP编码关键代码讲解
MPP关键配置(讲解在注释中) 代码链接:https://download.csdn.net/download/qq_39839546/67314289 已设置成了0积分下载,欢迎大家下载分享. 为了 ...
- Eigen矩阵运算库快速上手
目录 1. 配置 2. 初始化 2.1 Array类 2.2 Vector类 2.3 Matrix类 2.4 Vector赋值 2.5 高级初始化 3. 矩阵计算 3.1 矩阵基本计算 3.2 线性求 ...
- 密码学C语言函数库——Miracl库快速上手中文指南(VC)
一.简介 密码学学习.研究人员往往着重于理论研究,难以与实践直接挂钩,今天介绍一下国外著名密码学C语言函数库--Miracl库的使用方法. Miracl库的官方网站是http://www.shamus ...
- python爬虫requests-Python爬虫---requests库快速上手
一.requests库简介 requests是Python的一个HTTP相关的库 requests安装: pip install requests 二.GET请求 import requests #首 ...
- STM32F411核心板固件库开发(二) USART配置
(一)芯片USART信息 我自己手上的F411CEU6只有48个引脚,属于UFQFPN48封装.对于同一系列型号的芯片,封装不一样,引脚的个数也会不一样,芯片上的外设资源自然也会不一样.UFQFPN4 ...
- c语言添加miracl库,密码学C语言函数库——Miracl库快速上手中文指南(VC)
一.简介 密码学学习.研究人员往往着重于理论研究,难以与实践直接挂钩,今天介绍一下国外著名密码学C语言函数库--Miracl库的使用方法. 该库针对公钥密码学和椭圆曲线密码学的实现,写了很多函数,在这 ...
- element-plus组件库快速上手教程
前言 一般我们开发单页面应用(关于单页面应用是什么在本专栏的另一篇文章中有介绍)时,特别是针对和我一样打算走后端开发的同学,对于前端只需要有了解的程度就行了,但是平常做项目练手时经常会要自己写前端的东 ...
最新文章
- linux系统版本间的区别是什么?内核又是什么
- 责任链模式 mashibing代码
- kotlin学习之类的扩展(四)
- 【聊一聊】css中的经典布局——圣杯布局
- mysql表打包到程序中_C#/winform程序打包布署 如何把SQL 数据库 一起打包进去?
- java数组图片_在JAVA中定义图片数组
- 一个数组中的元素头尾两端依次对调
- cisco 基本命令
- 使用QXDM Log 來分析LTE環境資訊
- 苏州旅游骗局黑幕经历
- 移动联通设置呼叫转移
- Linux基础命令(补充:命令行提示字符加颜色)
- 安卓日志:拍照、文件读取的问题
- 计算机开机黑屏并有报警声,开机报警5声,开机黑屏报警8声
- 什么是*.yml文件
- Python爬虫:猫眼电影反爬—动态字体处理(2020)
- 计算机网络之网络应用--Email应用
- PCA-APCA-MLR
- 计算机基础职中,职业高中计算机基础试卷一
- CCF系列题解--2016年9月第二题 火车购票