一、海思MPP内部处理流程图
各模块功能介绍:
(1)VI:捕获视频图像,可对其做剪切、缩放、镜像等处理,并输出多路不同分辨率的图像数据.
(2)AI:捕获⾳频数据,然后AENC 模块⽀持按多种⾳频协议对其进⾏编码,最后输出⾳频码流.
(3)VPSS:接收VI 和解码模块发送过来的图像,可对图像进⾏裁剪、缩放、旋转、镜像、贴图等处理,并实现同源输出多路不同分辨率的图像数据⽤于编码、预览、智能分析或抓拍。
(4)VENC:接收VI 捕获并经VPSS 处理后输出的图像数据,可叠加⽤⼾通过Region模块设置的OSD 图像,然后按不同协议进⾏编码并输出相应码流.
当然,这些最基础的概念也不是本文的重点,相信各位读者也可以很轻松就理解上述概念。本文主要对实际项目中更深入的视频数据流向做详细介绍。
二、项目中PIPE的数据流向
(1)相关模块组件
很多初学者在学习MPP项目源码时,经常会碰到dev、vi、chn、venc、iva、pipe的相关名词,尤其是dev与vi会被绕的云里雾里,我们从软硬件层面来详细解释一下这些名词。
以RV1106的单目摄像头为例。因为只有一个摄像头,因此摄像头作为唯一的dev;对于这个dev设备,瑞芯微官网说明RV1106最大支持3个sensor 输入,即该设备最多支持三个VI硬件组件;对于一个VI组件,内部有多个视频输入通道chn,chn也是作为硬件组件存在与VI内部;venc同样是硬件组价,因此这里解码属于硬件解码,VENC内部并没有独立通道这一说法,因此VENC编号为VENC[0]、VENC[1]。
以上所述组件都属于硬件层面,接下来介绍软件层面的相关组件。IVA 是一种智能视频分析功能,位于软件层面,用于异常事件检测。而PIPELINE/PIPE既不属于软件也不属于硬件,而是我们人为规定的数据流向通道,可能读者觉得有些抽象,接下来通过一个实际的项目需求来更加深刻的了解一下相关概念。
(2)项目PIPE流向图
(3)PIPE流向解读
我们先来了解一下项目需求,数据流向也是基于项目需求而言。
本项目是实际项目,camer端的整体需求如下:
(1)有两路直播流供客户观看,主码流2k分辨率,子码流720p分辨率,两路直播流上均要显示事件以及相机编号。
(2)第三路码流用于事件侦测
(3)检测到事件发生时(画面有物体,人、宠物、车牌),将主码流发给服务器,事件结束时停止;
同时事件发生时,捕获一张图片,编码为JPEG格式发给服务器作为视频缩略图。
(4)服务端将H264码流保存为MP4格式进行观看。
整个项目中只用到VI0,第0号输入设备。对于第一路直播流,使用VI0中第0号独立通道,在编码前设置好OSD内容,将VI[0,0]与OSD一同送入VENC0进行编码,我们所说的2K分辨率实际是在这里完成的,设置编码视频的宽高1920*1080,编码后的H264码流写到RTSP服务端即完成PIPE0的管道搭建。PIPE1也同样类似。
对于IVA事件侦测,从VI[0,3]捕获视频帧送到IVS进行检测,完成PIPE3的搭建。
当检测到有事件发生时,要将2K分辨率的高清码流传给服务端,这里是直接从VENC0获取编码帧然后发给服务端。要将事件缩略图发给服务器,因为图片编码格式是JPEG,与VENC0、VENC1编码格式不同不能直接获取,因此从VI[0,0]捕获视频帧送给独立的VENC_JPEG编码器,将编码后的图片发给服务端。
总结
本文的作用更多是帮助初学者更好的理解MPP框架整个流程以及相关概念,对于实际业务开发的代码细节不做过多介绍。