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

RV1126通过创建多线程获取高低编码器的分辨率视频

效果

高VENC

低VENC

占用空间高分辨率的是20几MB,低分辨率是几MB

编码流程

一、VI(Video 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.jsqmd.com/news/484354/

相关文章:

  • 为什么你的MCP服务重启后连接数暴涨300%?源码级定位Connection Leak根源(附GDB内存快照分析法)
  • 构建高效仿真流水线:MPh驱动的COMSOL自动化实践指南
  • Asian Beauty Z-Image Turbo 生成图像的后处理与优化技巧
  • Qwen3-0.6B-FP8与卷积神经网络(CNN)结合的图像描述生成探索
  • WSL镜像存储位置优化:解决C盘空间不足的终极方案
  • 基于SL2.1的USB 2.0四端口集线器硬件设计与工程实践
  • 从黑客视角看ARP协议:Wireshark抓包演示ARP欺骗攻防(含防御配置)
  • 保姆级教程:在Ubuntu 20.04上安装rknn-toolkit 1.6(含TensorFlow依赖配置)
  • STM32F103多通道PWM输出避坑指南:TIM1_CH1异常输出的解决方案
  • Xilinx FPGA开发效率提升:Vivado 2018.3中那些你可能不知道的快捷键和实用技巧
  • Patreon内容持久化解决方案:开源工具PatreonDownloader全解析
  • 网盘直链解析技术:从原理到实践的完整指南
  • 中文文本分段可解释性分析:BERT文本分割模型关键token贡献度可视化
  • 寻音捉影·侠客行真实案例:某省级广播电台用其自动化生成新闻选题线索库
  • 突破网盘限速壁垒:直链解析高效应用全攻略
  • 突破COMSOL仿真效率瓶颈:MPh驱动的Python自动化革命
  • CLIP ViT-H-14轻量化部署方案:FP16推理+TensorRT加速实践教程
  • GTE-large实操手册:日志中结构化提取NER结果用于ELK日志分析
  • Alpamayo-R1-10B惊艳效果展示:64步轨迹预测+鸟瞰图动态可视化
  • Fish Speech-1.5语音合成参数详解:temperature、top_p、seed全解析
  • iOS逆向工程入门:利用class-dump与Hopper Disassembler解析ipa文件
  • PostgreSQL15在CentOS7的深度清理指南:彻底卸载与残留文件手动删除
  • Granite TimeSeries FlowState R1工业级精度展示:预测设备剩余使用寿命(RUL)
  • Python3.11镜像应用解析:自动化脚本开发环境快速搭建指南
  • 1. 基于Keil与SysConfig的TI MSPM0G3507开发板快速上手手册介绍
  • Chroma向量数据库实战:用Python快速搭建本地知识库(附中文诗词检索案例)
  • Qt 打印输出:printf与qDebug的区别
  • CasRel关系抽取模型真实效果:法律判决书中‘原告-主张-被告’三元组
  • HX711称重传感器驱动移植实战:基于CW32F030C8T6的10Kg电子秤方案
  • 打工人上班摸魚小說-第二十四章 西行、夜车与后视镜里的眼睛