APP下载

基于SocketCluster的移动Web视频会议设计与实现

2017-03-24吕海东邓永康钟越星肖瑞李文博

电脑知识与技术 2017年1期
关键词:视频会议线程音频

吕海东+邓永康+钟越星+肖瑞+李文博

摘要:针对使用传统的软件架构无法使用超大并发实时应用的性能需求,采用了全新的异步非阻塞工作模式的Node.js平台和在其基础上的支持集群功能的实时传输框架SocketCluster实现了工作在移动平台上的Web视频会议系统。该系统能支持CPU多核以及多服务器的集群下的可伸缩性,以适应实时应用系统对性能的需求。测试证明采用以上平台开发的实时系统性能优越,为未来实时应用开发提供的经验和基础。

关键词: 视频会议; 实时应用; Node.js; SocketCluster; 视频音频采集

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)01-0208-03

Abstract:Due to the traditional software architecture can not meet the performance requirements of large concurrent real-time applications, using the SocketCluster real-time transmission frame of the new non blocking asynchronous mode of Node.js platform and on the basis of the realization of the function of the cluster support Web video conferencing system work on mobile platform. The system can support the scalability of CPU multi core and multi server cluster, so as to meet the requirement of real-time application system.The test proves that the real time system developed by the above platform is superior to the experience and foundation for the future development of real time application.

Key words: video conferencing; real-time application; Node.js; SocketCluster; video and audio collection

1 概述

目前市场上各个主流的视频会议系统[1]都基于企业内部的平台或私有云基础上,才能保证视频和音频的流畅传输,尤其是移动视频会议移动端基本上都运行在移动平台的原生App模式,需要会议参加者在自己的手机或平板上下载安装,使得系统的更新难以实时完成。同时在视频会议的设计与实现上,传统视频会议都采用基于多线程阻塞模式[2]的服务器框架如JavaEE或MS.NET,难以满足在大数据量、高并发情况下对视频会议实时性能要求。

针对以上问题,本文采用专门支持高并发和实时性的Node.js[3]作为服务器平台,使用基于Noded的Express[4] Web框架和SocketCluster[5]实时通讯集群框架,结合客户端HTML5 Video[6]和Audio API[7]开发了纯Web模式的移动视频会议系统。

该系统具有Web应用的优点,同时服务器端利用其多核和多CPU的特性,使用Socket集群模式来实现移动视频会议的多用户高并发和高性能的视频和音频传输。

2 系统总体架构设计

本移动视频会议系统采用Web工作模式,服务器采用Linux Ubuntu Server上运行Node.js,在Node平台上采用Express为Web服务器,为移动客户端提供视频会议Web页面的请求和呈现。

系统的核心功能是参与会议的每个成员的视频和音频的传输,为支持多用户的实时数据传输,采用能支持Socket传输集群的SocketCluster框架在服务器端和客户端之间实现视频和音频数据的双向实时传输。

客户端智能手机或平台利用内置的支持HTML5的浏览器,结合Google的Web框架AngularJS[8]和Twitter的Bootstrap[9]框架实现Web页面元素的渲染和数据绑定,并引入SocketCluster的客户端负责发送本地用户的视频和音频,以及接收其他用户发送的视频和音频,并使用HTML5 Audio API实现音频的合成和播放。系统的总体架构如图1所示。

Node.js是基于JavaScript的轻量级的,高性能的用于开发现代移动和企业级应用的服务器平台。其核心特点是非阻塞,单线程,异步工作模式,特別适用于开发大量用户连接的高并发应用,目的是为解决传统的应用服务器,如JavaEE,MS.NET, PHP无法适用当连接超过10万的高并发场合。

Express是基于Node.js平台的web应用开发框架,它基于Node.js的非阻塞和异步模式,可提供超高速的Web请求和响应处理,适合开发各种高并发的移动设备应用。

SocketCluster是建立在Node.js平台的基于WebSocket协议的支持集群的实时通讯开源框架。它既支持竖向伸缩(多核CPU),也支持横向伸缩性(多个主机组建的集群)以适应超并发的密集的数据实时数据传输。

在传输对象上,它既支持客户-服务器间传输,也支持客户之间的数据传输。在传输方式上同时支持请求/响应模式的点对点数据传输,也支持发布/订阅模式的群发群收功能,本系统正是利用此发布和订阅模式,在所有会议的参加者之间群发和群收视频和音频数据,实现双向的实时视频会议。

3 服务器端设计与实现

服务器端主要实现Web服务器和Socket数据传输服务器两个核心功能。

Web服务器采用Express框架,用于实现系统Web页面的响应服务,系统采用纯静态HTML5页面,通过AngularJS框架实现动态数据显示。

数据传输采用SocketCluster5.0.19最新版,其支持Socket集群功能,可使用CPU的多核或多服务器集群运行在Node.js多线程模式,可更好地支持更多参与会议的用户的数据传输。

Node.js自身工作在单线程工作模式,无法支持多CPU或多内核CPU,为能实现多CPU时的多线程Node,需要使用Node集群框架,SocketCluster是能支持此类特性的优秀集群框架。

SocketCluster自身工作在如下3种线程下。

1) 主线程:此线程执行SocketCluster的服务器启动和管理功能。

2) 工作线程(Workers):启动多个Node.js实例对象,每个对象内有Event Lopp机制实现对事件的检测和处理。每个CPU内核运行一个Node线程,这个具有2个CPU且每个具有8核的服务器可运行16个Node实例,如此可处理超大量并发用户的请求处理。

3) 代理线程(Brokers):该线程内执行一个代理服务对象,用于在各个工作线程间实现事件的共享。

如下代码简要演示SocketClutser主线程了启动16个工作线程和1个代理线程。

var SocketCluster = require('socketcluster').Socket Cluster;

var socketCluster = new SocketCluster({

workers: 16, brokers: 1, port:8000,

appName: "mobilemeeting",

workerController: __dirname + '/worker.js',

brokerController: __dirname + '/broker.js',});

在每个工作线程worker.js中用于启动一个Node及Express和SocketServer实例,用于Web服务和Socket传输服务,如下代码展示了工作线程的实现。

var express = require('express');

var serveStatic = require('serve-static');

var path = require('path');

var meetingvideo=require("./business/meetingvideo");

var meetingaudio=require("./business/meetingaudio");

module.exports.run = function (worker) {

var app = express ();

var httpServer = worker.httpServer; //启动Express Web服务器

var scServer = worker.scServer; //启动Socket Server传输服务器

app.use(serveStatic(path.resolve(__dirname, 'web')));

httpServer.on('request', app);

//启动会议视频和音频传输模块

meetingvideo.start(scServer);

meetingaudio.start(scServer); };

工作线程中通过worker对象创建HTTP服务器并集成Express,并启动视频和音频传输服务器。

4 视频采集和传输实现

SocketCluster内部实现了与Socket.io框架相同的Socket数据传输机制,它基于HTTP5的WebSocket协议实现双向实时的数据传输,用于高性能实时应用的开发。

SocketCluster即支持客户端-服务器端的请求-响应的点对点传输模式,也支持基于发布/订阅模式的群发群收传输模式。本系统因为要支持多个会议参与者的双向实时通讯,采用的是发布/订阅模式的Socket传输,在Socket服务器上各个客户端端都订阅视频主题meeting.video和音频主题meeting.audio,当某个客户端发送視频或音频数据到此主题后,所有参与会议的客户端自动接收到该主题上的数据,实现视频和音频的显示和播放。如下代码简要演示了视频主题的编程,音频主题编程与之基本类似,不再赘述。

module.exports.start=function(scServer){

scServer.on('connection', function (socket) {

socket.on("meeting.video",function(data){

scServer.exchange.publish("meetimg.video.data",data);

}); }); };

Socket服务器通过监听数据到达事件,使用exchange.publish方法实现群发。由于该服务器工作在16线程下,可以处理大量的并发数据传输,得以实现高性能的移动Web视频会议系统。

5 客户端视频采集传输接收和显示实现

客户端视频的采集使用HTML5的浏览器支持的getUserMedia方法取得摄像头的图像,并把实时采集的数据发送到本地页面中的

程序4:视频采集实现代码

navigator.getUserMedia({video:true },function(stream){

video.src =window.URL.createObjectURL(stream);

video.play();

$scope.$apply();

视频数据采集到

$scope.videotimer=$interval(function(){

canvasContext.drawImage(video, 0, 0, 100, 90);

meetingVideoData=canvas.toDataURL();

socket.sendVideoData({meetingNo:$scope.meetingNo,userid:$rootScope.loginuserid,videodata:meetingVideoData}); },1000/60);

SocketCluster提供了Web客戶端插件,在Web页面载入后,会通过此插件实现与服务器的SocketCluster的连接,并通过发送数据到主题或监听主题的数据到达事件,将接收数据中包含的用户ID取出,定位该用户的视频显示元素,将视频数据发送到该元素上,实现此用户的视频显示,简要实现代码如下所示。

//监听视频数据到达事件

socket.watchVideoData(function(data){

var senduserid=data.userid;

var videoimage=document.querySelector("img#img_"+ senduserid);

videoimage.src=data.videodata;});

6 客户端音频采集传输接收和播放实现

系统采用视频和音频分开采集的方式,将采集的音频按照最小失真原理,尽可能减少传输的数据,提高系统的性能。

客户端音频处理过程首先使用HTML5提供的getUserMedia方法采集麦克音频,并使用Audio API对其进行过滤处理,将解析的音频数据按采样率打包为二进制数据,通过SocketCluster的群发模式发送给所有参加会议的客户端,客户端接收到音频采样数据后,通过Audio API实现与扬声器连接进行播放。

音频采集使用navigator.getUserMedia({ audio: true },function (stream) {}方法取得stream对象,此对象包含音频的所有信息,包括左右声道数据。

取得音频数据后,创建Audio API的处理对象audioctx=new window.AudioContext();,将采集的音频对导入到此处理对象var auidoinput = audioctx.createMediaStreamSource(stream);,再使用Audio对象创建音频处理缓存对象var scriptNode = audiocontext.createScriptProcessor(1024, 1, 1); 通过此处理对象的采样处理回调函数,取得采集的音频数据,并通过SocketCluster客户端发送给指定的主题,这样所有订阅此主题的Socket客户均可接收到传输的音频数据,其示意代码如下。

scriptNode.onaudioprocess = function(event) {

var left = event.inputBuffer.getChannelData(0);

var leftdata=left;

socket.publish("meeting.audio",leftdata);};

为减少传输的数据量代码中只取得左声道数据发送到Socket主题。

所有SocketClutser的客户端会监听音频主题的数据到达事件,接收到音频数据后,依然使用Audio API的对象解析音频数据,并与目标设备扬声器连接,将处理的音频发送到目标对象实现音频的播放,其简要示意实现代码如下。

msocket.on("meeting.audio",function(data){

var auidosource = audiocontext.createBufferSource();

auidosource.buffer = buffer;

auidosource.connect(audiocontext.destination);

auidosource.start(0); // 0是当前audio context中的同步时间 });

系统经过测试证明,基于Node.js的SocketClutser是高性能的数据传输服务器,其内置的集群支持使得处理能力极大提高。移动视频会议的运行如图2所示。

7 结论

基于Node.js及其Socket集群框架未来可以开发出性能出众的各种实时应用,这是传统架构的软件系统无法达到的,必将成为实时应用开发的主流技术。

未来将深入探索在Node.js架构下以响应式微服务集群模式开发各种实时应用的模式和实现。

参考文献:

[1] 聂晓飞. 基于WebRTC的跨平台视频会议系统的设计与实现[D].北京交通大学,2014.

[2] 刘应天. 时钟共享多线程处理单元的设计与实现[D]. 西安邮电大学,2015.

[3] 王金龙, 宋斌,丁锐. Node.js:一种新的Web应用构建技术[J]. 现代电子技术, 2015(06):70-73.

[4] 杨小娇. 轻量级高并发Web服务器的研究与实现[D].南京邮电大学 2014.

[5] SocketCluster.io.SocketCluster[EB/OL]. http://socketcluster.io/#!/.

[6] 张文. 基于HTML5的视频播控和客户服务系统[D]. 西安电子科技大学, 2014.

[7] 陈迪. 基于HTML5的Web视频会议系统的研究与实现[D]. 华南理工大学, 2015.

[8] 董英茹. 简谈AngularJS在下一代Web开发中的应用[J].软件工程师,2015(5):30-31.

[9] 陈思濛.基于Bootstrap的响应式拼车网站设计与实现[D]. 大连理工大学,2015.

猜你喜欢

视频会议线程音频
省农办主任暨三农重点工作推进视频会议
必须了解的音频基础知识 家庭影院入门攻略:音频认证与推荐标准篇
民政部召开民政领域社会工作推进视频会议
基于Daubechies(dbN)的飞行器音频特征提取
音频分析仪中低失真音频信号的发生方法
浅谈linux多线程协作
浅谈远程视频会议系统的构建
Pro Tools音频剪辑及修正
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
Linux线程实现技术研究