-
Notifications
You must be signed in to change notification settings - Fork 400
AKStream的组成部分与运作原理
chatop2020 edited this page Jan 6, 2021
·
15 revisions
- AKStreamWeb
- AKStreamKeeper
- LibCommon
- LibGB28181SipServer
- LibLogger
- LibSystemInfo
- LibZLMediaKitMediaServer
- SIPSorcery
- 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是ZLMediaKit的治理程序,它用于流媒体服务器(ZLMediaKit)的相关控制,如控制流媒体服务器的启动,停止,重启,获取某个录制文件是否存在,裁剪与合并任务的执行等。
- 此服务针对于流媒体服务器进行部署,每一个流媒体服务(ZLMediaKit)都需要部署一个对应的AKStreamKeeper,此服务与AKStreamWeb通过WebApi进行通讯。
- AKStreamKeeper启动时,将自己的状态以心跳的方式汇报给AKStreamWeb,并帮助AKStreamWeb服务控制流媒体服务器(ZLMediaKit).
- AKStreamKeeper引用包含了LibCommon、LibLogger、LibSystemInfo三个内部类库
- LibCommon以.net类库形式存在的内部类库
- LibCommon主要提供的是系统中用到的各种枚举、结构、通用工具方法、数据库中间件等功能
- LibGB28181SipServer以.net类库形式存在的内部类库
- 它是一个完整的GB28181 Sip信令网关,是一个自治理的全功能类库,关于GB28181 Sip信令服务的所有功能都在此类库中集成
- 提供设备注册、设备注销、设备目录获取、设备状态获取、设备信息获取、设备推流请求、设备终止流请求、设备历史录制文件列表获取、设备历史录制文件推流、设备历史文件终止推流请求等Sip信令通讯功能
- 提供GB28181设备及其音视频通道的管理,向外提供各种事件的触发,如有设备注册事件、有设备注销事件、有设备就绪事件、有设备心跳事件等等
- LibLogger是基于log4net的日志记录框架
- 全平台的操作系统性能参数获取类库
- 可惜的是Windows平台下网络流量获取功能因.net core3.1的bug无法完美兼容支持,因此原因AKStream暂时无法正常在Windows操作系统上运行
- 管理流媒体服务器的类
- 集成提供流媒体服务器(ZLMediaKit)所有WebApi调用功能
- 集成提供AKStreamKeeper所有WebApi调用功能
- Sip信令协议栈
- FreeSql,数据库连接、操作所用的库,几乎支持所有关系型数据库
- Newtonsoft.Json,AKStream所有Json序列化与反序列化工作由此库完成
- ini-parser-netstandard,用于解析ini文件,主要用于读取和修改ZLMediaKit的config文件
- Swagger,用于提供WebApi接口的Web可视化调试
- 与StreamNode不太一样,AKStream所有工作都基于数据库,所有推流,拉流,视频录制等等操作均基于数据库中的VideoChannel表中的数据,只有数据库中存在才会做相关操作,不存在则不会有任何操作,所以切记,一切都从数据库开始
- 由于把一切规范到数据库后,AKStream的代码结构,架构设计也因此变得更简单清晰,不会像StreamNode那样使人产生概念上的歧义与理解困难,因此请记住,数据库中的数据是AKStream运作中的核心,所有操作的可能性都来源于数据库中的数据表现,会专门有一章节介绍数据库中各表各字段的含义
- 音视频流的编码格式、封装格式、提供方式因不同的设备不同的协议而各不相同。但往往我们希望把这些不同的情况统一起来,统一管理统一调度最后统一使用。AKStream的目标就在于此,它将不同设备的不同方式下的不同编码与提供方式的音视频流统一成一种方式向外提供。
- AKStream支持设备有网络摄像机、NVR、DVR、FFMPEG等,AKStream将这些不同设备的音视频流,在不论其封装格式,编码格式的前提下被分类两类
- GB28181设备所产生的rtp流
- 非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提供的各类转换协议地址观看到设备的实时音视频流