通过代码的方式同时获取H264,H265码流并且分别保存到H264文件和H265文件。
一、原理讲解
RV1126 VI采集摄像头数据并同时编码H264、H265的大概流程
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.H264、H265的VENC模块初始化:
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分别绑定H264的VENC层和H265的VENC层:
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);
//H265的VENC模块节点设置
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线程采集H264的VENC数据:
开启一个线程去采集每一帧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线程采集H265的VENC数据:
开启一个线程去采集每一帧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