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

 视频编码的流程:   

        本章节讲的是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.rhkb.cn/news/1745.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SimpleFOC01|基于STM32F103+CubeMX,移植核心的common代码

导言 如上图所示&#xff0c;进入SimpleFOC官网&#xff0c;点击Github下载源代码。 如上图所示&#xff0c;找到仓库。 comom代码的移植后&#xff0c;simpleFOC的移植算是完成一大半。simpleFOC源码分为如下5个部分&#xff0c;其中communication是跟simpleFOC上位机通讯&a…

【2025最新】机器学习类计算机毕设选题80套,适合大数据,人工智能

【2025最新】机器学习类型计算机毕设选题 1-10套 基于Spring Boot的物流管理系统的设计与实现 基于机器学习的虚假招聘信息的分析与预测 基于机器学习的影响数据科学家职业变动因素的分析与预测 基于Spring Boot的历史文物交流平台的设计与实现 基于机器学习的肥胖影响因素的分…

金融项目实战 02|接口测试分析、设计以及实现

目录 ⼀、接口相关理论 二、接口测试 1、待测接口&#xff1a;投资业务 2、接口测试流程 3、设计用例理论 1️⃣设计方法 2️⃣工具 4、测试点提取 5、测试用例&#xff08;只涉及了必测的&#xff09; 1️⃣注册图⽚验证码、注册短信验证码 2️⃣注册 3️⃣登录 …

C++:string

一、string概念 之前介绍过通过字符数组保存字符串&#xff0c;然后对字符数组中的字符串做各种操作&#xff1b;为了更加简单方便&#xff0c;在C中&#xff0c;又增加了 string 来处理字符串。 char str[20] "hello world"; string 字符串其实是一种更加高级的封…

STORM:从多时间点2D图像中快速重建动态3D场景的技术突破

随着计算机视觉和机器学习技术的迅猛发展,我们已经能够利用AI来解决许多复杂的问题。然而,在处理大规模室外动态3D场景重建时,现有的方法往往面临着诸多挑战,如需要大量人工标注数据、处理速度慢以及难以准确捕捉移动物体等。为了解决这些问题,研究者们开发了STORM(Spati…

C#使用OpenTK绘制3D可拖动旋转图形三棱锥

接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…

Vue2+OpenLayers使用Overlay实现点击获取当前经纬度信息(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 关键参数&#xff1a; 实现思路&#xff1a; 核心代码&#xff1a; 完整代码&#xff1a; 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 覆盖物&#xff08;Overlay&#xf…

浅谈云计算12 | KVM虚拟化技术

KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具&#xff08;QEMU、Libvirt等&#xff09; 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…

【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)

一、问题描述 题目描述 均衡串定义&#xff1a;字符串中只包含两种字符&#xff0c;且这两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定&#xff1a;字符串中只包含大写的 X 和 Y 两种字符。 输入描述 输入一个均衡串…

【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录前言 &#x1f343;一、实体对象更新1.1 单条与批量1.2 不更新某列1.3 只更新某列1.4 NULL列不更新1.5 无主键/指定列…

项目概述、开发环境搭建(day01)

软件开发整体介绍 软件开发流程 第1阶段: 需求分析 需求规格说明书&#xff0c; 一般来说就是使用 Word 文档来描述当前项目的各个组成部分&#xff0c;如&#xff1a;系统定义、应用环境、功能规格、性能需求等&#xff0c;都会在文档中描述。产品原型&#xff0c;一般是通过…

数据仓库基础常见面试题

1.数据仓库是什么 ‌数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的、集成的、非易失的、随时间变化的数据集合&#xff0c;用于支持企业的管理决策‌。它不同于传统的操作型数据库&#xff0c;后者主要用于处理日常业务交易和实时查询&#xff0c;而数据仓库…

shell脚本回顾1

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 一、 ll /tmp/size.log &>/dev/null if [ $? -eq 0 ];then cat /tmp/size.log else touch /tmp/size.log echo date > /tmp/size.log fi二、 if …

【C++】PP5015 [NOIP2018 普及组] 标题统计

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示数据规模与约定 &#x1f4af;方法分析方法1&#xff1a;我的做法实…

【C++第三方库】快速上手---轻量级数据库SQLite和单元测试工具Gtest

每日激励&#xff0c;“驾驭命运的舵是奋斗。不抱有幻想&#xff0c;不放弃一点机会&#xff0c;不停止一日努力。” 绪论​&#xff1a; 本篇文章将写道如何快速的上手Gtest和SQLite第三方库&#xff0c;这两个第三方库都是在项目编写过程中非常重要的。 —————— 话不多说…

《机器学习》——贝叶斯算法

贝叶斯简介 贝叶斯公式&#xff0c;又称贝叶斯定理、贝叶斯法则&#xff0c;最初是用来描述两个事件的条件概率间的关系的公式&#xff0c;后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是&#xff0c;支持某项属性的事件发生得愈多&#xff0c;则该属性成…

优先级队列(算法十四)

简介 优先级队列其实就是堆 默认大根堆 小根堆&#xff1a;greater<T> std::priority_queue<int, std::vector<int>, std::greater<int>> pq; priority_queue 没有迭代器&#xff0c; 不能for&#xff08;auto e:pq); 不改变原来pq&#xff0c;查…

【day5】Redis持久化之AOF + Redis事务_锁机制

AOF是什么 以日志的形式来记录每个写操作(增量保存)&#xff0c;将 Redis 执行过的所有写指令记录下来(比 如 set/del 操作会记录, 读操作 get 不记录 只许追加文件但不可以改写文件 redis 启动之初会读取该文件重新构建数据 redis 重启的话就根据日志文件的内容将写指令从前到…

C#补充----反射,特性,迭代器,特殊语法,值类型运用类型。

1.反射。 《1》获取类的方式 《2》反射的应用 <1>获取类型的所有公共成员 <2>获取构造函数 <3>获取类型的 公共成员变量 <4>获取类型的 公共方法 <5>.获取类型的 属性 <6>.公共接口&#xff0c;公共枚举&#xff0c;公共事件

MyBatis——XML映射文件

在MyBatis中&#xff0c;既可以通过注解的方式配置SQL语句&#xff0c;也可以通过XML映射文件的方式配置SQL语句。对于简单的SQL语句建议直接通过注解的方式配置SQL语句&#xff1a; Delete("delete from user where id#{id}") Integer deleteById(Integer id);但是…