海思3531平台 NVR 的项目总结 视频拉流 转码 推流....
从8月份开始到现在 ,从0开始写这个项目 早就准备写个项目总结,无奈,一直拖拖拉拉的 ,知道最近 正好 最后二期需求 也完成的差不多了 ,抽空记录下来 。首先介绍些硬件平台,海思HI3531DV200 硬件功能还是比较强悍的 据芯片手册上可以支持到8路4K的视频解码编码(记不太清楚了可能有误...不重要 )。我们需求4路就可以 所以绰绰有余。前期项目的需求是4路RTSP输入,每路送入VDEC之后通
从8月份开始到现在 ,从0开始写这个项目 早就准备写个项目总结,无奈,一直拖拖拉拉的 ,知道最近 正好 最后二期需求 也完成的差不多了 ,抽空记录下来 。
首先介绍些硬件平台,海思HI3531DV200 硬件功能还是比较强悍的 据芯片手册上可以支持到8路4K的视频解码编码(记不太清楚了可能有误...不重要 )。我们需求4路就可以 所以绰绰有余。
前期项目的需求是4路RTSP输入,每路送入VDEC之后通过VPSS VENC 可以编码成4路不同的分辨率(只能比原视频小 不支持放大输出)所以最大一共可以用4*4 =16路的输出 这里建立二维数组来保存系统的通道占用情况。
二期需求是需要复用编码参数,比如同一路RTSP 编码参数(分辨率码率什么的)也相同的话 这个时候不能再送入VPSS VENC编码了 需要复用已有的编码通道。这样就需要在 RTSP RTMP中间多增加一层了 这个时候二维数组就不够用了需要变成三维数组。文字看起来比较枯燥 ,下面上个图
这是到目前为止 基本上的功能都有了 前期需求是ENC param1那里出来直接就是一路RTMP了现在变成了 4路 (人为定义,可以随便增加 只要内存够)
后来有个需求就是 一共有20路相机,由于我们最大同时 只能拉4路RTSP,所以剩余的16路就通过平台下发过来 放到一个数组里面定时去探测 并把探测结果保存下来 ,平台会定时下发指令 然后把所有的拉流信息推流信息都上报到平台
接下来看下 NVR 用到的第三方的资源
最重要的部分 是libevent,所有的对外通信都是通过libevent 下发或者上报http消息。
包括下发推流指令 删除通道 ,更新通道,截图等等
和平台通信的数据格式 是 json格式 由于我们是使用C语言开发,所以使用了CJSON
别的没什么说的 看上面的图都能知道的。
然后之前写的文章 包括RTMP增加H265的支持等等 都是基于这个项目来做的
最近增加了复用编码参数的功能 ,还增加了只断RTSP 不断RTMP的功能(简单来说就是某路流正在推流,然后RTMP地址不变要换个RTSP,对于播放端来说,不用变,我们FFMpeg拉流的时候换掉新的RTSP流即可,当然这过程中 涉及到很多异常的处理)
然后就是编码复用,从二维数组 变成三维数组,原来以为会有很多工作量 ,但是 两三天下来 基本测试 差不多了 感觉没有想象的那么难(也许有很多我还没测到的情况^^ ),主要就是使用了引用计数 以便于删除的时候 只有当已用计数为0 的时候才去真的删除通道。这里面情况还是比较复杂的因为,会有需要转码 和不需要转码两种情况 不需要转码的时候是不能占据VDEC VENC的 ,如果单独处理还好,但是 两种情况糅合在一起就有点麻烦。今天 先写到这 等有时间了在来更新....
更多推荐
所有评论(0)