当前位置: 首页 > 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…...

Vit工程化应用(timm 库)

pip install timm import timm import torch from PIL import Image import requests from io import BytesIO# 1. 加载模型 (ViT Base版本&#xff0c;16x16图块&#xff0c;在ImageNet-1k上预训练) # 设置 pretrainedTrue 自动下载权重 model timm.create_model(vit_base_pa…...

千万级用户购物车系统的架构设计

我们当时搞的购物车服务&#xff0c;其实还是有点庞大的&#xff0c;看似是一个简单的CRUD&#xff0c;但是当你真正去实现一个购物车的时候&#xff0c;发现压根不是那回事。 当商品类型从单一SKU扩展到普通商品、套餐组合、活动商品&#xff0c;拼单等混合的时候&#xff0c;…...

一键获取国家中小学智慧教育平台电子课本:开源解析工具完全指南

一键获取国家中小学智慧教育平台电子课本&#xff1a;开源解析工具完全指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内容。 …...

SatGate-Proxy:开源反向代理与隧道工具部署与实战指南

1. 项目概述与核心价值最近在折腾一些需要跨地域、跨网络环境访问的应用时&#xff0c;遇到了一个老生常谈的痛点&#xff1a;如何稳定、高效地访问那些因为网络策略限制而无法直接触达的服务。这不仅仅是个人用户的需求&#xff0c;很多中小团队在部署混合云、进行远程办公或访…...

Capital许可排队严重?不想买新许可,闲置回收立即可用

我去年在做项目时&#xff0c;客户说他们Capital许可证池天天爆队&#xff0c;新增用户连基本的算力都抢不到。当时我就琢磨&#xff0c;许可证回收这事儿到底有多重要&#xff1f;去年底我带着团队做了一个实验&#xff0c;直接把闲置许可证利用率干到45%&#xff0c;127个许可…...

3分钟快速上手:开源AIOps告警管理平台keep终极实战指南

3分钟快速上手&#xff1a;开源AIOps告警管理平台keep终极实战指南 【免费下载链接】keep The open-source AIOps and alert management platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep 你是否曾经被海量的监控告警淹没&#xff0c;在Prometheus、Gr…...

利用taotoken模型广场为ai应用快速进行模型选型与测试

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用Taotoken模型广场为AI应用快速进行模型选型与测试 在构建一个需要集成多种AI能力的应用时&#xff0c;开发者面临的首要挑战往…...

STM32实战:手把手教你用Cubemx配置交流充电桩的CP信号检测(附代码)

STM32实战&#xff1a;从零构建充电桩CP信号检测系统 充电桩作为新能源汽车基础设施的核心组件&#xff0c;其通信协议的可靠性直接关系到充电安全。在实际工程中&#xff0c;CP&#xff08;Control Pilot&#xff09;信号的检测往往是开发者的第一个技术拦路虎。我曾在一个海外…...

前端实战:用HTML/CSS/JS打造交互式生日蛋糕网页应用

1. 项目概述&#xff1a;一个用代码烘焙的生日惊喜最近给朋友准备生日礼物&#xff0c;不想再走寻常路&#xff0c;琢磨着送点特别的。作为一个整天和代码打交道的人&#xff0c;我决定用最熟悉的工具——HTML、CSS和JavaScript——亲手“烘焙”一个数字生日蛋糕。这个项目“Re…...

用STM32+NRF24L01模拟蓝牙广播,手机能搜到设备了!附完整代码

用STM32NRF24L01模拟蓝牙低功耗广播的实战指南 当我在实验室里第一次看到手机蓝牙搜索列表中出现自己用NRF24L01模块模拟的设备名称时&#xff0c;那种成就感至今难忘。这个看似简单的实验背后&#xff0c;其实隐藏着无线通信协议栈的巧妙设计。本文将带你从零开始&#xff0c;…...