当前位置: 首页 > 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;
}

http://www.mrgr.cn/news/59267.html

相关文章:

  • Python数据分析NumPy和pandas(九、pandas数据结构之DataFrame)
  • 蓝桥杯题目理解
  • YOlO系列——yolo v3
  • linux驱动—注册总线分析
  • Qt使用QAxObject将Excel表格数据导入到SQLite数据库
  • 【软件工程】软件工程入门
  • 【C++开篇】
  • Java中为什么要私有化构造方法
  • linux快速升级cmake(非源码编译)
  • codimd更改登录超时时限
  • Linux的makefile与进度条小程序实践
  • 刚面完字节!问了大模型微调SFT,估计凉了
  • 国考报名别忘了确认缴费(需传照片)
  • 【ShuQiHere】Linux 桌面环境:选择与定制指南 ️✨
  • <网络> 网络套接字编程(二)
  • 大型项目必备搜索神器,搜索引擎ElasticSearch详细教程
  • Redis 集群 问题
  • Java一些基础代码带你轻松入门
  • #PCIE#基础知识分解之 CC/SRNS/SRIS 时钟架构
  • 基于SSM的网上购物系统的设计与实现
  • 高级 SQL 技巧全面教程:提升你的数据库操作能力
  • [Python学习日记-56] Python 中的包与代码的跨模块代码调用
  • C++ 模板专题 - 表达式模板
  • RabbitMQ 发布确认高级部分
  • 大模型多模态应用深化,AI Agent 如何为应用普及提速(科普一键收藏版)
  • 【Linux】从open到write:系统文件I/O 的奥秘与实战指南