从8月份开始到现在 ,从0开始写这个项目 早就准备写个项目总结,无奈,一直拖拖拉拉的 ,知道最近 正好 最后二期需求 也完成的差不多了 ,抽空记录下来 。

首先介绍些硬件平台,海思HI3531DV200  硬件功能还是比较强悍的 据芯片手册上可以支持到8路4K的视频解码编码(记不太清楚了可能有误...不重要 )。我们需求4路就可以 所以绰绰有余。

前期项目的需求是4路RTSP输入,每路送入VDEC之后通过VPSS VENC 可以编码成4路不同的分辨率(只能比原视频小 不支持放大输出)所以最大一共可以用4*4 =16路的输出  这里建立二维数组来保存系统的通道占用情况。

二期需求是需要复用编码参数,比如同一路RTSP 编码参数(分辨率码率什么的)也相同的话 这个时候不能再送入VPSS VENC编码了 需要复用已有的编码通道。这样就需要在 RTSP RTMP中间多增加一层了 这个时候二维数组就不够用了需要变成三维数组。文字看起来比较枯燥 ,下面上个图

JAVA 海康威视摄像头 推流 海康nvr推流_音视频

这是到目前为止 基本上的功能都有了 前期需求是ENC param1那里出来直接就是一路RTMP了现在变成了 4路 (人为定义,可以随便增加 只要内存够)

后来有个需求就是 一共有20路相机,由于我们最大同时 只能拉4路RTSP,所以剩余的16路就通过平台下发过来 放到一个数组里面定时去探测 并把探测结果保存下来 ,平台会定时下发指令 然后把所有的拉流信息推流信息都上报到平台

接下来看下 NVR 用到的第三方的资源

JAVA 海康威视摄像头 推流 海康nvr推流_JAVA 海康威视摄像头 推流_02

 最重要的部分 是libevent,所有的对外通信都是通过libevent 下发或者上报http消息。

包括下发推流指令 删除通道 ,更新通道,截图等等

和平台通信的数据格式 是 json格式 由于我们是使用C语言开发,所以使用了CJSON

别的没什么说的 看上面的图都能知道的。

然后之前写的文章 包括RTMP增加H265的支持等等 都是基于这个项目来做的 

最近增加了复用编码参数的功能 ,还增加了只断RTSP 不断RTMP的功能(简单来说就是某路流正在推流,然后RTMP地址不变要换个RTSP,对于播放端来说,不用变,我们FFMpeg拉流的时候换掉新的RTSP流即可,当然这过程中 涉及到很多异常的处理)

然后就是编码复用,从二维数组 变成三维数组,原来以为会有很多工作量 ,但是 两三天下来 基本测试 差不多了 感觉没有想象的那么难(也许有很多我还没测到的情况^^ ),主要就是使用了引用计数 以便于删除的时候 只有当已用计数为0 的时候才去真的删除通道。这里面情况还是比较复杂的因为,会有需要转码 和不需要转码两种情况 不需要转码的时候是不能占据VDEC VENC的 ,如果单独处理还好,但是 两种情况糅合在一起就有点麻烦。今天 先写到这 等有时间了在来更新....