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

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模块重要参数

成员名称描述
pcVideoNodevideo节点路径
u32Widthvideo宽度
u32Heightvideo高度
enPixFmtvideo格式
u32BufCntvi捕捉视频缓冲区计数
enBufTypevi缓冲区类型
enWorkModevi通道工作模式
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 轻量级字符串视图

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

Linux内核-内核模块内核参数

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

中电信翼康工程师:我在 Apache SeaTunnel 社区的贡献之旅

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

【ESP32S3】VSCode 开发环境搭建

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

大模型,多模态大模型面试问题基础记录24/10/24

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

使用TimeShift备份和恢复Ubuntu Linux

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

win7现在还能用吗_哪些配置的电脑还可以安装win7系统

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

基于GPT的智能客服落地实践

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

Sourcetree和GitLab的结合使用

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

双十一开启极速达夜派;黑神话获泰国年度最佳游戏;AI 模型可帮助识别 17000 多种疾病的候选药物....| 网易数智日报

双 11 菜鸟在北京、上海、广州、杭州等城市开启「预售极速达夜派」服务 10 月 21 日&#xff0c;菜鸟在北京、上海、广州、杭州等城市开启「预售极速达夜派」服务&#xff0c;批量大促包裹实现小时级送达。 据介绍&#xff0c;在消费者支付尾款前&#xff0c;菜鸟供应链就已经…...

深入理解JAVA虚拟机(一)

介绍JAVA虚拟机的运行时数据区域 按照物理结构来划分&#xff1a;java虚拟机主要由以下几部分构成栈、堆和程序计数器&#xff0c;其中栈又可以分为虚拟机栈VM stack 和 本地方法栈 Native Method Statck&#xff0c;堆可以划分方法区和普通的堆内存。按照逻辑划分线程私有空间…...

从Excel文件中读取数据

笔记 import openpyxl # 打开工作簿 workbookopenpyxl.load_workbook(景区天气.xlsx) # 选择要操作的工作表 sheetworkbook[景区天气] # 表格数据是二维列表&#xff0c;先遍历的是行&#xff0c;后遍历的是列 lst[] # 存储的是行数据 for row in sheet.rows:sublst[] # 存储单…...

深入剖析MySQL的索引机制及其选型

在数据库管理系统中&#xff0c;索引是一种重要的优化工具&#xff0c;用于加速数据的检索和查询处理。在MySQL中&#xff0c;合理使用索引可以显著提高数据库的性能。本文将深入探讨MySQL的索引机制&#xff0c;包括不同类型索引的优势、劣势及在实际使用中的选型策略。 1. 什…...

校园表白墙源码修复版

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

Android 内存优化——常见内存泄露及优化方案

看到了一篇关于内存泄漏的文章后&#xff0c;就想着分享给大家&#xff0c;最后一起学习&#xff0c;一起进步&#xff1a; 如果一个无用对象&#xff08;不需要再使用的对象&#xff09;仍然被其他对象持有引用&#xff0c;造成该对象无法被系统回收&#xff0c;以致该对象在…...

Qt6.7.2中使用OpenSSL的坑

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

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设备&#xff0c;这里以FPR1010设备为例&#xff0c;那么什么事Firepower、FDM呢&#xff1f;在开始之前&#xff0c;进行简单的介绍。 Firepower&#xff1a;思科 Firepower 是网络安全和流量管理产品的集成套件&…...

使用 Kibana 将地理空间数据导入 Elasticsearch 以供 ES|QL 使用

作者&#xff1a;来自 Elastic Craig Taverner 如何使用 Kibana 和 csv 采集处理器将地理空间数据采集到 Elasticsearch 中&#xff0c;以便在 Elasticsearch 查询语言 (ES|QL) 中进行搜索。Elasticsearch 具有强大的地理空间搜索功能&#xff0c;现在 ES|QL 也具备这些功能&am…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...