通过多线程同时获取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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值