RV1126+FFMPEG推流项目(3)VI模块视频编码流程

news/2025/1/18 10:53:49/

 视频编码的流程:   

        本章节讲的是RV1126视频编码的流程,在整个项目之中视频编码功能是核心之一。视频编码流程主要分三步:VI的初始化VENC的初始化(硬件编码)绑定VIVENC节点开启VENC线程进行视频编码的采集,注意一下这里的编码是硬件编码,不是使用ffmpeg软件编码

        rv1126有一份开发手册,很多东西都是在里面找到了。

        视频采集流程:

重要的结构体: 

        第一步要 rkmedia_function_init();该函数主要负责初始化rkmedia系统,确保系统准备就绪,可以执行后续的操作,它调用RK_MPI_SYS_Init()函数来进行实际的初始化工作

//初始化所有rkmedia的模块
int init_rkmedia_module_function()
{rkmedia_function_init(); //初始化rkmedia功能
}

        继续往下说之前,先来了认识几个重要的数据结构。RV1126_VI_CONFIG、RV1126_AI_CONFIG、RV1126_VENC_CONFIG、RV1126_AENC_CONFIG  这是个结构体都是自己封装的,对rv1126的一下api封装了一下都在rkmedia_config_public.h文件里面
        RV1126_VI_CONFIG:

/*** @brief RV1126_VI_CONFIG 结构体定义* * 该结构体用于配置RV1126视频输入(VI)的相关参数。* 包含视频通道的ID和属性配置。*/typedef struct
{unsigned int id;   ///< 视频通道ID,用于标识不同的视频输入通道VI_CHN_ATTR_S attr; ///< 视频通道属性,包含通道的具体配置信息
} RV1126_VI_CONFIG;

        VI_CHN_ATTR_S:在rk1126的开发文档里面


          RV1126_AI_CONFIG: 

/*** @brief RV1126_AI_CONFIG 结构体定义* * 该结构体用于配置RV1126音频输入(AI)的相关参数。* 包含音频通道的ID和属性配置。*/typedef struct
{unsigned int id;   ///< 音频通道ID,用于标识不同的音频输入通道AI_CHN_ATTR_S attr; ///< 音频通道属性,包含通道的具体配置信息
} RV1126_AI_CONFIG;

        AI_CHN_ATTR_S:在rk1126的开发文档里面


         RV1126_VENC_CONFIG:

/*** @brief RV1126_VENC_CONFIG 结构体定义* * 该结构体用于配置RV1126视频编码(VENC)的相关参数。* 包含视频编码通道的ID和属性配置。*/typedef struct
{unsigned int id;   ///< 视频编码通道ID,用于标识不同的视频编码通道VENC_CHN_ATTR_S attr; ///< 视频编码通道属性,包含通道的具体配置信息
} RV1126_VENC_CONFIG;

       VENC_CHN_ATTR_S: 在rk1126的开发文档里面 


        RV1126_AENC_CONFIG: 

/*** @brief RV1126_AENC_CONFIG 结构体定义* * 该结构体用于配置RV1126音频编码(AENC)的相关参数。* 包含音频编码通道的ID和属性配置。*/typedef struct
{unsigned int id;   ///< 音频编码通道ID,用于标识不同的音频编码通道AENC_CHN_ATTR_S attr; ///< 音频编码通道属性,包含通道的具体配置信息
} RV1126_AENC_CONFIG;

         AENC_CHN_ATTR_S:

开始编码: 

        在rkmedia_module_function.cpp(功能模块),还有一部分其他的源码,比如下面容器的一部分代码放在rkmedia_container.cpp (容器管理模块),主要功能是保存 VI 和 AI 初始化的设备节点,供多线程使用。这里就不上传了,不然就会很乱了,感兴趣的可以问我拿整个源码。

int init_rkmedia_module_function()
{int ret;rkmedia_function_init(); //初始化rkmedia功能RV1126_VI_CONFIG rv_vi;memset(&rv_vi, 0, sizeof(rv_vi));//初始化rv_virv_vi.id = 0; //视频通道IDrv_vi.attr.pcVideoNode = COMS_DEVICE_NAME; //video视频节点路径/*VI捕获视频缓冲区计数,默认是3比如说vi和摄像头直接基础没有缓存区,vi模块如果数度跟不上会造成数据的丢失所以加上缓存区的,就可以减轻vi模块的压力,也是类似与一个生产着和消费着模型,主要是摄像头每时每刻都在采集数据不会停的所以加上缓存去,就可以大大保存数据的完整性。至于为啥3,这是工程师的经验*/rv_vi.attr.u32BufCnt = 3; rv_vi.attr.u32Width = 1920;//视频输入的宽度,一般和CMOS摄像头或者外设的宽度一致rv_vi.attr.u32Width = 1080;视频输入的高度,一般和CMOS摄像头或者外设的高度一致rv_vi.attr.enPixFmt = IMAGE_TYPE_NV12; // 图形格式 和vi_chn_attr.enPixFmt保持一样/***  VI_CHN_BUF_TYPE_MMAP和VI_CHN_BUF_TYPE_DMA*  VI_CHN_BUF_TYPE_DMA:vi模块直接和内存打交道,优点:速度快,缺点:如果硬件差的,可能会造成发热,频繁操作加快硬件损坏* I_CHN_BUF_TYPE_MMAP:中间有一个虚拟内存,vi和内存不直接接触,优点:硬件使用时间会长,缺点:有一点点延迟,但是不影响*/rv_vi.attr.enBufType = VI_CHN_BUF_TYPE_MMAP; //视频输入的图像格式,默认是NV12(IMAGE_TYPE_NV12)rv_vi.attr.enWorkMode = VI_WORK_MODE_NORMAL; //VI的工作模式,默认是NORMAL(VI_WORK_MODE_NORMAL)ret = rkmedia_vi_init(&rv_vi);if(ret != 0){printf("vi初始化失败\n");}else{printf("vi 初始化成功\n");/*** 设置容器的目的是为了后面开发,可以轻易拿到 vi的id,直接从容器里面拿*/RV1126_VI_CONTAINER vi_container; //创建出容器vi_container.id = 0;vi_container.vi_id = rv_vi.id;set_vi_container(0, & vi_container); //把vi_id设置到容器里面}}


http://www.ppmy.cn/news/1563860.html

相关文章

react中,使用antd的Upload组件上传zip压缩包文件

需求 使用antd的Upload上传.zip压缩包文件 代码 const [uploadLoaing, setUploadLoaing] useState(false);// 辅助函数&#xff1a;检查文件是否为zip格式function isZipFile(file: File): boolean {const fileType file.type;return fileType application/zip || file.n…

Checkbox 多选框的使用

基础用法 在el-checkbox元素中定义v-model绑定变量&#xff0c;单一的checkbox中&#xff0c;默认绑定变量的值会是Boolean&#xff0c;选中为true 禁用状态 设置disabled属性即可。 多选框组 checkbox-group元素能把多个 checkbox 管理为一组&#xff0c;只需要在 Group …

前端下载图片

可直接看第3条 1、a链接形式&#xff08;不推荐&#xff09; 这种方式可以下载文件&#xff0c;对于图片类&#xff0c;浏览器会直接打开 export function downloadFile(src: string, fileName: string) {const ele document.createElement(a);ele.setAttribute(href, src)…

Keil使用STLink下载烧录闪退解决(使用STLink烧录)

一&#xff1a;问题出现 在使用新版本keil开发STM32的的时候在选择STLink下载&#xff0c;在下载的的时候会进行闪退&#xff0c;点击load会直接退出keil&#xff0c;经过检查发现是STLink驱动出了问题&#xff0c;只需要重新安装驱动即可&#xff0c;具体解决方案如下。 二&am…

Android BitmapShader更简易的实现刮刮乐功能,Kotlin

Android BitmapShader更简易的实现刮刮乐功能&#xff0c;Kotlin 比这种方式 Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果&#xff0c;Kotlin&#xff08;2&#xff09;-CSDN博客 更简单实现刮刮乐效果。 import android.content.Cont…

01、flink的原理和安装部署

flink中主要有两个进程&#xff0c;分别是JobMManager和TaskManager&#xff0c;当然了根据flink的部署和运行环境不同&#xff0c;会有一些不同&#xff0c;但是主要的功能是类似的&#xff0c;下面我会讲下聊下&#xff0c;公司用的多的部署方式&#xff0c;基于yarn集群的部…

HarmonyOS NEXT开发进阶(六):HarmonyOS NEXT实现嵌套 H5 及双向通信

文章目录 一、前言二、鸿蒙应用加载Web页面2.1 加载网络地址页面2.2 加载本地H5页面 三、实现Web组件 H5 层与鸿蒙应用层进行相互通讯3.1 鸿蒙应用向 H5 页面发送数据3.2 H5页面向鸿蒙应用发送数据 四、拓展阅读 一、前言 随着HarmonyOS NEXT的快速发展&#xff0c;越来越多的…

HBase的安装和配置

一、实验目的 1. 理解HBase的基本架构和工作原理。 2. 掌握HBase的安装和配置流程。 3. 学习如何将HBase从单机模式配置为伪分布式模式。 二、实验环境准备 1. JAVA环境准备&#xff1a;确保Java Development Kit (JDK) 已安装并配置好环境变量。 2. Hado…