QMCY:基于海思3531平台的多路视频输入输出

一不小心又吐槽了一下。正式说下工作的事情吧。基于海思HI3531DV200 芯片 4路RTSP视频输入,每路转出4路不同的分辨率 。刚开始以为是用FFMpeg做视频解码 缩放就可以。后来发现不对。FFMpeg的解码缩放应该是软编码 吃CPU ,正确的思路是通过海思芯片的硬件解码硬件编码来做。打通思路就好了这个过程花了一两天 然后就开始看海思自带的VDEC模块的例子。

之前的公司做的是摄像头,基本上 VI采集到的视频送到VPSS处理然后送给 VENC 做编码 之后得到的H264/H265 裸流 要么保存文件 要么通过RTSP/RTMP/GB28181/ONVIF 送到副武器去 大概就干这些事情。当然还有音频数据,期间有过一个情况是通过GB28181 推流的时候还需要录制文件,但是GB28118 的音频支持的是711格式,不支持AAC格式,但是录制MP4文件的时候又要求是AAC格式,这期间就涉及到一个711转AAC的过程,刚开始不知道,搜了下百度 大概思路就是711先转成原始格式PCM 然后PCM通过FAAC 转成AAC 。遇到的问题就是PCM送给AAC的时候的要是完整的一个音频帧 1024个采集点。但是海思送上来的数据并不是以帧为单位的,实际情况是采样率8000 单通道,16bit的精度 G711A海思送上来的每次是160个字节,转成PCM后320个字节,需要把这个320个字节拼凑成2048个字节(完整的一个音频帧1024*2) 送到FAAC解码 这样才是正确的。 还有的额外的工作就是需要通过浏览器去配置IPC摄像头 ,当时也是什么也不知道。继续百度。发现使用BOA+CGI。 还是在学校学习的HTML又被捡起来了 。后来功能也实现了 ,但是界面太丑,又找了个LayUI  框架做 算是马马虎虎,比之前好一点能看了   我们也没要求太多的功能 差不多能配置一下IP 设置一下主码流子码流的参数就可以了。不过这期间第一次体验了C语言+HTML+Javascript的代码 在一起的感觉 。有点累 。如下图。。。

实现的效果大概就是这样的

回到正题,3531DV200比3518 的硬件性能高出了一个数量级,定位也不一样,3531定位是NVR、DVR市场,3518提供的例子压根没有VDEC模块。3531就有。但是我拿到的这个SDK版本 海思的API全部变成小写了 之前都是大写 ,VDEC提供的例子是 读视频文件送VDEC然后经过VPSS 送到VO,和我们项目要求的大体相同 但是我们不需要VO 把VO改成VENC就可以 经过VENC编码出来的视频数据 再经过RTMP推流到 服务器。。。

开始调试一步一步来 。从单路输入到单通道输出。慢慢地到4路输入每路输入编码成4路不同的分辨率。这期间应该是很好的理解了 VDEC VPSS VENC的关系了吧 还有所谓的Group和 Channel的概念。简单来说就是VDEC属于Group的概念,VPSS 一组有不同的Channel每个通道对应一个VENC 本项目中用数字来标识的话 我们有4个输入通道 16个输出通道对应的下表

VDEC是0,1,2,3   Group的也是0,1,2,3   每个VDEC对应一个VPSS VPSS中有4个通道01,2,3

然后对应到VENC  从0到15   完事 。。。。  理清楚这个 概念非常重要,不然 之后 做动态增加删除通道 就没法做了 。刚开始都是静态的。就是程序启动的时候就指定了多少路输入 多少路输出。输入的是RTSP流 ,用FFMpeg拉流解码出H264裸流 然后经过海思处理 将不同的分辨率用srslibrtmp推到服务器。  静态的处理还是比较简单的基本上。依据海思的例子 ,稍微修修改改就可以了。难得是 后来  需要做成动态的,就是已一启动的时候啥也不干 一个输入输出通道也没有。

起一个HTTP服务,监听来自客户端的请求,客户端会通过HTTP发送GET或者POST请求得到设备的状态 给设备发送相关参数 然后程序根据这些命令参数 增加通道 删除通道。或者返回当前正在使用的通道列表等等。HTTP通信的数据格式 是JSON格式的 。 C语言有现成的库来解析JSON格式,但是我没用 自己写了 无非就是解析字符串。。。。这样来的快。。。 后来又增加了需求 HTTP下发参数的时候有的视频是不需要转码的直接FFMpeg得到视频流之后 直接通过RTMP发出去 不需要经过海思VPSS模块 。之前程序写的都是需要经过VPSS处理的 这样的需求对于程序来说增加了逻辑复杂性。。。。不过 到昨天为止 差不多已经实现了 

项目目前的进度HTTP模块已经调好,动态输入输出已经成调好 ,FFMpeg拉去视频流OK 刚开始测试使用RTSP推流  后来改成 RTMP推流 OK   

从8.6日入职到今天28号 。个人感觉应该还是算是比较快的。

涉及到的知识点:

1.RTSP拉流 使用FFMpeg之前没用过这个
2.HTTP服务 目前用了libevent。有时间的可以自己手写  
3.解析生产JSON数据 目前自己写的,可以使用cJSON
4.RTMP推流 使用srslibrtmp

 上标列出的都是相当于额外的外围部分吧  跟海思基本上没有啥关系。

对于我个人来说复杂的应该是动态增加删除通道的功能。这里面涉及到逻辑最复杂,基本上海思0XA0那些错误码 在这个过程中 遇到了没有一半 也有三分之一了吧 。不过经过这个阶段之后 对海思应该也更加熟悉了  

看下主程序  很简单 看函数名大概就知道 意思了

下面是系统的对外的函数:

下面是一些相当于外围设备的函数

还有一些内部函数:

目前只有Update函数 还没有实现别的都实现了。

下周差不多可以做测试了  目前先写到这 。

Guess you like

Origin blog.csdn.net/baoecit/article/details/119967115