[转载]在线视频聊天(客服)系统开发那点事儿 – 菩提树下的杨过.Net – 博客园.
07年的时候,我所在的公司有一个(在业内游戏开发方面有些名气的)Flash程序员应公司要求,利用FMS开发了一套在线视频导购系统,当时我觉 得很牛叉,用户不用安装任何插件,也不用安装什么聊天软件,就可以直接跟销售员在线交流,遇到对产品不清楚的地方,直接让销售员通过摄像头演示一下产品的 用法,沟通ok后,就直接确定购买。
当时我完全不懂flash,而且微软的silverlight也推出了,我一直希望MS能推出更牛叉更容易的解决方案,让我不用学习新语言也能做出 这样类似的应用(当时SL还不支持摄像头),但是一直等啊等(等到花儿也谢了),SL到4.0才支持摄像头,但却没有推出服务端的解决方案,所以目前在这 方面貌似仍然是Adobe领先。
后来换了一家公司也有同类应用(是用As2.0开发的),正好去年底Flash开发人员有事离开了公司,于是在没人接手的情况下,我被迫开始学习 As3.0和FMS,因为As3.0与As2.0几乎完全不兼容(以前的AS2.0代码基本上全看不懂),于是我尝试用As3.0把这套系统重新写了一 遍。
下面是基本结构图,其实说穿了这玩意儿也极其简单
大致原理:
需要做二个flash:一个用于“视频导购员”,即下图中的ChatServer.swf(以下称为服务端),另一个是给“普通访客”用的,即下图 中的ChatClient.swf(以下称为客户端)
二个flash运行时,都先连接到FMS服务器,同时”服务端flash”将用户名等认证信息传输到FMS服务器,FMS服务器再通过ASPX去请 求数据库查询,以验证”导购(客服)员”的信息是否有效,验证通过后FMS服务器允许连接,此时导购员可将自己的的视频与音频向所有连接到自己的访客广 播。
访客可以发送文字信息给导购员,导购员可以通过语音或文字回复。
注:之所以不让访客也能使用摄像头或耳麦,是为了防止有些BT客户播放一些恶作剧的声音或者做一些不雅的动作干扰导购员。同时这样也节省了带宽,否 则的话,就变成一个单纯的视频多人聊天室了 (再演化下去就变成前些年曾盛极一时的~裸~聊@系$统了,呵呵,当然我们都是走正道的人,这种事儿咱不干, 所以我把这个用于电子商务购物平台上的在线视频导购)
这是运行中的基本界面(尚未美化,难看了一点):
这类系统的基本功能:
01.服务端(Flash)能推送摄像头视频和麦克风音频到客户端(Flash).
02.服务端能显示访客列 表,并能从列表中选择需要交谈的对象,实现一对一的视频/语音广播(当然技术上也可以让所有客户听到导购员的声音,这样显得更真实,会让导航员看上去确实 比较忙,能造点气氛,呵呵)
03.服务端能同时接受所有访客的文字消息及系统消息.
04.服务端对指定访客要有屏蔽(黑名单)功能(防止 恶意骚扰)
05.服务端允许设置快速回复,以提高工作效率。
06.服务端允许暂停视频/音频直播,方便偶尔离开的情况,休息回来后,可继续直播。
06.客户端能调节音频的音量大小.
07.客 户端能在线直接截取视频图象并保存.
08.客户端能随时发送文字消息给服务端(前提是未被列为黑名单的情况下)
09.客户端能显示所有在线的导购员列表,并能切换选择不同的导购员视频/音频。
10.客户端能随时接收系统广播。
另外,对了方便运营商管理和监控,以避免发生一些不良现象(比如个人素质不好的导购员,可能会做出一些不雅的动作或姿态),还需要另做一个管理端 Flash,用于实时监控所有在列的导购员视频(就象小区门卫的监控窗口一样),如果发现不良行为,可以强制让导购员下线。
如果需要保存文字聊天记录或记录导购员及访客的登录时间,也可以在FMS服务器上保存每一条详细记录。
主要技术要点:
1.FMS开发中,Application目录下每一个文件夹即为一个应用,所以最简单的解决办法:有多少个导购员,就建多少个文件夹。
2.多个访客连接某一位导购员,其实就是让这些访客与导购员都连接到FMS的某一个文件夹(应用),只不过main.asc中根据不同的身份做出不 同的反馈;访客切换不同的导购员,相当于重新连接新的Application.
3.服务端文本聊天记录的保存,其实只要把每次发送的文字消息trace一下,就会自动记录在FMS的log记录中。
4.导购在线时间的统计,其实也是在main.asc的onConnect、disConnect事件中可以处理。
5.管理端对所有导购员的监控,其实就是在一个Flash中同时创建N个connection,每个conn连接到对应的导购员应用(文件夹)。
6.黑名单或强制下线功能,其实就是在fms服务端disconnect相应的client连接.
7.FMS与数据库的交互可以通过ASP.NET来完成,鉴于as对xml的支持程度极为友好,我个人倾向于让fms去加载一个RESTful的 wcf来获取数据(wcf返回xml格式),需要保存数据时,也可以让fms把数据post或get到某一个RESTful风格的wcf即可.
可能存在的问题:
在某些情况下,管理层可能需要对导购员在线的时间做统计,把这个做为考核绩效的一项指标。这样就存在一个问题,导购员可以一直把摄像头开着,然后人 跑掉了(或者在线看电影而不是在工作),但系统仍然在不停的计时。
为了解决这个bug,可以在服务端Flash中利用Camera的onActivity事件做一些处理,每当摄像头有活动时,该事件会被触发,如果 长时间画面未动,多半就是人跑掉了,可以向FMS服务器自动发送指令,停止计时。如果要做得更精确,flash社区里有一些很NB的大牛们,创造了视频像 素追踪技术,可以检测某个小范围内的像素(BitmapData)变化情况,感兴趣的朋友可以百度,google.
性能及扩展问题:
windows系统下,如果某个目录下的子文件夹数量过多(比如1w个),将会严重影响IO性能(最典型的表现就是进入该目录时,系统响应极慢), 也就是说如果导购员很多,就得分到不同的服务器,这个其实很好解决,多架设几台服务器分散即可,比如1-100个导购员,放在1号服务器,101-200 个导购员放在2号服务器…,当然如果您的money足够多,业内有很多专业做cdn加速和负载均衡的公司,可以实现集群/CDN的的解决方案(不过那 花费可就hign了去了)。
另外,Adobe官方也有相应的集群解决方案:http://files.cnblogs.com/yjmyzz/Flash%2bMedia%2bServer%2b3%e6%8a%80%e6%9c%af%e6%8c%87%e5%8d%97.pdf 这 是“Flash+Media+Server+3技术指南”,里面有一部分提到了集群部署问题,感兴趣的朋友可以下回去研究。
相关基础技术可参见下面的文章:
Flash/Flex学习笔记(10):FMS 3.5之Hello World!
Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播
Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室
另外FMS3.5安装以后的文档也是极好的参考资料.
后记:
在评论中看到有部分朋友对于这种架构的开发成本(主要是FMS产品的费用)有所担心,其实我很奇怪:大家都在用D版的windows Xp/win7,D版的Office,D版的vs.net,D版的TFS,甚至D版的SQLServer… 好象很少有人担心微软上门来收费,为何就一个FMS,就担心成这样? 🙂
好吧,我承认FMS是收费软件,这确实不能算是这种架构的优势,但其实Adobe是很开放的(不象某水果公司讲的那样),很多标准和协议都是公开 的,所以开源界根据这些标准也有人推出了FMS的替换产品RED5,以下是百度知道上摘抄过来的:
“
Red5的主要功能和Macromedia公司的FMS类似,提供基于Flash的流媒体服务的一款基于Java的开源流媒体服务器。它由 Java语言编写,使用RTMP作为流媒体传输协议,这与FMS完全兼容。它具有流化FLV、MP3文件,实时录制客户端流为FLV文件,共享对象,实时 视频播放、Remoting等功能。用Red5替换FMS后,客户端不用更改可正常运行。
”
注意高亮部分,也就是说,如果你拿fms的免费版本做开发,技术成熟以后,如果出于成本考虑,换成red5,flash端是不用做任何修改的,仅服 务端可能需要重新做些调整即可。
另外关于开发工具的选择,其实flash有很多第三方的开发工具,都不要钱的,并非只有Flash CS与Flex Builder/Flash Builder可选。
Flash不仅仅只是一个嵌在网页中的小动画,其实…它也是一个很舞台很大的平台。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。