VI视频输入模块学习

作者:浅笑离愁1234日期:2025/11/24

文章目录

  • 1.RV1126的视频输入vi模块
    • 1.1什么是VI模块
    • 1.2RV1126的VI模块重要参数
  • 2.RV1126的VI模块初始化API
    • 2.1RK_MPI_VI_SetChnAttr讲解:

1.RV1126的视频输入vi模块

V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写

1.1什么是VI模块

RV1126的VI模块指的是视频输入模块,它的作用是读取sensor的数据。VI模块底层就是对V4L2驱动架构接口的一系列的封装,它本质上还是依赖Linux底层的V4L2驱动架构并向应用层提供对应的设备文件节点,比方(/dev/video*)_。而 VI模块可以通过操作类似于/dev/video_这样的设备节点来读取摄像头数据。

1.2RV1126的VI模块重要参数

​ 视频节点:

注意:从上面的截图我们可以看到。在RV1126里面,视频节点一般以rkispp_开头的,它一般映射到/dev/video的某个设备节点。一般情况下,我们都是用rkispp_scale0作为开发的视频节点。

u32Width:视频输入的宽度,一般和CMOS摄像头或者外设的宽度一致。

u32Height:视频输入的高度,一般和CMOS摄像头或者外设的高度一致。

enPixFmt:视频输入的图像格式,默认是NV12(IMAGE_TYPE_NV12)

u32BufCnt:VI捕获视频缓冲区计数,默认是3,下图是缓冲区计数的图解

VI_CHN_BUF_TYPE:VI捕捉视频的类型,这里面有两种。一种是DMA模式(VI_CHN_BUF_TYPE_DMA)、另外一

种是MMAP模式(VI_CHN_BUF_TYPE_MMAP)

  • DMA指的是直接访问内存的方式,相当于音视频数据直接从硬件传输到内存里面。这种方式的优点就是两边传输的速度非常之快,但缺点就是非常消耗硬件资源,对硬件外设资源要求较高。具体的原理如下图所示:

MMAP指的是内存映射,这种方式就是把硬件外设、磁盘的文件映射到虚拟内存上面。然后用户只需要对虚拟内存进行读写操作就可以对硬件外设进行操作了。这种方法的优点是用户不需要直接操作硬件就能够修改硬件的内容,换言之就是对硬件的消耗没那么大。但是缺点就是:第一,它的读写速度相对DMA来说没那么快;第二,有时候硬件写到虚拟内存的数据可能会出现丢失情况,导致数据出现丢失的情况。

2.RV1126的VI模块初始化API

上面已经把VI模块的参数详细介绍了一遍,下面我们重点讲解VI模块的初始化和使能API。

2.1RK_MPI_VI_SetChnAttr讲解:

RK_MPI_VI_SetChnAttr主要功能就是设置VI通道属性,这里面要传入三个参数:ViPipe(管道号)、ViChn(通道号)、

VI_CHN_ATTR_S结构体指针。

-ViPipe:VI管道号,在RV1126中输入的图像数据会通过管道pipe进行存储。换言之设备sensor和pipe之间有可能是一对一或者一对多的关系,而在RV1126中VI管道号对应sensor的数量,VI管道默认从0开始。比方说一个双目摄像头,分别是camera0camera1。camera0对应的管道号是pipe0,camera1对应的管道号是pipe1。

ViChn:**Vi通道号,指的是一个Vi管道里面,有多少个通道能用(但前提是ViChn没有被占用,若被占用则此通道无法被使用)。通常来说Vi通道号和管道号的数值是相同的。在RV1126中管道号和通道号共同决定某个摄像头的某个摄像头数据,下图是ViPipe和ViChn的关系:

从图片可以看到,每个Camera的Vipipe最多对应8个通道数(ViChn),MAX_CHN的值是8。

VI_CHN_ATTR_S:第三个参数就是VI_CHN_ATTR_S的结构体指针。前面讲过的vi模块重要参数。


VI视频输入模块学习》 是转载文章,点击查看原文


相关推荐


Redis_16_哨兵
寻梦缘62025/11/23

在我们上篇文章讲的主从复制模式下,主节点一旦挂了,就需要人工进行主从切换,并且需要将新的主节点通知给客户端。这会大大影响系统的可用性,毕竟靠人工修复这个事情是很不靠谱的,先不说要耗费大量的时间;还有可能配置错误,导致出现问题。 哨兵机制就是通过自动化的手段来解决主节点挂了的问题~~ 基本概念 哨兵进程是通过独立的进程来体现的,和之前redis-server是不同的进程!!redis-sentinel不负责存储数据,只是对redis-server起到监控的效果。而且这里的哨兵节点,也会搞一个


「干货长文」强化学习完全指南:从基础MDP到TRPO/PPO/GRPO算法演进
智见AGI2025/11/21

随着 gpt-o1出现以及 DeepSeek-R1 的技术开源,强化学习从以谷歌 DeepMind 团队为主的游戏领域,以及与传统控制相结合的具身智能机器人领域,走上了LLM甚至多模态的行业赛道。通过复杂任务拆解和奖励为导向的迭代训练大幅提升了大模型解决复杂问题能力,泛化性以及动态调整能力。Reinforce Learning 带领 LLM 步入 2.0 时代,继 PPO 之后,最近关于梯度优化(Policy Optimization)算法的创新也是层出不穷,GRPO,DAPO,CISPO 等


TypeScript 简史:它是怎么拯救我的烂代码的
也无风雨也雾晴2025/11/19

看烂代码的场景 接手老旧 JavaScript 项目的时候,盯着屏幕上的一行代码发呆,这种绝望你一定体会过: JavaScript function process(data) { return data.value + 10; // 此时 data 是 undefined,程序崩了 } 看着这个 data,我满脑子都是问号: 它是对象还是数字? 到底是谁传进来的? 我要是改了它,会不会导致隔壁模块的页面挂掉? 为什么明明是字符串 '10',结果拼成了 '1010'? 这时候我就在


从Docker到宝塔:Magento2 2.3.5 安装全流程踩坑与成功实践
Linux运维技术栈2025/11/18

前言:Magento2 作为 Adobe 旗下的企业级开源电商平台,凭借强大的扩展性、多语言支持和精细化运营功能,成为全球众多电商企业的首选。但它的安装配置门槛较高,尤其对新手而言,环境兼容、依赖管理、静态资源部署等环节极易踩坑——我就曾因盲目尝试 Docker 容器部署,遭遇了版本冲突、权限隔离、内存溢出等一系列问题,耗费大量时间仍未成功。 后来转向操作更直观的宝塔面板,在反复调试中解决了 Composer 1.x 降级、内存限制解除、静态文件 404、CSS/JS 缺失等核心痛点,最终摸索出


Python 的内置函数 set
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 set Python 的内置函数 set() 是一个非常有用的数据结构,用于创建无序且不包含重复元素的集合。它提供了高效的成员检测和元素去重功能,是处理集合运算的理想选择。 基本用法 创建集合: # 使用花括号 fruits = {'apple', 'banana', 'orange'} # 使用set()函数 numbers = set([1, 2, 3, 2, 1]) # 结果为{1, 2, 3} 空集合创建: emp


Python 的内置函数 ord
IMPYLH2025/11/16

Python 内建函数列表 > Python 的内置函数 ord Python 的内置函数 ord() 是一个非常有用的字符串处理函数,它主要用于获取单个字符的 Unicode 码点值。具体来说,ord() 函数接受一个长度为 1 的字符串(即单个字符)作为参数,并返回该字符对应的 Unicode 码点的整数数值。 语法格式: ord(c) 其中 c 是一个表示单个字符的字符串。 主要特点: 只能处理单个字符,如果传入字符串长度超过1会抛出 TypeError对 ASCII 字符返


Redis(125)Redis在社交网络中的应用有哪些?
Victor3562025/11/15

在社交网络中,Redis 被广泛应用于以下场景: 用户会话管理 好友关系存储 消息队列 活动流 点赞和评论统计 排行榜 下面详细介绍这些应用场景,并结合 Java 代码示例进行讲解。 1. 用户会话管理 Redis 可以用于管理用户会话,通过 Redis 的高效性和持久化机制,能够快速读取和写入会话数据。 示例代码 import redis.clients.jedis.Jedis; public class SessionManagementExample { public sta


OkHttp网络框架设计
杨充2025/11/13

OkHttp网络框架设计 目录介绍 01.整体概述介绍 1.1 概述介绍 1.2 核心特性说明 1.3 技术架构概览 1.4 问题思考 02.核心架构设计 2.1 整体架构设计 2.2 整体设计思路 2.3 核心组件关系图 03.核心组件详解 3.1 OkHttpClient 3.2 Request请求封装 3.3 Call请求执行接口 3.4 Dispatcher调度器 3.5 拦截器机制 3.6 Response返回 04.核心流程分析 4.1 请求执行流程 4.2 连


PyTorch:AI深度学习开源框架
深圳蔓延科技2025/11/12

如果把构建一个AI模型比作搭建一个复杂的乐高城堡,那么 PyTorch 就是一个为你提供了各种基础积木,并且让你能非常自由、顺手地去拼接它们的工具箱。 它不像一些已经搭好的成品玩具(比如一些封装好的软件),你只能看不能改。PyTorch 的魅力在于它的 “动态” 和 “直观”。 1. 核心概念一:张量 - 其实就是“数据容器” 你可能听过一个词叫 “张量”(Tensor)。听起来很高深,但其实它就是 PyTorch 里最基本的数据容器。 你可以这样理解: 标量(一个数):就是一个零维张量。比如


Kotlin泛型位置规律与设计考量
风冷2025/11/10

Kotlin泛型位置规律与设计考量 1. 泛型出现的位置分类 在Kotlin中,泛型可以出现在以下几个主要位置: 1.1 类声明中的泛型 class ViewRef<T : DeclarativeBaseView<*, *>>( val pagerId: String, val nativeRef: Int ) { val view: T? get() = PagerManager.getPager(pagerId) .getVie

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读