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

通过多线程同时获取H264和H265码流

通过代码的方式同时获取H264H265码流并且分别保存到H264文件和H265文件。

一、原理讲解

RV1126 VI采集摄像头数据并同时编码H264H265的大概流程

RV1126利用多线程同时获取H264文件、H265文件的过程一般分为上图的7步骤,分别是:VI模块的初始化、H264的VENC模块初始化、H265的VENC模块初始化、VI绑定H264的VENC模块、VI绑定H265的VENC模块(只有一个摄像头,所以一个VI模块需要绑定两个编码器),开启H264线程获取H264码流并保存、开启H265线程获取H265码流并保存。

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.H264H265VENC模块初始化:

VENC_CHN_ATTR_S  h264_venc_chn_attr;

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

RK_MPI_VENC_CreateChn(H264_VENC_CHN, &h264_venc_chn_attr);

VENC_CHN_ATTR_S  h265_venc_chn_attr;

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

RK_MPI_VENC_CreateChn(H265_VENC_CHN, &h265_venc_chn_attr);

注意:这里需要创建两个编码器层,分别是H264编码器和H265编码器。

​​​​​​​3.VI分别绑定H264VENC层和H265VENC层:

VI节点分别绑定H264的VENC节点和H265节点,伪代码如下:

//VI模块节点的设置

MPP_CHN_S vi_chn_s;

vi_chn_s.enModId = RK_ID_VI;

vi_chn_s.s32ChnId = 0;

//H264的VENC模块节点设置

MPP_CHN_S h264_venc_chn_s;

h264_venc_chn_s.enModId = RK_ID_VENC;

h264_venc_chn_s.s32ChnId = H264_VENC_CHN;

ret = RK_MPI_SYS_Bind(&vi_chn_s, &h264_venc_chn_s);

//H265VENC模块节点设置

MPP_CHN_S h265_venc_chn_s;

h265_venc_chn_s.enModId = RK_ID_VENC;

h265_venc_chn_s.s32ChnId = H265_VENC_CHN;

ret = RK_MPI_SYS_Bind(&vi_chn_s, &h265_venc_chn_s);

​​​​​​​4.开启H264线程采集H264VENC数据:

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

while(1)

{

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

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

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

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

}

​​​​​​​5.开启H265线程采集H265VENC数据:

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

while(1)

{

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

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

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

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

}

二、代码实战

1.初始化VI模块

2.H264、H265VENC模块初始化

1.H264属性设置

2.创建H264

3.H265属性配置

4.创建H265

3.绑定

1.创建ID

2.VI绑定

4.线程分别采集数据

1.创建线程

2.子线程函数

5.释放资源

打开ffmpeg播放软件,对编码的H264文件和H265文件进行播放。播放指令分别如下:

ffplay.exe -x 500 test_camera.h264

ffplay.exe -x 500 test_camera.h265

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

相关文章:

  • 本地缓存更新方案探索
  • 多模态模型如何处理任意分辨率输入——Tiling与Packing技术详解
  • CentOS 下 FTP 与 NFS 服务深度解析:从基础配置到实战应用
  • css 中 content: “\e6d0“ 怎么变成图标的?
  • 2000 元以下罕见的真三色光源投影仪:雷克赛恩Cyber Pro1重新定义入门级投影体验
  • 南航无人机大规模户外环境视觉导航框架!SM-CERL:基于语义地图与认知逃逸强化学习的无人机户外视觉导航
  • STM32F10xx 参考手册
  • ALIENTEK精英STM32F103开发板 实验0测试程序详解
  • 信息安全的基石:深入理解五大核心安全服务
  • NPN、PNP三极管的应用
  • 企业级电商数据对接:1688 商品详情 API 接口开发与优化实践
  • Pandas 掌握Matplotlib基础绘图①
  • 6to4、6over4的类比解释
  • MAUI之XAML标记扩展
  • Linux:计算机的层状结构
  • .NET 中管理 Web API 文档的两种方式
  • 指定elf文件dwarf 版本以及查看dwarf版本号
  • C++ 蓝桥 STEMA 真题模拟测试卷二
  • 程序中断方式好题分享
  • 日志系统**
  • 蓝桥杯11届国B 答疑
  • Redis内存管理深度解析
  • LeetCode --- 156双周赛
  • JAVA的常见API文档(上)
  • 高频面试题(含笔试高频算法整理)基本总结回顾110
  • 角点特征:从传统算法到深度学习算法演进
  • 电子电路:什么是色环电阻器,怎么识别和计算阻值?
  • React学习(二)-变量
  • Docker常见命令解读
  • Vue.js---watch 的实现原理