RV1126通过创建多线程获取高低编码器的分辨率视频
效果高VENC低VENC占用空间高分辨率的是20几MB低分辨率是几MB编码流程一、VIVideo Input 视频输入模块初始化使能通道int ret; RK_MPI_SYS_Init(); // VI Init...... VI_CHN_ATTR_S vi_chn_attr; vi_chn_attr.pcVideoNode rkispp_scale0;//设置视频设备节点路径 vi_chn_attr.u32Width 1920;//设置分辨率的宽度 vi_chn_attr.u32Height 1080;//设置分辨率的高度 vi_chn_attr.enPixFmt IMAGE_TYPE_NV12;//设置图像类型 vi_chn_attr.enBufType VI_CHN_BUF_TYPE_MMAP;//设置VI获取类型 vi_chn_attr.u32BufCnt 3;//设置缓冲数量 vi_chn_attr.enWorkMode VI_WORK_MODE_NORMAL;//设置VI工作类型 ret RK_MPI_VI_SetChnAttr(PIPE_ID,VI_CHN_ID,vi_chn_attr); if(ret) { printf(Video Input channel deploy failed ....\n); return -1; } else { printf(Video Input channel deploy success! ----------\n); } //Enable Channel ret RK_MPI_VI_EnableChn(PIPE_ID,VI_CHN_ID); if(ret) { printf(Enable Channel failed!....\n); return -2; } else { printf(Enable Channel success!--------\n); }二、RGA图像模块初始化//set RGA RGA_ATTR_S My_RGA_Init; //Input My_RGA_Init.stImgIn.u32Width 1920; My_RGA_Init.stImgIn.u32Height 1080; My_RGA_Init.stImgIn.u32HorStride 1920; My_RGA_Init.stImgIn.u32VirStride 1080; My_RGA_Init.stImgIn.imgType IMAGE_TYPE_NV12; My_RGA_Init.stImgIn.u32X 0; My_RGA_Init.stImgIn.u32Y 0; //Output My_RGA_Init.stImgOut.u32Width 1280; My_RGA_Init.stImgOut.u32Height 720; My_RGA_Init.stImgOut.u32HorStride 1280; My_RGA_Init.stImgOut.u32VirStride 720; My_RGA_Init.stImgOut.imgType IMAGE_TYPE_NV12; My_RGA_Init.stImgOut.u32X 0; My_RGA_Init.stImgOut.u32Y 0; My_RGA_Init.u16Rotaion 0; My_RGA_Init.bEnBufPool RK_TRUE; My_RGA_Init.u16BufPoolCnt 3; My_RGA_Init.enFlip RGA_FLIP_H; ret RK_MPI_RGA_CreateChn(RGA_CHN_ID,My_RGA_Init); if(ret) { printf(RGA_Channel create failed!....\n); return -3; } else { printf(RGA_Channel create success!--------\n); }三、配置高分辨率编码器//set high_venc VENC_CHN_ATTR_S My_High_venc; //set stVencAttr My_High_venc.stVencAttr.enType RK_CODEC_TYPE_H264; My_High_venc.stVencAttr.imageType IMAGE_TYPE_NV12; My_High_venc.stVencAttr.u32VirWidth 1920; My_High_venc.stVencAttr.u32VirHeight 1080; My_High_venc.stVencAttr.u32Profile 66; My_High_venc.stVencAttr.u32PicWidth 1920; My_High_venc.stVencAttr.u32PicHeight 1080; My_High_venc.stVencAttr.enRotation VENC_ROTATION_0; //SET stRcAttr My_High_venc.stRcAttr.enRcMode VENC_RC_MODE_H264CBR; My_High_venc.stRcAttr.stH264Cbr.u32Gop 25; My_High_venc.stRcAttr.stH264Cbr.u32SrcFrameRateDen 1; My_High_venc.stRcAttr.stH264Cbr.u32SrcFrameRateNum 25; My_High_venc.stRcAttr.stH264Cbr.fr32DstFrameRateDen 1; My_High_venc.stRcAttr.stH264Cbr.fr32DstFrameRateNum 25; My_High_venc.stRcAttr.stH264Cbr.u32BitRate 8388608; ret RK_MPI_VENC_CreateChn(HIGH_VENC_CHN,My_High_venc); if(ret) { printf(HIGH_VENC Create failed!....\n); return -4; } else { printf(HIGH_VENC Create success!--------\n); }四、设置低分辨率编码器//set low_venc VENC_CHN_ATTR_S My_Low_venc; //set stVencAttr My_Low_venc.stVencAttr.enType RK_CODEC_TYPE_H264; My_Low_venc.stVencAttr.imageType IMAGE_TYPE_NV12; My_Low_venc.stVencAttr.u32VirWidth 1280; My_Low_venc.stVencAttr.u32VirHeight 720; My_Low_venc.stVencAttr.u32Profile 66; My_Low_venc.stVencAttr.u32PicWidth 1280; My_Low_venc.stVencAttr.u32PicHeight 720; My_Low_venc.stVencAttr.enRotation VENC_ROTATION_0; //SET stRcAttr My_Low_venc.stRcAttr.enRcMode VENC_RC_MODE_H264CBR; My_Low_venc.stRcAttr.stH264Cbr.u32Gop 25; My_Low_venc.stRcAttr.stH264Cbr.u32SrcFrameRateDen 1; My_Low_venc.stRcAttr.stH264Cbr.u32SrcFrameRateNum 25; My_Low_venc.stRcAttr.stH264Cbr.fr32DstFrameRateDen 1; My_Low_venc.stRcAttr.stH264Cbr.fr32DstFrameRateNum 25; My_Low_venc.stRcAttr.stH264Cbr.u32BitRate 2097152; ret RK_MPI_VENC_CreateChn(LOW_VENC_CHN,My_Low_venc); if(ret) { printf(LOW_VENC_CHN Create failed!....\n); return -5; } else { printf(LOW_VENC_CHN Create success!--------\n); }五、绑定然后创建线程六、全部代码是这样的#include assert.h #include fcntl.h #include getopt.h #include pthread.h #include signal.h #include stdbool.h #include stdio.h #include stdlib.h #include time.h #include unistd.h // #include common/sample_common.h #include rkmedia_api.h #define PIPE_ID 0 #define VI_CHN_ID 0 #define RGA_CHN_ID 0 #define HIGH_VENC_CHN 0 #define LOW_VENC_CHN 1 void *get_high_venc_thread(void *rags); void *rga_handle_thread(void *args); void *get_low_venc_thread(void *rags); int main(int argc, char *argv[]) { int ret; RK_MPI_SYS_Init(); // VI Init...... VI_CHN_ATTR_S vi_chn_attr; vi_chn_attr.pcVideoNode rkispp_scale0;//设置视频设备节点路径 vi_chn_attr.u32Width 1920;//设置分辨率的宽度 vi_chn_attr.u32Height 1080;//设置分辨率的高度 vi_chn_attr.enPixFmt IMAGE_TYPE_NV12;//设置图像类型 vi_chn_attr.enBufType VI_CHN_BUF_TYPE_MMAP;//设置VI获取类型 vi_chn_attr.u32BufCnt 3;//设置缓冲数量 vi_chn_attr.enWorkMode VI_WORK_MODE_NORMAL;//设置VI工作类型 ret RK_MPI_VI_SetChnAttr(PIPE_ID,VI_CHN_ID,vi_chn_attr); if(ret) { printf(Video Input channel deploy failed ....\n); return -1; } else { printf(Video Input channel deploy success! ----------\n); } //Enable Channel ret RK_MPI_VI_EnableChn(PIPE_ID,VI_CHN_ID); if(ret) { printf(Enable Channel failed!....\n); return -2; } else { printf(Enable Channel success!--------\n); } //set RGA RGA_ATTR_S My_RGA_Init; //Input My_RGA_Init.stImgIn.u32Width 1920; My_RGA_Init.stImgIn.u32Height 1080; My_RGA_Init.stImgIn.u32HorStride 1920; My_RGA_Init.stImgIn.u32VirStride 1080; My_RGA_Init.stImgIn.imgType IMAGE_TYPE_NV12; My_RGA_Init.stImgIn.u32X 0; My_RGA_Init.stImgIn.u32Y 0; //Output My_RGA_Init.stImgOut.u32Width 1280; My_RGA_Init.stImgOut.u32Height 720; My_RGA_Init.stImgOut.u32HorStride 1280; My_RGA_Init.stImgOut.u32VirStride 720; My_RGA_Init.stImgOut.imgType IMAGE_TYPE_NV12; My_RGA_Init.stImgOut.u32X 0; My_RGA_Init.stImgOut.u32Y 0; My_RGA_Init.u16Rotaion 0; My_RGA_Init.bEnBufPool RK_TRUE; My_RGA_Init.u16BufPoolCnt 3; My_RGA_Init.enFlip RGA_FLIP_H; ret RK_MPI_RGA_CreateChn(RGA_CHN_ID,My_RGA_Init); if(ret) { printf(RGA_Channel create failed!....\n); return -3; } else { printf(RGA_Channel create success!--------\n); } //set high_venc VENC_CHN_ATTR_S My_High_venc; //set stVencAttr My_High_venc.stVencAttr.enType RK_CODEC_TYPE_H264; My_High_venc.stVencAttr.imageType IMAGE_TYPE_NV12; My_High_venc.stVencAttr.u32VirWidth 1920; My_High_venc.stVencAttr.u32VirHeight 1080; My_High_venc.stVencAttr.u32Profile 66; My_High_venc.stVencAttr.u32PicWidth 1920; My_High_venc.stVencAttr.u32PicHeight 1080; My_High_venc.stVencAttr.enRotation VENC_ROTATION_0; //SET stRcAttr My_High_venc.stRcAttr.enRcMode VENC_RC_MODE_H264CBR; My_High_venc.stRcAttr.stH264Cbr.u32Gop 25; My_High_venc.stRcAttr.stH264Cbr.u32SrcFrameRateDen 1; My_High_venc.stRcAttr.stH264Cbr.u32SrcFrameRateNum 25; My_High_venc.stRcAttr.stH264Cbr.fr32DstFrameRateDen 1; My_High_venc.stRcAttr.stH264Cbr.fr32DstFrameRateNum 25; My_High_venc.stRcAttr.stH264Cbr.u32BitRate 8388608; ret RK_MPI_VENC_CreateChn(HIGH_VENC_CHN,My_High_venc); if(ret) { printf(HIGH_VENC Create failed!....\n); return -4; } else { printf(HIGH_VENC Create success!--------\n); } //set low_venc VENC_CHN_ATTR_S My_Low_venc; //set stVencAttr My_Low_venc.stVencAttr.enType RK_CODEC_TYPE_H264; My_Low_venc.stVencAttr.imageType IMAGE_TYPE_NV12; My_Low_venc.stVencAttr.u32VirWidth 1280; My_Low_venc.stVencAttr.u32VirHeight 720; My_Low_venc.stVencAttr.u32Profile 66; My_Low_venc.stVencAttr.u32PicWidth 1280; My_Low_venc.stVencAttr.u32PicHeight 720; My_Low_venc.stVencAttr.enRotation VENC_ROTATION_0; //SET stRcAttr My_Low_venc.stRcAttr.enRcMode VENC_RC_MODE_H264CBR; My_Low_venc.stRcAttr.stH264Cbr.u32Gop 25; My_Low_venc.stRcAttr.stH264Cbr.u32SrcFrameRateDen 1; My_Low_venc.stRcAttr.stH264Cbr.u32SrcFrameRateNum 25; My_Low_venc.stRcAttr.stH264Cbr.fr32DstFrameRateDen 1; My_Low_venc.stRcAttr.stH264Cbr.fr32DstFrameRateNum 25; My_Low_venc.stRcAttr.stH264Cbr.u32BitRate 2097152; ret RK_MPI_VENC_CreateChn(LOW_VENC_CHN,My_Low_venc); if(ret) { printf(LOW_VENC_CHN Create failed!....\n); return -5; } else { printf(LOW_VENC_CHN Create success!--------\n); } MPP_CHN_S vi_chn_s; vi_chn_s.enModId RK_ID_VI; vi_chn_s.s32ChnId VI_CHN_ID; MPP_CHN_S high_chn_s; high_chn_s.enModId RK_ID_VENC; high_chn_s.s32ChnId HIGH_VENC_CHN; ret RK_MPI_SYS_Bind(vi_chn_s,high_chn_s); if(ret) { printf(My_High_venc bind failed!....\n); return -6; } else { printf(My_High_venc bind success!--------\n); } MPP_CHN_S rga_chn_s; rga_chn_s.enModId RK_ID_RGA; rga_chn_s.s32ChnId RGA_CHN_ID; ret RK_MPI_SYS_Bind(vi_chn_s,rga_chn_s); if(ret) { printf(rga_chn_s bind failed!....\n); return -7; } else { printf(rga_chn_s bind success!--------\n); } //create pthread pthread_t high_venc_pid; pthread_t low_venc_pid; pthread_t rga_pid; pthread_create(high_venc_pid,NULL,get_high_venc_thread,NULL); pthread_create(rga_pid,NULL,rga_handle_thread,NULL); pthread_create(low_venc_pid,NULL,get_low_venc_thread,NULL); while(1) { sleep(1); } RK_MPI_SYS_UnBind(vi_chn_s, high_chn_s); RK_MPI_SYS_UnBind(vi_chn_s, rga_chn_s); RK_MPI_RGA_DestroyChn(RGA_CHN_ID); RK_MPI_VENC_DestroyChn(HIGH_VENC_CHN); RK_MPI_VENC_DestroyChn(LOW_VENC_CHN); RK_MPI_VI_DisableChn(PIPE_ID, VI_CHN_ID); return 0; } void *get_high_venc_thread(void *rags) { pthread_detach(pthread_self()); FILE *high_venc_file fopen(test_high_venc.h264,w); MEDIA_BUFFER mb; while(1) { mb RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC,HIGH_VENC_CHN,-1); if(!mb) { printf(get higt venc failed!....\n); } else { printf(get higt venc success!--------\n); fwrite(RK_MPI_MB_GetPtr(mb),RK_MPI_MB_GetSize(mb),1,high_venc_file); RK_MPI_MB_ReleaseBuffer(mb); } } return NULL; } void *rga_handle_thread(void *args) { pthread_detach(pthread_self()); MEDIA_BUFFER mb; while(1) { mb RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA,RGA_CHN_ID,-1); if(!mb) { printf(rga handle failed!....\n); } else { printf(rga handle success!--------\n); RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, LOW_VENC_CHN, mb); RK_MPI_MB_ReleaseBuffer(mb); } } return NULL; } void *get_low_venc_thread(void *rags) { pthread_detach(pthread_self()); FILE *low_venc_file fopen(test_low_venc.h264,w); MEDIA_BUFFER mb; while(1) { mb RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC,LOW_VENC_CHN,-1); if(!mb) { printf(get low venc failed!....\n); } else { printf(get low venc success!--------\n); fwrite(RK_MPI_MB_GetPtr(mb),RK_MPI_MB_GetSize(mb),1,low_venc_file); RK_MPI_MB_ReleaseBuffer(mb); } } return NULL; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2415493.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!