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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457202.html

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

相关文章

【NOIP提高组】加分二叉树

【NOIP提高组】加分二叉树 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 设一个n个节点的二叉树tree的中序遍历为&#xff08;l,2,3,…,n&#xff09;&#xff0c;其中数字1,2,3,…,n为节点编号。每个节点都有一个分数&#xff08;均为正整…

读《认知觉醒》:浅谈费曼技巧

最近在阅读《认知觉醒》这本书&#xff0c;封面如下&#xff1a; 读到了里面对于费曼技巧的介绍&#xff08;在第八章&#xff09;&#xff0c;感觉受到了一些启发&#xff0c;在这里分享给大家。 其实之前很早就接触过了费曼技巧&#xff0c;但是并没有很好的应用起来&#x…

零代码快速开发智能体 |甘肃旅游通

零代码快速开发智能体 &#xff5c;甘肃旅游通 本文仅用于文心智能体的活动征文 参与人&#xff1a;mengbei_admin 文心智能体平台是人工智能领域的佼佼者。它拥有强大的语言理解与生成能力&#xff0c;能精准回应各种问题&#xff0c;出色完成文本创作、知识问答和翻译等任…

线性表之双向链表

链表花里胡哨&#xff0c;一应俱全 前言 在这之前&#xff0c;我们已经学习了单链表。我们发现这些链表都是一个接一个朝一个方向接下去&#xff0c;有时&#xff0c;我们想要查找某个结点的时候还得从头开始遍历查找&#xff0c;尽管我们已经学习了顺序表&#xff0c;查找某个…

免费PDF页面提取小工具

下载地址 https://download.csdn.net/download/woshichenpi/89922797 使用说明&#xff1a;PDF页面提取工具 1. 启动应用程序 双击程序的启动图标或者通过命令行运行程序。 2. 选择PDF文件 在应用程序窗口中找到“选择PDF”按钮并点击它。在弹出的文件选择对话框中&#x…

Windows server 2003服务器的安装

Windows server 2003服务器的安装 安装前的准备&#xff1a; 1.镜像SN序列号 图1-1 Windows server 2003的安装包非常人性化 2.指定一个安装位置 图1-2 选择好安装位置 3.启动虚拟机打开安装向导 图1-3 打开VMware17安装向导 图1-4 给虚拟光驱插入光盘镜像 图1-5 输入SN并…

Linux系统安装Redis详细操作步骤(二进制发布包安装方式)

安装方式介绍 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照redhat的包管理规范进…

Redis 集群 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 集群 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 集群 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 集群…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…

Java--反射机制

前言&#xff1a; 反射与之前的知识的区别 1.面向对象中创建对象&#xff0c;调用指定结构(属性、方法)等功能&#xff0c;可以不使用反射&#xff0c;也可以使用反射。请问有什么区别? 不使用反射&#xff0c;我们需要考虑封装性。比如:出了自定义类之后&#xff0c;就不能…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

电池的主被动均衡

只有串联的电池需要进行电压均衡&#xff0c;并联的电池由于电压一致&#xff0c;所以并不需要进行均衡&#xff1a; 被动均衡有一个很明显的特征就是会看到很多大电阻&#xff0c;串联在MOS和电池之间&#xff1a;下图中的保护板就是被动均衡板子以及它的原理图&#xff1a; …

软硬件开发面试问题大汇总篇——针对非常规八股问题的提问与应答

软硬件开发&#xff0c;从微控制器编程到复杂的嵌入式系统开发&#xff0c;离不开下位机、操作系统、上位机等&#xff0c;涵盖范围很广。 如何快速一行代码操作硬件寄存器 直接操作硬件寄存器的代码通常依赖于特定平台和编程语言。在 C 或 C 中&#xff0c;常见的方法是使用指…

WORFBENCH:一个创新的评估基准,目的是全面测试大型语言模型在生成复杂工作流 方面的性能。

2024-10-10,由浙江大学和阿里巴巴集团联合创建的WORFBENCH&#xff0c;一个用于评估大型语言模型&#xff08;LLMs&#xff09;生成工作流能力的基准测试。它包含了一系列的测试和评估协议&#xff0c;用于量化和分析LLMs在处理复杂任务时分解问题和规划执行步骤的能力。WORFBE…

智慧停车场导航系统架构及反向寻车系统解决方案

一、系统概述&#xff1a; 随着当前室内定位导航技术在大型公共场所如政务中心、商业综合体、车站中的应用越来越多&#xff0c;人们对智慧停车场的需求也日益凸显出来&#xff0c;并且智慧停车场对大型公共场所智慧化的整体建设起到重要作用。如何更有效提高停车效率&#xf…

如何加密电脑磁盘?电脑本地磁盘加密方法介绍

随着信息技术的不断发展&#xff0c;电脑磁盘加密已经成为保护个人隐私和数据安全的重要手段。本文将介绍几种常见的电脑本地磁盘加密方法&#xff0c;帮助用户保护自己的数据安全。 文件夹只读加密专家 文件夹只读加密专家不仅可以加密电脑中的文件夹&#xff0c;还可以加密保…

Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java createTileInternal(tileSpec)方法注释想隐藏的模块即可。

【C++进阶篇】——STL的简介

【C进阶篇】——STL的简介 1.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

redis集群配置

一、Redis集群的三种方式 Redis集群提供了三种分布式方案&#xff1a;主从模式&#xff1a;一个主节点和一个或多个从节点&#xff0c;主节点负责写操作&#xff0c;从节点负责读操作&#xff0c;实现读写分离&#xff0c;分担主节点的压力。哨兵模式&#xff1a;哨兵系统用于监…

【每日一题】LeetCode - 盛最多水的容器

给定一个长度为 n 的整数数组 height。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。要求找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 输入示例&#xff1a; height [1,8,6,2,5,4,8,3,7]输出&#xff1a; 4…