Skip to content

AKStream的组成部分与运作原理

chatop2020 edited this page Jan 6, 2021 · 15 revisions

AKStream的组成(根据代码结构)


  • AKStreamWeb
  • AKStreamKeeper
  • LibCommon
  • LibGB28181SipServer
  • LibLogger
  • LibSystemInfo
  • LibZLMediaKitMediaServer
  • SIPSorcery

AKStreamWeb

  • AKStreamWeb是AKStream的总控制中心,是全局的流媒体管理API服务,包含了所有流媒体功能的控制,如摄像头注册,录制计划,rtp推流,ptz控制等。
  • AKStreamWeb在一个集群中只运行一份,负责收集来源于AKStreamKeeper的流媒体服务信息,并进行流媒体服务的管理
  • 集成Sip网关相关功能,向GB28181设备提供如注册、目录获取、推流请求、历史录像查询、PTZ控制等功能
  • 集成操作系统性能信息收集功能,提供如CPU,内存,磁盘等相关情况
  • 集成数据库操作功能,对系统运行过程中所产生的数据进行数据库持久化保存
  • 集成ZLMediaKit的集群控制功能,统一管理、调度各ZLMediaKit流媒体服务器
  • 集成非GB28181设备的拉流功能,实现除GB28181 Rtp流以外的其他流类型的拉取与转换
  • 集成Swagger调试环境,提供Web形式的接口调试功能
  • 集成WebApi,提供第三方应用的全功能接入
  • AKStreamWeb引用包含了LibCommon、LibLogger、LibSystemInfo、LibGB28181SipServer、LibZLMediaKitMediaServer、SIPSorcery六个内部类库

AKStreamKeeper

  • AKStreamKeeper是ZLMediaKit的治理程序,它用于流媒体服务器(ZLMediaKit)的相关控制,如控制流媒体服务器的启动,停止,重启,获取某个录制文件是否存在,裁剪与合并任务的执行等。
  • 此服务针对于流媒体服务器进行部署,每一个流媒体服务(ZLMediaKit)都需要部署一个对应的AKStreamKeeper,此服务与AKStreamWeb通过WebApi进行通讯。
  • AKStreamKeeper启动时,将自己的状态以心跳的方式汇报给AKStreamWeb,并帮助AKStreamWeb服务控制流媒体服务器(ZLMediaKit).
  • AKStreamKeeper引用包含了LibCommon、LibLogger、LibSystemInfo三个内部类库

LibCommon

  • LibCommon以.net类库形式存在的内部类库
  • LibCommon主要提供的是系统中用到的各种枚举、结构、通用工具方法、数据库中间件等功能

LibGB28181SipServer

  • LibGB28181SipServer以.net类库形式存在的内部类库
  • 它是一个完整的GB28181 Sip信令网关,是一个自治理的全功能类库,关于GB28181 Sip信令服务的所有功能都在此类库中集成
  • 提供设备注册、设备注销、设备目录获取、设备状态获取、设备信息获取、设备推流请求、设备终止流请求、设备历史录制文件列表获取、设备历史录制文件推流、设备历史文件终止推流请求等Sip信令通讯功能
  • 提供GB28181设备及其音视频通道的管理,向外提供各种事件的触发,如有设备注册事件、有设备注销事件、有设备就绪事件、有设备心跳事件等等
  • Sip网关同时支持TCP、UDP信令通道,尝试兼容IPV4与IPV6两种IP地址(Sip网关配置文件中指定信令端口为TCP时同时开放TCP与UDP端口)

LibLogger

  • LibLogger是基于log4net的日志记录框架

LibSystemInfo

  • 全平台的操作系统性能参数获取类库
  • 可惜的是Windows平台下网络流量获取功能因.net core3.1的bug无法完美兼容支持,因此原因AKStream暂时无法正常在Windows操作系统上运行

LibZLMediaKitMediaServer

  • 管理流媒体服务器的类
  • 集成提供流媒体服务器(ZLMediaKit)所有WebApi调用功能
  • 集成提供AKStreamKeeper所有WebApi调用功能

SIPSorcery

  • Sip信令协议栈

第三方库的引用

  • FreeSql,数据库连接、操作所用的库,几乎支持所有关系型数据库
  • Newtonsoft.Json,AKStream所有Json序列化与反序列化工作由此库完成
  • ini-parser-netstandard,用于解析ini文件,主要用于读取和修改ZLMediaKit的config文件
  • Swagger,用于提供WebApi接口的Web可视化调试

AKStream的运作原理


首要说明

  • 与StreamNode不太一样,AKStream所有工作都基于数据库,所有推流,拉流,视频录制等等操作均基于数据库中的VideoChannel表中的数据,只有数据库中存在才会做相关操作,不存在则不会有任何操作,所以切记,一切都从数据库开始
  • 由于把一切规范到数据库后,AKStream的代码结构,架构设计也因此变得更简单清晰,不会像StreamNode那样使人产生概念上的歧义与理解困难,因此请记住,数据库中的数据是AKStream运作中的核心,所有操作的可能性都来源于数据库中的数据表现,会专门有一章节介绍数据库中各表各字段的含义

音视频流怎么才能让我们看到?

  • 音视频流的编码格式、封装格式、提供方式因不同的设备不同的协议而各不相同。但往往我们希望把这些不同的情况统一起来,统一管理统一调度最后统一使用。AKStream的目标就在于此,它将不同设备的不同方式下的不同编码与提供方式的音视频流统一成一种方式向外提供。
  • AKStream支持设备有网络摄像机、NVR、DVR、FFMPEG等,AKStream将这些不同设备的音视频流,在不论其封装格式,编码格式的前提下被分类两类
  1. GB28181设备所产生的rtp流
  2. 非GB28181设备所产生的其他流
  • 对于GB28181设备,AKStream通过Sip信令沟通设备,设备进行GB28181信令的正确响应,AKStream通过WebApi与ZLMediaKit进行通讯,获取ZLMediakit的推流权限(端口申请),从而使GB28181设备主动向指定端口与指定参数的约束下进行推流,ZLMediaKit在收到GB28181设备的推流后,将rtp流协议转换成如http-flv,ws-flv,rtmp等协议的流并通过WebApi接口与AKStream通讯,告知AKStream相关推流与转换情况,AKStream收到这些信息后更新维护推流列表
  • 对于非GB28181设备,AKStream通过ZLMediaKit内置的代理推流器或FFmpeg代理推流器,拉取非GB28181设备的视频流源地址(rtmp,rtsp,http等),ZLMediakit在正确拉取或拉取失败时会向AKStream的WebApi接口进行通知,AKStream得到通知后如GB28181设备一样进行处理
  • 正确推流,并且被正确协议转换后,我们就可以在Web,移动端,客户端等场景下通过AKStream提供的各类转换协议地址观看到设备的实时音视频流

GB28181的Sip信令网关的工作流程

  • 摄像头的GB28181配置页面配置AKStream中Sip网关的相关参数信息
  • 摄像头上线时,自动通过GB28181协议向Sip网关注册自己
  • Sip网关发现摄像头上线后,发启设备目录查询请求
  • 摄像头收到设备目录查询请求后,按GB28181协议要求发送自身设备列表到Sip网关
  • Sip网关收到设备列表后,完成摄像头推拉流必须的参数
  • 摄像头与Sip网关保持心跳响应
  • Sip网关在一定周期内发现摄像头心跳断连,自动跳出Sip设备列表中的摄像头

AKStream的录制计划(模板)

  • 与StreamNode不同的是,AKStream的录制计划以模板的形式提供
  • AKStream可以添加、删除、修改、查询无限数量的录制模板,这些模板可以被一个音视频通道(数据库VideoChannel表中的一条记录)绑定,绑定模板以后,该音视频通道就拥有了这个录制计划所指定的录制规则,AKStream会按照录制计划所指定的规则进行录制
  • 录制计划模板可以启用和停用,一个录制计划模板被停用时,所有绑定这个录制计划模板的音视频通道也同时失去了录制音视频文件的能力
  • AKStream仅支持将音视频流录制成可快速播放的mp4文件(MP4的FastStart)
  • 录制计划模板,以星期为单位控制每个星期n的00:00:01到23:59:59的录制与不录制控制,一个录制计划模板中可以出现多个星期n的数据,表示每天启用与停用录制可以多段
  • 如果一个录制计划仅含有录制计划本身,则没有星期n的细节信息,AKStream默认其一直录制
  • 只有音视频流正确上线(成功推拉流)的时候,才会启动录制

Clone this wiki locally