前言 EdgeX Foundry实现了很多协议连接物理设备。对于像监控摄像头这类实时流媒体,因其实时数据量巨大,对设备性能要求高,如果直接存储数据到EdgeX Foundry所在的网关,不仅会严重降低其性能,而且网关内非常有限的本地存储也无法处理巨量增长的数据。所以如果希望利用EdgeX Foundry框架来处理实时流媒体数据,就不能把它当做普通文本消息流,而必须采取其他措施。 本文介绍一种简单的实现方式,EdgeX Foundry在其中提供信令控制服务。把摄像头的元信息注册到EdgeX Foundry,把截屏和录像等命令都交给EdgeX Foundry管理;而摄像头的流媒体数据则通过特定的流媒体服务器和转发服务器推送到指定的客户端,流媒体服务器的地址也可以当做摄像头的元信息,交由EdgeX Foundry管理。 第三方开源组件 以下整合方式是演示在给video camera设备发送命令后,能够在设备管理页面读到video camera的实时视频流,其中采用ffmpeg和jsmpeg等开源组件。 开源组件jsmpeg.js只应用于设备管理web端渲染视频,无需整合到EdgeX Foundry; 关于设备管理web端,请参见github中simple-local-gateway-console; camera设备的元信息注册到EdgeX Foundry; 经过EdgeX Foundry发送命令到树莓派中的camera; camera的视频流数据经过node.js的http模块接收,websocket转发到web端; 目前基于jsmpeg.js开源组件实现的视频流,只支持广播模式,未来将支持订阅模式。
操作实时流媒体 下面采用开源的组件采集树莓派上的摄像头数据,并在web浏览器上实时直播监控。浏览器渲染视频流等技术采用开源组件jsmpeg.js,视频采集使用开源组件ffmpeg,详情请参阅其对应github项目。 视频流操作较复杂,包括采集、编码、压缩、传输、转发、解码、渲染等系列步骤才能在web浏览器上实时渲染出来,因篇幅所限这里只做简单描述。 (1) 注册camera设备的元信息到EdgeX Foundry 登陆EdgeX Foundry Console Web页面,进入Device Service模块添加camera设备,设置camera接收的命令、参数、流媒体服务器的地址等。 (2) 安装node.js环境和http-server、websocket模块: 鉴于媒体流服务器普遍比较重,而物联网网关资源有限,这里采用node.js的http-server模块用于接收媒体流数据。 Websocket模块用于转发数据到web端,实际生产环境比这复杂的多,这里只是演示如何通过EdgeX Foundry作为一种信令控制服务,来管理video camera设备。 在EdgeX Foundry宿主机上安装node.js环境,并安装http-server,websocket模块。这个node.js环境建议运行在Docker容器中,避免污染宿主机环境。 (3) 在EdgeX Foundry宿主机上启动流媒体服务 启动websocket-relay.js ==>其中已包含http-server,websocket转发模块。 (4) 向camera设备发送命令,接收视频流 登陆EdgeX Foundry Web Console的多媒体设备管理页面 找到camera设备,点击录像按钮,发送接收视频流命令 树莓派接收到命令后,调用ffmpeg开源组件采集camera视频流数据
命令如下: 其中ip地址是上一步node.js的http-server服务地址。 (5) EdgeX Foundry Web Console多媒体设备管理页面可以看到video camera实时监控视频流。 下面是一组截图演示操作流程:
摄像头实时监控
摄像头的profile文件 更多详细操作,还可参见以下视频:
|