RV1126音视频学习(二)-----VI模块
文章目录
- 前言
- 2.RV1126的视频输入vi模块
- 2.1什么是VI模块
- 2.3RV1126VI模块主要API
- RK_MPI_SYS_Init()
- RK_MPI_VI_SetChnAttr
- RK_MPI_VI_EnableChn
- RK_S32 RK_MPI_VI_DisableChn
- RK_MPI_VI_StartStream
- RK_MPI_SYS_GetMediaBuffer
- RK_MPI_MB_GetPtr
- RK_MPI_MB_GetSize
- RK_MPI_MB_ReleaseBuffer
- 练习
前言
本文旨在记录并复习自身所学知识,如有错误请评论区指出,图片及知识点来源于网络,如有侵权请联系删除~
2.RV1126的视频输入vi模块
V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写
2.1什么是VI模块
RV1126的VI模块指的是视频输入模块,它的作用是读取sensor的数据。VI模块底层就是对V4L2驱动架构接口的一系列的封装,它本质上还是依赖Linux底层的V4L2驱动架构并向应用层提供对应的设备文件节点,比方说(/dev/video*)*。而 VI模块可以通过操作类似于/dev/video这样的设备节点来读取摄像头数据。
2.2RV1126的VI模块重要参数
成员名称 | 描述 |
---|---|
pcVideoNode | video节点路径 |
u32Width | video宽度 |
u32Height | video高度 |
enPixFmt | video格式 |
u32BufCnt | vi捕捉视频缓冲区计数 |
enBufType | vi缓冲区类型 |
enWorkMode | vi通道工作模式 |
2.3RV1126VI模块主要API
RK_MPI_SYS_Init()
RK_S32 RK_MPI_SYS_Init(void);
功能用于初始化RKMedia系统,必须在使用其他RKMedia函数之前调用
头文件rkmedia_api.h
库文件libeasymedia.so
返回值成功 0失败 错误码
RK_MPI_VI_SetChnAttr
RK_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn, const VI_CHN_ATTR_S *pstChnAttr);
功能用于设置VI(视频采集)通道的属性,包括分辨率、帧率、像素格式等
头文件rkmedia_api.h
库文件libeasymedia.so
参数ViPipe VI 管道号。 一般写0ViChn VI 通道号。取值范围:[0, VI_MAX_CHN_NUM)] 一般写0pstChnAttr VI 通道属性结构体指针
返回值成功 0失败 错误码
typedef struct rkVI_CHN_ATTR_S
{const RK_CHAR *pcVideoNode;摄像头的节点 rkispp_sicale0详情见数据手册RK_U32 u32Width;视频的宽与摄像头的参数一致RK_U32 u32Height;视频的高与摄像头的参数一致 IMAGE_TYPE_E enPixFmt; 采集的视频的格式RK_U32 u32BufCnt; // VI capture video buffer cnt.缓冲帧的大小 3-5// VI capture video buffer type.VI_CHN_BUF_TYPE enBufType; 视频数据的存储方式 DMA(直接访问)/内存映射VI_CHN_WORK_MODE enWorkMode; 工作模式
} VI_CHN_ATTR_S;
RK_MPI_VI_EnableChn
RK_S32 RK_MPI_VI_EnableChn(VI_PIPE ViPipe, VI_CHN ViChn);
功能用于使能VI通道,启动视频采集
头文件rkmedia_api.h
库文件:libeasymedia.so
参数ViPipe VI 管道号ViChn VI 通道号。取值范围:[0, VI_MAX_CHN_NUM]
返回值成功 0失败 错误码
RK_S32 RK_MPI_VI_DisableChn
功能用于失能VI通道,关闭视频采集
头文件rkmedia_api.h
库文件:libeasymedia.so
参数ViPipe VI 管道号ViChn VI 通道号。取值范围:[0, VI_MAX_CHN_NUM]
返回值成功 0失败 错误码
RK_MPI_VI_StartStream
RK_S32 RK_MPI_VI_StartStream(VI_PIPE ViPipe, VI_CHN ViChn);
功能用于启动视频流
头文件rkmedia_api.h
库文件:libeasymedia.so
参数ViPipe VI 管道号ViChn VI 通道号。取值范围:[0, VI_MAX_CHN_NUM]
返回值成功 0失败 错误码
RK_MPI_SYS_GetMediaBuffer
MEDIA_BUFFER RK_MPI_SYS_GetMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, RK_S32 s32MilliSec);
功能用于从指定通道中获取数据
头文件rkmedia_api.h
库文件:libeasymedia.so
参数enModID 模块号s32ChnID 通道号s32MilliSec -1:阻塞,>=0:阻塞等待时间。
返回值成功 0失败 错误码
注意该接口会自动触发RK_MPI_SYS_StartGetMediaBuffer
返回值类型:typedef void *MEDIA_BUFFER;//数据缓冲区指针
RK_MPI_MB_GetPtr
void *RK_MPI_MB_GetPtr(MEDIA_BUFFER mb);
功能用于从指定的MEDIA_BUFFER中获取缓冲区数据指针。
头文件rkmedia_api.h
库文件:libeasymedia.so
参数mb 缓冲区指针
返回值成功 0失败 错误码
RK_MPI_MB_GetSize
size_t RK_MPI_MB_GetSize(MEDIA_BUFFER mb);
功能用于从指定的MEDIA_BUFFER中获取缓冲区数据大小。
头文件rkmedia_api.h
库文件:libeasymedia.so
参数mb 缓冲区指针
返回值成功 0失败 错误码
RK_MPI_MB_ReleaseBuffer
RK_S32 RK_MPI_MB_ReleaseBuffer(MEDIA_BUFFER mb);
功能用于释放缓冲区。
头文件rkmedia_api.h
库文件:libeasymedia.so
参数mb 缓冲区指针
返回值成功 0失败 错误码
练习
用采集一段YUV数据并播放出来
#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 "rkmedia_api.h"#define CAMERA_PATH "rkispp_scale0"
#define PIPE_ID 0
#define CHN_ID 0static bool quit = false;
// 读取信号ctrl+c结束程序
void sigint_handler(int signum)
{printf("program quit...\n");quit = true;
}
void *get_camera_vi_thread(void *arg)
{// 定义一个缓存指针用于指向存储VI数据的区域MEDIA_BUFFER mb = NULL;// 打开/创建一个存储视频流数据的文件FILE *nv12_file = fopen("test_camera.nv12", "w+");while (!quit){// 获取VI模块通道0的Media_BUFFERmb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI, CHN_ID, -1);if (!mb){printf("get Media break...\n");break;}printf("get Media success...\n");// 向存储YUV数据的文件中写入读到的数据fwrite(RK_MPI_MB_GetPtr(mb), 1, RK_MPI_MB_GetSize(mb), nv12_file);RK_MPI_MB_ReleaseBuffer(mb); // 回收资源}return NULL;
}int main(int argc, char *argv[])
{signal(SIGINT, sigint_handler);int ret;// 初始化VI通道属性结构体VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = CAMERA_PATH;vi_chn_attr.u32Width = 1920;vi_chn_attr.u32Height = 1080;vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;vi_chn_attr.u32BufCnt = 3;vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP;vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;// 设置VI通道属性ret = RK_MPI_VI_SetChnAttr(PIPE_ID, CHN_ID, &vi_chn_attr);if (ret){printf("Create channel faile...\n");return -1;}printf("Create channel success...\n");// 使能通道0ret = RK_MPI_VI_EnableChn(PIPE_ID, CHN_ID);if (ret){printf("Enable channel faile...\n");return -1;}printf("Enable channel success...\n");// 启动VI模块视频流ret = RK_MPI_VI_StartStream(PIPE_ID, CHN_ID);if (ret){printf("Start VI stream fail...\n");return -1;}else{printf("Start VI stream success...\n");}// 创建多线程获取VI采集到的YUV数据pthread_t tid;pthread_create(&tid, NULL, get_camera_vi_thread, NULL);// 阻塞等待采集结束while (!quit){sleep(1);}// 回收线程资源pthread_join(tid, NULL);// 关闭通道RK_MPI_VI_DisableChn(0, 0);return 0;
}
相关文章:

RV1126音视频学习(二)-----VI模块
文章目录 前言2.RV1126的视频输入vi模块2.1什么是VI模块2.3RV1126VI模块主要APIRK_MPI_SYS_Init()RK_MPI_VI_SetChnAttrRK_MPI_VI_EnableChnRK_S32 RK_MPI_VI_DisableChnRK_MPI_VI_StartStreamRK_MPI_SYS_GetMediaBufferRK_MPI_MB_GetPtrRK_MPI_MB_GetSizeRK_MPI_MB_ReleaseBuf…...

「C/C++」C++17 之 std::string_view 轻量级字符串视图
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

Linux内核-内核模块内核参数
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们的Linux进阶部分,到目前为止,已经讲过:硬件,日常运维,基础软…...

中电信翼康工程师:我在 Apache SeaTunnel 社区的贡献之旅
贡献者Github ID:luckyLJY 文章整理:曾辉 Apache SeaTunnel 作为一款强大的数据同步和转换工具,凭借其部署易用性、容错机制、数据源支持、性能优势、功能丰富性以及活跃的社区支持,成为了数据工程师们不可或缺的利器。 因其具有的…...

【ESP32S3】VSCode 开发环境搭建
ESP32S3 有多种开发方式,主流的有 Eclipse 和 VSCode 两种。本文来介绍一下基于 VSCode 的开发环境搭建。 VSCode 环境需要依赖于 ESP-IDF 插件,因此需要在 VSCode 插件市场中搜索并安装 ESP-IDF 插件: 安装完成后侧边栏会多出一个 ESP-IDF …...

大模型,多模态大模型面试问题基础记录24/10/24
大模型,多模态大模型面试问题基础记录24/10/24 问题一:LoRA是用在节省资源的场景下,那么LoRA具体是节省了内存带宽还是显存呢?问题二:假如用pytorch完成一个分类任务,那么具体的流程是怎么样的?…...

使用TimeShift备份和恢复Ubuntu Linux
您是否曾经想过如何备份和恢复您的Ubuntu或Debian系统?TimeShift是一个强大的备份和还原工具。TimeShift允许您创建系统快照,提供了一种在出现意外问题或系统故障时恢复到先前状态的简便方式。您可以使用RSYNC或BTRFS创建快照。 有了这个介绍࿰…...

win7现在还能用吗_哪些配置的电脑还可以安装win7系统
2024年了都,win7现在还能用吗?答案是肯定的。那么哪些配置的电脑还可以安装win7系统呢?下面就针对这两个问题详细分区。 win7现在还能用吗? Windows 7系统虽然已经停止官方支持,但仍然可以使用。以下是关于Windows 7系…...

基于GPT的智能客服落地实践
📍前言 在日常生活中,「客服」这个角色几乎贯穿着我们生活的方方面面。比如,淘宝买东西时,需要客服帮你解答疑惑。快递丢失时,需要客服帮忙找回。报名参加培训课程时,需要客服帮忙解答更适合的课程…… 基…...

Sourcetree和GitLab的结合使用
一、写在前面 为什么是Sourcetree和GitLab?因为遇到的坑最少,在不用梯子的情况下,推送速度还可以。 这篇文章主要介绍的是,怎么把自己写的代码文件打包放到GitLab上去,方便别人下载使用,也方便自己在另一…...

双十一开启极速达夜派;黑神话获泰国年度最佳游戏;AI 模型可帮助识别 17000 多种疾病的候选药物....| 网易数智日报
双 11 菜鸟在北京、上海、广州、杭州等城市开启「预售极速达夜派」服务 10 月 21 日,菜鸟在北京、上海、广州、杭州等城市开启「预售极速达夜派」服务,批量大促包裹实现小时级送达。 据介绍,在消费者支付尾款前,菜鸟供应链就已经…...

深入理解JAVA虚拟机(一)
介绍JAVA虚拟机的运行时数据区域 按照物理结构来划分:java虚拟机主要由以下几部分构成栈、堆和程序计数器,其中栈又可以分为虚拟机栈VM stack 和 本地方法栈 Native Method Statck,堆可以划分方法区和普通的堆内存。按照逻辑划分线程私有空间…...
从Excel文件中读取数据
笔记 import openpyxl # 打开工作簿 workbookopenpyxl.load_workbook(景区天气.xlsx) # 选择要操作的工作表 sheetworkbook[景区天气] # 表格数据是二维列表,先遍历的是行,后遍历的是列 lst[] # 存储的是行数据 for row in sheet.rows:sublst[] # 存储单…...
深入剖析MySQL的索引机制及其选型
在数据库管理系统中,索引是一种重要的优化工具,用于加速数据的检索和查询处理。在MySQL中,合理使用索引可以显著提高数据库的性能。本文将深入探讨MySQL的索引机制,包括不同类型索引的优势、劣势及在实际使用中的选型策略。 1. 什…...

校园表白墙源码修复版
此校园表白墙源码基于thinkphp,因为时代久远有不少bug,经本人修复已去除大部分bug,添加了美化元素。 https://pan.quark.cn/s/1f9b3564c84b https://pan.baidu.com/s/1bb9vu9VV2jJoo9-GF6W3xw?pwd7293 https://caiyun.139.com/m/i?2hoTc…...

Android 内存优化——常见内存泄露及优化方案
看到了一篇关于内存泄漏的文章后,就想着分享给大家,最后一起学习,一起进步: 如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回收,以致该对象在…...

Qt6.7.2中使用OpenSSL的坑
最近编写Qt Quick项目,使用Qt6.7.2版本,CMAKE编译,开始QtCreator运行代码都没有问题,访问https也正常,但打出安装包后一试,发现https访问不了,尴尬!! 查看了相关日志发现…...

Mybatis-08.基础操作-删除
一.删除 接口方法 package com.gjw.mapper;import com.gjw.pojo.Emp; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper;import java.util.List;Mapper public interface EmpMapper {// 根据ID删除数据Delete("delete from e…...

通过FDM升级Firepower
1.基本说明 本文主要主要介绍如何通过FDM来升级Firepower设备,这里以FPR1010设备为例,那么什么事Firepower、FDM呢?在开始之前,进行简单的介绍。 Firepower:思科 Firepower 是网络安全和流量管理产品的集成套件&…...

使用 Kibana 将地理空间数据导入 Elasticsearch 以供 ES|QL 使用
作者:来自 Elastic Craig Taverner 如何使用 Kibana 和 csv 采集处理器将地理空间数据采集到 Elasticsearch 中,以便在 Elasticsearch 查询语言 (ES|QL) 中进行搜索。Elasticsearch 具有强大的地理空间搜索功能,现在 ES|QL 也具备这些功能&am…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...

云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...