P5 RV1126编码测试Demo

目录

前言

01 测试Demo大致流程图

02 代码分析

2.1 VI设备初始化

2.2 使能通道 —— RK_MPI_VI_EnableChn

 2.3 VI 和 VENC绑定

2.4 创建 编码线程


 

前言

                             

从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》✨✨✨ 

🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》✨✨✨

🛸推荐专栏3:《嵌入式音视频_@ChenPi的博客-CSDN博客》
🌺本篇简介  :使用RV1126进行编码测试  

首先我们使用的硬件为瑞芯微的RV1126

kmedia是RK官方封装一层简易的API,把RGA、MPP、RKNN等等这些接口封装成高级的接口

该平台支持以下功能:

  1. VI(输入视频捕获)
  2. VO(视频输出显示)
  3. AI(音频采集)、AO(音频输出)
  4. VENC(H.265/H.264/JPEG/MJPEG编码)
  5. VDEC(H.265/H.264/JPEG、MJPEG 解码)
  6. RGA视频处理(包括旋转、缩放、裁剪)
  7. AENC(音频编码)、ADEC(音频解码)、
  8. MD(移动侦测)
  9. OD(遮挡侦测)
  10. VMIX(视频合成)
  11. MUXER(视频封装)
  12. VP(视频一入四出)

01 测试Demo大致流程图

  

因为这个测试Demo主要是编码进行视频编码

所以只用到VI和VENC 

  1. VI(输入视频捕获)
  2. VENC(H.265/H.264/JPEG/MJPEG编码)

02 代码分析

2.1 VI设备初始化

VI设备初始化有两步

  1. 设置通道属性
  2. 使能通道

 设置通道属性 —— RK_MPI_VI_SetChnAttr

设置通道的属性关键在于VI_CHN_ATTR_S结构体

结构体原型:

typedef struct rkVI_CHN_ATTR_S {const RK_CHAR *pcVideoNode; //video节点路径RK_U32 u32Width;            //分辨率宽度RK_U32 u32Height;           //分辨率高度IMAGE_TYPE_E enPixFmt;      //(VI格式)  RK_U32 u32BufCnt;          // 映射类型默认是:MMAPVI_CHN_BUF_TYPE enBufType; // VI通道模式VI_CHN_WORK_MODE enWorkMode;   //VI工作模式
} VI_CHN_ATTR_S;

需要注意的点:

结构体中的enBufType //VI 捕 捉 视 频 的 类 型  :

  • DMA 模 式(VI_CHN_BUF_TYPE_DMA) 
  • MMAP 模式(VI_CHN_BUF_TYPE_MMAP)

DMA:指的是直接访问内存的方式,相当于音视频数据直接从硬件传输到内存里面。这种方式的优点就
是两边传输的速度非常之快,但缺点就是非常消耗硬件资源,对硬件外设资源要求较高。

MMAP:指的是内存映射,这种方式就是把硬件外设、磁盘的文件映射到虚拟内存上面。然后用户只需
要对虚拟内存进行读写操作就可以对硬件外设进行操作了。这种方法的优点是用户不需要直接操作硬件就能够修改硬件的内容,换言之就是对硬件的消耗没那么大。

但是缺点就是:

第一,它的读写速度相对 DMA来说没那么快;

第二,有时候硬件写到虚拟内存的数据可能会出现丢失情况,导致数据出现丢失的情况。

2.2 使能通道 —— RK_MPI_VI_EnableChn

VENC的初始化:关键在于VENC_CHN_ATTR_S结构体,这个结构体是VENC设置的结构体

RV1126 编码器参数结构体包含在 VENC 通道属性结构体里面,我们可以看到 VENC 通道结
构 体 里 面 包 含 三 个 重 要 结 构 体 : 分 别 是

  • VENC_ATTR_S( 编 码 器 基 础 属 性 结 构 体 ) 
  • VENC_RC_ATTR_S(编码码率控制属性结构体)
  • VENC_GOP_ATTR_S(编码器 GOP 属性结构体)

设置完上述成员变量后,则使用RK_MPI_VENC_CreateChn创建编码层。

 2.3 VI 和 VENC绑定

设置完VI模块和VENC模块后,需要进行绑定VI和VENC才能够正常采集到编码数据。

采集的时候用到的结构体·MPP_CHN_S

typedef struct rkMPP_CHN_S {MOD_ID_E enModId;RK_S32 s32DevId;RK_S32 s32ChnId;
} MPP_CHN_S;

其中MPP_CHN_S的enModId是模块的ID、 s32ChnId是通道id。

这里分别创建两个MPP_CHN_S结构体,

  • VI的MPP_CHN_S,它的enModId选择的是RK_ID_VI,s32Id应该和VI创建的ID进行适配;
  • VENC的MPP_CHN_S,它的enModId选择的是RK_ID_VENC,s32ChnId和VENC创建的Id对应。

创建完两个MPP_CHN_S结构体后,利用RK_MPI_SYS_BIND把VI和VENC进行绑定。

2.4 创建 编码线程

从collect_venc_thread线程主要作用是获取VENC编码的码流数据,并实时保存到H264文件。

在这个线程里面,有几个重要的API需要讲解:

RK_MPI_SYS_GetMediaBuffer的作用是获取对应通道的数据,

这个API第一个参数是模块ID,第二个参数是通道ID第三个参数阻塞时间这里默认是-1不阻塞。

获取VENC通道的数据后,这其中

  • RK_MPI_MB_GetPtr是获取VENC缓冲区数据,
  • RK_MPI_MB_GetSize是获取VENC的缓冲区长度,并把缓冲区数据fwrite写到H264文件。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MP算法和OMP算法及其思想

主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Matching Pursuit)算法[1],这两个算法虽然在90年代初就提出来了,但作为经典的算法,国内文献(可能有我没有搜索到)都仅描述了算法步骤和简单的应用,并未对其进行详尽的分析&…

【牛客刷题记录】2021-03-10

牛客代码刷题记录1 问题一 给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个: 区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式…

SpringMVC详细示例实战教程

一、SpringMVC基础入门&#xff0c;创建一个HelloWorld程序 1.首先&#xff0c;导入SpringMVC需要的jar包。 2.添加Web.xml配置文件中关于SpringMVC的配置 123456789101112131415<!--configure the setting of springmvcDispatcherServlet and configure the mapping-->&…

学成在线--8.Freemarker入门教程

文章目录1.FreeMarker介绍1&#xff09;常用的java模板引擎还有哪些&#xff1f;2&#xff09;freemarker是一个用Java开发的模板引擎3&#xff09;模板数据模型输出2.FreeMarker快速入门1&#xff09;创建测试工程2&#xff09;配置文件3&#xff09;创建模型类4&#xff09;创…

面向对象建模

用面向对象方法开发软件&#xff0c;通常需要建立3种形式的模型&#xff0c;它们分别是 描述系统数据结构的对象模型 &#xff0c; 描述系统控制结构的动态模型 和 描述系统功能的功能模型 。一个典型的软件系统使用数据结构(对象模型)&#xff0c;执行操作(动态模型)&#xff…

if...elif...else...fi和case...esac的脚本条件判断式

注意1&#xff1a; if 表达式和case 表达式的区别及什么时候使用哪个要有明确的区分&#xff1f; 『 if .... then .... fi 』对于变量的判断是以『比对』的方式来分辨的&#xff0c; 如果符合状态就进行某些行为&#xff0c;并且透过较多层次 (就是elif ) 的方式来进行多个变量…

安卓自定义View进阶-分类与流程

自定义View绘制流程函数调用链(简化版) 一.自定义View分类 我将自定义View分为了两类(sloop个人分类法&#xff0c;非官方)&#xff1a; 1.自定义ViewGroup 自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件&#xff0c;大多继承自ViewGroup或各种Layout&…

【笔试记录】2021/3/13美团

2021/3/13美团笔试 1.旋转二维数组 m, n map(int, input().split()) a [] for _ in range(m):a.append(list(map(int, input().split()))) for j in range(n):for k in range(m):print(a[k][j], end )print(end\n)输入输出 2.找出输入字符串中的所有数字 s input() n …

Ubuntu品牌机批量涌入世界市场,中国不会例外

根据种种信息来源&#xff0c;我们可以预见&#xff1a; Ubuntu 品牌机不久即将涌入世界市场&#xff0c;中国也不会例外。对此现象&#xff0c;我们必须有一定的思想准备。 2004年4月&#xff0c;在澳大利亚一次学术会议上萌发了Ubuntu发行版的念头&#xff0c;至今已经有8个年…

学成在线--9.页面静态化

文章目录一.页面静态化流程二.数据模型1.轮播图DataUrl接口1&#xff09;需求分析2&#xff09;接口定义3&#xff09;Dao4&#xff09;Service5&#xff09;Controller6&#xff09;测试2.远程请求接口1&#xff09;添加依赖2&#xff09;配置RestTemplate3&#xff09;测试Re…

数据库的完整性和安全性

数据的完整性防止数据库中存在不符合语义的数据&#xff0c;也就是防止数据库中存在不正确的数据防范对象&#xff1a;不合语义的、不正确的数据数据的安全性保护数据库 防止恶意的破坏和非法的存取防范对象&#xff1a;非法用户和非法操作

数据库MySQL/mariadb知识点——日志记录(2)二进制日志

二进制日志 记录已提交事务导致数据改变或潜在导致数据改变的SQL语句&#xff0c;通过“重放”日志文件中的事件来生成数据副本&#xff0c;不依赖存储引擎类型。 开启二进制日志&#xff0c;默认是关闭的&#xff0c;二进制日志和数据分开存放 开启记录二进制文件的功能&#…

【面试记录】Python常见面试200题及答案总结

Python常见面试200题及答案总结 /待完善/ 1. 列出5个常用python标准库&#xff1f; os&#xff1a;提供了不少与操作系统相关联的函数&#xff0c;提供了一种可移植的使用操作系统功能的方法。使用os模块中提供的接口&#xff0c;可实现跨平台访问。但是&#xff0c;并不是所…

Linux负载均衡软件LVS之一(概念篇)

2019独角兽企业重金招聘Python工程师标准>>> 一、 LVS简介 LVS是Linux Virtual Server的简称&#xff0c;也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目&#xff0c;它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分…

C语言目录操作 (Linux/Unix)

获得工作目录&#xff1a;#include <unistd.h> char *getcwd(char *buf,size_t size);char *getwd(char *buf);/*this is for FreeBSD*/ 改变当前目录&#xff1a;#include <unistd.h> int chdir(const char *path); 保存当前目录&#xff1a;#include <unist…

学成在线--10.页面预览

文章目录一.需求分析二. 搭建环境1.在cms服务中集成freemarker&#xff1a;2.在application.yml配置freemarker三.Service四.Controller五.页面预览测试-- 配置Nginx代理六.页面预览测试-- 添加“页面预览”链接一.需求分析 页面在发布前增加页面预览的步骤&#xff0c;方便用…

参照完整性违约处理

参照完整性违约处理 &#xff08;1&#xff09; 拒绝&#xff08;NO ACTION&#xff09;执行 不允许该操作执行。该策略一般设置为默认策略 &#xff08;2&#xff09; 级联&#xff08;CASCADE&#xff09;操作 当删除或修改被参照表&#xff08;Student&#xff09;的一个元…

BSON和JSON的区别

BSON目前主要用于MongoDB中&#xff0c;是mongoDB的数据存储格式&#xff0c;BSON基于JSON格式&#xff0c;选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。 BSON主要实现下面三点&#xff1a; 1、更快的遍历速度 对json格式来说&#xff0c;太大的json结…

【代码刷题】排序算法总结(python实现)

排序算法总结&#xff08;Python实现&#xff09;算法介绍算法分类相关概念1. 冒泡排序&#xff08;Bubble Sort&#xff09;1.1 思想1.2 python实现1.3 复杂度1.4 稳定性2. 快速排序&#xff08;Quick Sort&#xff09;2.1 思想&#xff08;伪代码&#xff09;2.2 python实现2…

C语言遍历目录

C语言遍历目录&#xff0c;可以循环的遍历子目录#include <stdio.h>#include <string.h>#include <stdlib.h>#include <dirent.h>#include <sys/stat.h>#include <unistd.h>#include <sys/types.h>void listDir(char *path){struct …