1 Node.js概述
根据百度百科的定义,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, 让JavaScript 成为一种不但可以运行在浏览器端,还可以运行在服务端的编程语言,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。Node.js是单线程的,它通过事件循环(event loop)来实现并发操作,因此,编程时尽可能多使用非阻塞操作。
2 WebSocket
根据百度百科的定义,WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。因此,目前对于Web端消息推送应用,很多都采用WebSocket,它能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
3 视频流推送实现
视频流可以通过OpenCV从摄像头进行获取,视频流可以抽取出每一个帧,一般来说,如果一个视频的fps为24,那么则意味着1秒中播放24帧,而每一帧就是一副图像,因此,我们可以从视频流中抽取出图像帧,并对图像进行处理,比如大小跳转,绘制边框等,然后可以将其通过base64转换成字符串,通过WebSocket发送到服务器,而服务器则通过WebSocket协议推送到浏览器,并基于img标签进行显示。
本示例核心组件如下所示:
(1)Node.js 构建的server.js 是 WebSocket Server端;
(2)Python 构建的client.py 则获取视频流并推送base64编码后的图像到Server端;
(3)Python Flask构建的web.py,返回index.html页面,接收WebSocket协议推送过来的图像,并显示。
下面给出server.js 核心代码,具体如下所示:
其中的WebSocket协议需要通过 npm install ws 进行安装。而wss.on方法可以监听客户端的连接,并通过循环客户端列表来发送数据,即client.send(msg)。下面再给出Python 构建的client.py核心代码,具体如下所示: