共计 8686 个字符,预计需要花费 22 分钟才能阅读完成。
视频网关是视频云零碎下的一个边缘容器设施,它起着将视频数据承前启后的性能。
视频云
说到边缘视频网关就不得不提到云计算中的视频云,它是各畛域的视频零碎比方安防监控等向着智能化、物联网、上云倒退的产物。
在云平台上通过云服务器和边缘视频设施将采集的视频输入编码后通过网络实时传输给终端,终端进行实时解码后显示输入。终端同时能够进行操作,通过网络将操作控制信息实时传送给云端利用后盾对边缘视频设施进行管制。
一个物联网场景下云边协同的智能视频云零碎,具备实时流、历史录像性能,并反对对视频数据算法剖析与后果联动管制,能够兼容市面上大多数厂商的视频设施比方摄像头和 NVR。不仅能够在私有云 / 公有云部署,甚至提供反对有损服务的本地局域网视频最小零碎。
视频网关
视频网关是云计算在视频垂直畛域中的边缘容器设施,能够将其了解连贯视频数据在视频传感器与云上服务之间的桥梁,是视频云零碎中的要害一环,实现视频设施宽泛的兼容性以及云边协同都离不开它的身影。设计一个性能齐备,可扩大,高可用的视频网关是十分值得投入的。
如何实现
视频网关须要实现的基本功能包含视频流采集与推送、视频设施接入与治理等,作为一个与底层硬件打交道的设施,又波及到云计算中的接入、平安以及云边协同等方面,堪称麻雀虽小五脏俱全。
视频数据采集
视频云零碎中视频数据的采集由位于边缘侧的视频网关实现,视频网关连贯视频采集设施比方 IPC/NVR, 通过厂家 SDK 或者 ONVIF 协定对视频采集设施进行治理,网关拉取视频采集设施的数据流并推送云端或者边缘侧的视频服务,由视频服务对视频数据进行转码、数据流协定转换等操作以适配不同的播放客户端。
视频设施治理
摄像头、NVR 等视频设施位于用户局域网内,通过边缘视频网关接入到视频云零碎中。边缘视频网关和视频设施须要在治理平台上通过导入的形式做注销以便明确视频网关与视频设施以及视频网关与业务的绑定关系。视频网关治理视频设施并将设施状态实时同步到云视频零碎中,治理平台实现 ” 设施影子 ” 并提供对视频网关以及视频设施状态信息的增删改查接口。
数据安全
视频上云须要平安认证,视频云零碎中边缘容器设施接入云端服务、边缘容器设施之间以及边缘容器设施与云端服务之间的数据流采纳规范国密算法保障其运行的安全性,其中边缘容器设施接入云视频流程中采纳国密 sm2 非对称秘钥技术保障接入平安,边缘容器设施与云视频之间的数据通道采纳国密 sm4 对称秘钥技术保障信令与视频数据的平安。
设施接入
视频云零碎中视频网关等边缘容器设施通常位于用户局域网内,视频网关在局域网内连贯视频设施比方 IPC 或者 NVR,并作为一个边缘容器设施接入到云视频。视频网关通过注册、登录形式接入云视频保障安全性,整个设施接入流程中视频网关与云视频之间通信采纳国密 sm2 非对称加密技术进行音讯加密与签名校验,接入云视频后视频网关与云视频之间的信令通道采纳国密 sm4 对称秘钥形式进行数据加解密。
1)在视频云开放平台为视频网关设施申请 sn 序列号后即能够失去视频网关的私钥以及接入云视频所需的公钥;
2)视频网关接入云视频的注册阶段,首先网关应用网关私钥对本身信息进行签名,而后应用云视频公钥将签名信息以及设施 sn 等信息进行加密并发送云视频,这一过程能够保障网关的注册申请只能被云视频解析,并且云视频能够通过签名验签辨认音讯是由视频网关收回。
3)注册云视频胜利后,云视频会将其与视频网关之间的信令通道等相干信息通过云视频私钥加密后返回给视频网关,视频网关通过云视频公钥能够解析。
4)视频网关接入云视频的登录阶段会与云视频协商信令通道对称秘钥,首先网关应用网关私钥对本身信息进行签名,而后应用云视频公钥将签名信息以及设施惟一标识、对称秘钥向量等信息进行加密后发送云视频,这一过程能够保障网关的登录申请只能被云视频解析,并且云视频能够通过签名验签辨认音讯是由视频网关收回。
5)登录云视频胜利后,云视频会将其与视频网关之间信令通道中应用的对称秘钥 key、token 以及无效工夫等信息通过云视频私钥加密后返回给视频网关,视频网关通过云视频公钥能够解析。
数据通道
边缘容器设施与云视频之间的业务数据,比方视频网关与云视频之间的视频流推送、摄像头列表保护等音讯通过数据通道传播,采纳国密 sm2 对称秘钥技术加密,如果数据通道的 token、对称秘钥过期须要视频网关从新登录云视频获取。
以边缘视频网关向云视频推送视频流这一过程为例阐明,视频网关采集到摄像头设施的视频流后对视频帧加密后传输到云端视频后盾服务,其中视频网关与云端视频后盾服务之间推视频流建设握手的 token 以及推流数据加密应用的国密 sm4 key 等平安信息是通过视频网关与云视频之间的数据通道下发的,视频链路保障该加密信息的单次应用时效性,也就是说单次推流的信令中所蕴含的加密信息如果在一个工夫阈值内不应用或者握手胜利后就不可再次复用了。
视频云零碎中边缘容器设施接入与数据通道的平安认证机制如下图所示。
云边协同
灵便的云边协同和边缘计算能力,集中管理能力云端收拢,局部逻辑下沉边缘,保障疾速响应,即使在云环境网络异样下也能提供根底的本地视频服务实现高可用。
在传统的视频监控畛域,摄像头、算法和监控软件会部署在同一个局域网内,对于用户而言,往往有在公网短时播放的需要。如果将视频放到公网上进行播放,又会带来带宽老本以及平安问题。视频云零碎为解决以上问题,提供云边协同和边缘计算能力,在云端管制边缘节点,能够将已训练好的算法或者事件联动能力下沉到边缘容器设施进行运行,大大降低云端压力。同时领有灵便边缘路由能力,依据云端拉流需要,将局部视频推到云端进行播放,极大升高带宽老本,进步零碎的稳定性。
云边零碎高可用
技术计划
跨平台编程
视频网关作为一种嵌入式媒体网关设施,次要有两种设施状态,一种是以通用服务器搭载网关服务的模式,这样的零碎比拟重,老本比拟高然而性能强劲,另一种是嵌入式盒子设施比方树莓派,成本低同时性能较低,依照我的项目利用场景正当搭配解决方案。
视频网关作为一个能够跨平台,跨零碎并深度交融云计算视频云畛域的服务,软件咱们采纳了 golang 语言,借助于其人造的跨平台个性,能够反对网关服务运行在各种芯片平台以及操作系统之上。go tool dist list 能够看到 go 语言反对的平台和零碎如下。
操作系统 | 主控芯片平台 |
---|---|
linux | 386/amd64/arm/arm64/mips/mips64/mips64le/mipsle/ppc64/ppc64le/riscv64/s390x |
android | 386/amd64/arm/arm64 |
darwin | 386/amd64/arm/arm64 |
freebsd | 386/amd64/arm/arm64 |
solaris | amd64 |
plan9 | 386/amd64/arm |
openbsd | 386/amd64/arm/arm64 |
netbsd | 386/amd64/arm/arm64 |
aix | ppc64 |
windows | 386/amd64/arm |
从上述列表能够看出,从 linux/arm64 的嵌入式零碎到 linux/s390x 的大型机零碎,再到 Windows、linux 和 darwin(mac)这样的支流操作系统、amd64、386 这样的支流处理器体系,Go 对各种平台和操作系统的反对不堪称不宽泛。
go 语言被称作互联网时代的 c 语言其长处很多,语法简略、原生反对并发、平台可移植性好、运行速度快、有功能丰富并且对立的规范库等等,其中对于跨平台有一种说法 go 是为了解决 c /c++ 那些简单的依赖而来的,这肯定水平上得益于 Go 独立实现了 runtime,作为技术栈上的选型这里对于 runtime 多说一些。
runtime 是撑持程序运行的根底。libc(C 运行时)是目前支流操作系统上利用最广泛的运行时,通常以动态链接库的模式 (比方:/lib/x86_64-linux-gnu/libc.so.6) 随着零碎一并公布,它的性能大抵有如下几个:
- 提供根底库函数调用,比方:strncpy;
- 封装 syscall(操作系统提供的 API 口,当用户层进行零碎调用时,代码会 trap(陷入)到内核层面执行),并提供同语言的库函数调用,比方:malloc、fread 等;
- 提供程序启动入口函数,比方:linux 下的__libc_start_main。
晚期的零碎的磁盘 / 内存资源非常缓和,采纳动态链接库的形式能够使得编译的程序 / 过程磁盘 / 内存占用小。不过时代变了,当初的服务器配置曾经足够,因为 libc 等 c runtime lib 是基于线程模型的并且历史版本简单,对于开发人员来说这里的累赘很重,一些从事 c /c++ 开发多年的同学可能有过这样的经验,链接 runtime 库时须要抉择链接反对多线程的库还是只反对单线程的库。
go 独立实现 runtime 层,封装了 syscall 将 Go user-level code 与 OS syscall 解耦,把 go 移植到一个新平台时,将 runtime 与新平台的 syscall 对接即可,根本解脱对 libc 的依赖,这样动态编译的 go 程序具备很好的平台适应性。而且穿插编译很简略,只波及两个重要的环境变量:GOOS 和 GOARCH,别离代表 Target Host OS 和 Target Host ARCH,这里须要留神 CGO_ENABLED= 0 的状况下,即不波及 cgo 的前提下 go 采纳纯动态编译。
业务性能
视频网关位于视频零碎的边缘侧,次要业务性能是负责拉取视频流并推送到视频后盾服务。在系统管理层面,视频网关须要连贯设施侧的 IPC/NVR 等,并接入到视频零碎的管制内核,作为边缘容器设施接管云视频零碎内核的信令对视频设施进行治理,执行相应的操作,并将视频设施的反馈后果以及状态上报到云视频零碎内核。
网络接入
视频网关不仅可通过固网接入视频云零碎,也可通过蜂窝网,wifi 等无线形式接入。视频网关通过驱动搭载 WIFI/4G/5G 等通信模块实现无线接入能力,其中局域网内能够应用 WIFI 等协定,连贯互联网能够应用 4G/5G 通信。视频网关可依据视频零碎组网的理论状况以及现场视频设施的理论能力,将整个视频零碎的有线 / 无线网络联合。
无线接入框架
设施初始化
视频网关在接入层采纳插件化的框架,向下能够兼容 ONVIF 协定、SDK 等多种形式接入视频设施,向上能够兼容 mqtt/http 等物联网传输协定接入云计算视频平台。
初始化能力集
视频网关通过视频设施的设施影子中厂商、流起源等属性判断应用 ONVIF 协定还是厂商 SDK 对视频设施进行初始化,获取视频设施的能力列表比方 RTSP 连贯等。
视频设施初始化流程
初始化音讯通道
视频网关和云视频零碎内核之间的音讯通道反对 http/mqtt 等物联网通信协议,视频网关具体应用某种通信协议由用户抉择相应的配置在系统启动阶段实现初始化。
音讯通道的初始化流程
安全策略
视频网关在接入云视频零碎内核过程反对双向鉴权,信令通道以及视频流传输反对数据加密等多种安全策略。
视频网关接入云视频零碎内核分为注册、挑战、登录三步,网关与内核之间采纳 tcp 公有协定形式通信,接入过程中应用 sm2/ 4 国密进行数据加密和签名。其中视频网关的设施私钥、设施公钥以及云视频零碎内核的公钥由视频网关在申请云视频零碎内核放号的过程中获取。
视频网关安全策略
视频流加密
内核下发推流音讯命令字告诉视频网关推视频数据流,网关依据音讯中的流起源字段辨别收流设施是 IPC 还是 NVR,网关推送视频流的目标端信息以及视频流加密秘钥由内核下发音讯指定。
推流加密
信令加密
网关接入云视频零碎内核胜利后即可通过音讯通道实现网关与内核间的云边协同,为了加强音讯安全性在视频网关与内核之间的音讯通道设置了 token 过期工夫,当 token 过期,网关在接管与上报音讯将出现异常,此时须要网关被动从新登录内核换取新 token,网关在定时心跳过程中保护检测 token 过期机制。
Token 过期策略
云边协同
事件处理
视频网关具备边缘节点监控、数据统计与告警、事件处理能力。
视频网关接入云视频零碎内核后,由云视频零碎内核下发音讯管制视频网关执行相干性能,定义视频网关与内核之间音讯命令字。视频网关与内核之间的音讯通道能够采纳 mqtt/http 等协定。音讯通道中应用管道实现队列的能力,内核下发音讯通过管道散发到不同的接管音讯工作中并发解决,网关上报音讯通过管道由发送工作上报内核。
事件处理流程
状态上报
网关与云视频零碎内核之间通信的加密 key 通过网关的心跳上报定时检测更新。
音讯上报流程
视频网关位于设施侧局域网内,能够通过其与云视频零碎内核之间的音讯通道上报统计与告警音讯。实现对设施状态全程监控、无效实时获取状态变更告诉。
视频网关通过音讯通道上报统计和告警音讯到云视频零碎内核,联合云计算视频云的后盾服务以及绑定接入的利用实现告警上报。
音讯通道上报统计与告警
双机热备
为防止视频网关单点异样宕机对视频服务造成影响,视频网关采纳主备形式进步服务可用性,构造简略容易保护。
主备模式下设施侧局域网内多个视频网关波及调度和配置管理,这里应用了我的项目中 zookeeper 组件提供分布式抢占锁和配置核心的能力,zookeeper 应用 znode 目录节点作为锁和共享存储。
网关接入
视频网关作为接入视频云零碎的边缘容器设施具备唯一性,主备模式下局域网内同一时间只有一个视频网关作为主网关提供服务,其余网关作为主网关的从网关监督主网关状态,当主网关出现异常从网关尝试切换成为主网关。其中多个视频网关对视频云零碎等效为一个接入设施。具体部署能够是一主一从或者一主多从。
应用 zookeeper 的长期目录编号节点 (EPHEMERAL_SEQUENTIAL) 实现分布式抢占锁能够为多个网关的运行提供调度,保障同一时刻只有一个网关接入到视频云内核(IOT)。
网关切换
主网关因为宕机与 zk 断开连接或者业务异样被动开释与 zk 之间的锁时,zk 将对应的编号节点删除,并告诉其余监听长期节点的网关能够抢占,新抢占到锁的网关成为主网关。
边缘部署
随着 Docker 为代表的容器技术和 Kubernates 为代表的容器编排工具逐步成熟,越来越多的利用通过容器封装、散发和运行,这种部署形式十分适合边缘计算场景。
依照端设施—边缘—云”三层模型,视频网关作为一种边缘设施与摄像头、nvr 等视频终端设备间接相连,然而边缘节点的硬件资源往往比拟缓和,视频云零碎须要非常灵便的对边缘节点的计算能力与资源调度策略进行调整。
应用容器技术对边缘节点进行资源隔离,不仅 CPU、内存和存储的开销十分小,而且容器能够实现在毫秒级开启和敞开,生命周期治理十分快捷。
视频云零碎中边缘视频网关往往扩散在修建、园区等各个部分区域中,远离云核心。随着用户对视频播放需要的变动,边缘视频网关的资源分配与部署也须要随时调整,并且须要反对监控、日志等等运维伎俩。采纳了 tke edge 边缘容器架构撑持视频云零碎的边缘计算场景,tke edge 反对边缘计算、多云治理和混合云,具备齐备的 k8s 性能与规范 api,能够不便的从核心云运维边缘容器,具备边缘自治能力,反对边缘节点健康检查,服务能够下沉到边缘机房,而且和 tke 领有统一的控制台页面,运维治理可视化非常便捷。
性能调优
视频网关的业务场景决定了其次要功能模块是设施接入与音讯通道、任务调度、采集与推送视频流,性能优化的关键点往往就在这里。
go tool 能够很不便的应用 pprof 对过程具体的性能剖析,应用 -memprofile 和 -cpuprofile 选项生成 cpu 和内存采样文件,再用工具 go tool pprof 查看文件内容。
在开发过程中遇到的性能优化问题挑了两个比拟典型的案例进行剖析。
Mqtt 订阅
视频网关与云视频零碎内核 (IOT) 之间的 mqtt 音讯通道应用了开源的 paho.mqtt.golang, 视频网关作为客户端须要订阅 IOT 调配的 topic,开发调试过程中发现网关过程在启动后既没有接管来自于 IOT 的音讯也没有推流的状况下,cpu 占用都有 2~3 个点,于是通过火焰图对调用接口进行性能剖析,发现 mqtt 客户端的 Subscribe 接口 cpu 工夫占用异样。
查看代码原来是因为接口误应用,订阅接口原本在 mqtt 客户端初始化的时候订阅一次就能够了,然而写代码时把它当成了异步阻塞接管接口,在一个轮询的循环中不停的调用,后果就是不停的在订阅同一个 topic。
token := client.Subscribe(m.subOption.topic, m.subOption.qos, msgSubscribeHandler)
token.Wait()
if token.Error() != nil {log.Errorf("Subscribe msg to mqtt broker error:%s", token.Error().Error())
}
应用开源库中接口不相熟误用造成的问题比拟低级也很典型,如果没有 pprof 这样的工具,排查起来还是挺麻烦了,采纳了正确的姿态,再剖析能够看到曾经没有订阅接口的工夫占用了。
优化推流 buffer
既然视频网关的次要性能是推流那么网络传输接口这块肯定是 cpu 和内存性能的耗费小户,通过火焰图发现封装的推流接口 cpu 占用工夫简直都集中在底层的 Write 和 recv,这一块优化空间不大,然而发现 runtime.gcBgMarkWorker(垃圾回收器)这块耗费比拟高,排查代码原来是推流工作中的 buffer 申请机会不合理导致。
func (v *videoPush) PushToWeLink(pushData *pb.PushReq) error {
// 申请内存空间
packet := make([]byte, mvsTCPHeadLen)
// 组装数据
......
// 发送数据
middleware.SendTCPMsg(v.Conn, v.packet)
return err
}
在每次收到视频帧并推流的时候都新申请一块 buffer,造成 go 的 gc 压力过大,其实对于视频网关每次从视频采集设施收到的数据帧大小是能够预估的,在每次建设推流工作初始化的时候能够针对工作将固定空间的 buffer 预留好。
//videoPush
type videoPush struct {
// 摄像头推流属性等
//token 与秘钥等
// 与视频服务器连贯等
// 状态等
……
PushCtx context.Context
PushCancel context.CancelFunc
frameHead []byte // 加密帧头
packet []byte //sharp 包体
head *com_tencent_weling_proto.MvsHead //sharp 包头
}
func (v *videoPush) PushToWeLink(pushData *pb.PushReq) error {
// 取内存空间
v.packet = v.packet[0:mvsTCPHeadLen]
// 组装数据
......
// 发送数据
if err = middleware.SendTCPMsg(v.Conn, v.packet); err == nil {
// 更新推流状态,在线、推流工夫戳
v.camerasInfo.setPushingByIntDinSubDin(v.SDin, int(v.StreamID), v.StreamType, v.getVideo.StreamHandler)
} else {log.Errorf("push send msg error:%s, packet len:%d", err.Error(), len(v.packet))
}
return err
}
通过简略适配,能够看到 gc 的性能耗费曾经有了明显改善。
我的项目总结
基于 go 的技术栈实现了一个跨芯片平台的视频网关,用户能够抉择边缘服务器或者边缘嵌入式硬件等环境部署视频网关,交融云计算麻利灵便、牢靠稳固的特点,将网络连接、治理运维及调度的能力利用于视频场景,提供实时、牢靠的视频端到端服务。
通过插件化的网络接入层,视频网关能够抉择多种物联网协定接入云计算服务,并且兼容多种厂商的视频设施;
通过云边协同,实现云端下发边缘解决,提供有损服务能力,零碎可用性强;
通过边缘侧状态监控、统计与告警,把握视频设施实时状态上报,构建全链条的打点数据采集,设施级的精细化状态追踪,反对设施行为轨迹等数据分析;
通过从端到云全方位的安全策略。视频网关设施接入云端过程中双向身份认证,保障设施唯一性不受篡改,全面杜绝伪造设施 / 云服务器发送申请。视频流数据加密传输避免敏感信息泄露。
应用成果
以公司一般计算型服务器的配置 (8 核 16G 内存千兆网卡) 为例,设置动态码率 2m 以内的摄像头实时流推流实测能够反对到 400 路。树莓派 3B+ 搭载视频网关在同样场景下能够反对不低于 100 路摄像头实时流推流。
目前 go 重构的视频网关曾经在多个我的项目环境中应用,整体体现良好,并打算在后续的新我的项目以及老我的项目的视频网关降级革新中逐渐替换成 go 重构版本。
设计感悟
当初的设施正逐步朝着物联网,智能化方面倒退,摸索发现一条适宜将来智能设施倒退要求的技术栈是云相干产品开发工程师必须面对的;
不要反复造轮子,优良的官网库,沉闷的开源社区能够让开发工作稳固可控并且丰富多彩;
谋求产品质量和开发效率是每位开发同学都须要要思考的问题,有了它们能力保障产品在市场竞争中立于不败之地,用适合的工具做适合的事。
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!