当前位置: 首页 > news >正文

RV1126多线程获取SMARTP的GOP模式数据和普通GOP模式数据

通过代码的方式同时获取SMARTP模式的VENC码流数据和普通GOP模式的VENC码流数据,并进行对比画质。

一.RV1126 VI采集摄像头数据并同时编码SMARTP模式和普通GOP模式的编码码流流程

RV1126利用多线程同时获取普通GOP的VENC码流数据和SMARTP的码流数据一般如上图,分为8个步骤:分别是VI模块初始化、普通GOP的VENC模块初始化、智能SMARTP_GOP的VENC模块初始化、VI绑定普通GOP的VENC编码器节点、设置GOP属性为SMARTP属性、VI绑定SMARTP_GOP的VENC编码器节点、创建多线程获取普通GOP的VENC码流数据并保存、创建多线程获取SMART_GOP的VENC码流数据并保存。

1.初始化VI模块:

VI模块的初始化实际上就是对VI_CHN_ATTR_S的参数进行设置、然后调用RK_MPI_VI_SetChnAttr设置VI模块并使能RK_MPI_VI_EnableChn伪代码如下:

VI_CHN_ATTR_S  vi_chn_attr;

。。。。。。。。。。。。。。。(这里是设置VI的属性)

ret = RK_MPI_VI_SetChnAttr(CAMERA_ID, 0, &vi_chn_attr);

ret |= RK_MPI_VI_EnableChn(CAMERA_ID, 0);

2.两种GOP模式VENC模块初始化:

VENC_CHN_ATTR_S  common_gop_venc_chn_attr;

..................................

RK_MPI_VENC_CreateChn(COMMON_GOP_VENC_CHN, &common_gop_venc_chn_attr);

VENC_CHN_ATTR_S  smartp_gop_venc_chn_attr;

..................................

RK_MPI_VENC_CreateChn(SMARTP_VENC_CHN, &smartp_gop_venc_chn_attr);

注意:这里需要创建两个编码器层,分别是普通GOP模式编码器和SMART的GOP模式编码器。

​​​​​​​3.设置SMARTPVENC模块GOP参数调节

VENC_GOP_ATTR_S venc_gop_attr;

venc_gop_attr.enGopMode = VENC_GOPMODE_SMARTP; //设置GOP模式为SMARTP模式

venc_gop_attr.u32GopSize = 25; //设置短参考帧间隔是25

venc_gop_attr.s32IPQpDelta = 6; //设置I帧和P帧的差值是6

venc_gop_attr.s32ViQpDelta = 6;//设置虚拟I帧和P帧的差值是6

venc_gop_attr.u32BgInterval = 25 * 5; //设置长参考帧的长度是短参考帧的5倍

ret = RK_MPI_VENC_SetGopMode(SMARTP_GOP_VENC_CHN, &venc_gop_attr);

上面是SMARTPGOP模式一些参数的设置,设置完成调用RK_MPI_VENC_SetGopMode去调用

4.​​​​​​​​​​​​​​VI模块绑定普通GOPVENC模块和SMARTP_GOPVENC模块,下面是伪代码:

//VI模块节点

MPP_CHN_S vi_chn_s;

vi_chn_s.enModId = RK_ID_VI;

vi_chn_s.s32ChnId = VI_CHN_ID;

//普通GOPVENC模块节点

MPP_CHN_S common_gop_venc_chn_s;

common_gop_venc_chn_s.enModId = RK_ID_VENC;

common_gop_venc_chn_s.s32ChnId = COMMON_GOP_VENC_CHN;

ret = RK_MPI_SYS_Bind(&vi_chn_s, &common_gop_venc_chn_s);

//SMARTP_GOPVENC模块

MPP_CHN_S smartp_gop_venc_chn_s;

smartp_gop_venc_chn_s_s.enModId = RK_ID_VENC;

smartp_gop_venc_chn_s.s32ChnId = SMARTP_GOP_VENC_CHN;

ret = RK_MPI_SYS_Bind(&vi_chn_s, &smartp_gop_venc_chn_s);

​​​​​​​5.创建多线程获取普通GOP的VENC码流数据并保存

开启一个线程去采集每一帧普通GOP的VENC模块数据,使用的API是RK_MPI_SYS_GetMediaBuffer 模块ID是RK_ID_VENC,通道号ID是普通GOP的 VENC创建ID号这个API伪代码如下

while(1)

{

  .........................

  mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, COMMON_GOP_VENC_CHN, -1);

  fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, common_gop_h264_file);

.......................

}

​​​​​​​6.多线程获取SMARTP_GOPVENC模块数据:

开启一个线程去采集每一帧SMARTP_GOP的VENC模块数据,使用的API是RK_MPI_SYS_GetMediaBuffer 模块ID是RK_ID_VENC,通道号ID是SMARTP_GOP的VENC层。这个API伪代码如下

while(1)

{

  .........................

  mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, SMARTP_GOP_VENC_CHN, -1);

  fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, smartp_gop_h264_file);

.......................

}

二.代码实战

1.VI模块初始化

​​​​​​​2.两种GOP模式VENC模块初始化:

​​​​​​​3.设置SMARTPVENC模块GOP参数调节

4.​​​​​​​​​​​​​​VI模块绑定普通GOPVENC模块和SMARTP_GOPVENC模块

​​​​​​​5.创建多线程获取普通GOP的VENC码流数据并保存与

​​​​​​​6.多线程获取SMARTP_GOPVENC模块数据:

http://www.xdnf.cn/news/529813.html

相关文章:

  • 如何用体育数据做分析:从基础统计到AI驱动的决策科学
  • DB31/T 1545—2025《卫生健康数据分类分级要求》上海地方标准全面解析与未来对医院数据管理以及数据编程影响
  • gtest 库的安装和使用
  • 【保姆级】Nginx简介以及安装
  • vue3中element-plus修改el-tooltip的宽度
  • vue2使用three.js实现一个旋转球体
  • AI自媒体封面生成系统
  • c++字符串常用语法特性查询示例文档(二)
  • HarmonyOS开发样式布局
  • web常见的攻击方式
  • UniApp 实现的文件预览与查看功能#三方框架 #Uniapp
  • 阻塞队列:线程安全与生产者消费者模型解析
  • nginx 流量控制
  • map与set封装
  • Web安全基础
  • 十三、面向对象底层逻辑-Dubbo序列化Serialization接口
  • MacBook连接不上星巴克Wi-Fi的解决方法
  • 《Effective Python》第三章 循环和迭代器——在遍历参数时保持防御性
  • 江协科技EXTI外部中断hal库实现
  • 需求频繁变更?AI 驱动的自动化解决方案实践
  • 企业销售管理痛点解析与数字化解决方案
  • Unity 如何使用Timeline预览、播放特效
  • 第十六届蓝桥杯复盘
  • C#中的ThreadStart委托
  • 软件架构风格系列(7):闭环控制架构
  • 基于不透光法的柴油机排放精准监测
  • Android13 以太网(YT8531)
  • 【JavaScript】用 Proxy 拦截对象属性
  • Xshell实战:远程连接VMware CentOS7虚拟机与高效运维指南——从零配置到自动化操作,解锁Xshell的核心价值
  • Bootstrap 5 容器与网格系统详解