目标:
向某一台FMS推送数据流,该FMS负责向集群内的其他FMS转发,从而为客户端访问均衡到各FMS打下基础。
FMS版本:FMS3.5.2专业版
实现方式:
修改FMS上服务端应用live的源码,增加转发功能。我们知道服务器上源文件asc经过了far工具的压缩处理,想要看到其源码只需要修改其后缀为rar,然后用7ZIP解压即可。
解压后得到main.asc,其代码量并不大,在代码中加入如下函数:
application.onPublish = function(client, myStream) {
nc = new NetConnection();
nc.connect("rtmp://xxxx/live");
//nc.onStatus = function(infoObj)
//{
//
//};
ns = new NetStream(nc);
ns.attach(myStream);
ns.publish(myStream.name,"live");
trace("Clinet Start Publish to FMS!!!!");
};
这样FMS在收到Client的推送请求时,即会建立起一个到IP地址xxxx的连接,我们将客户端推送的流绑定到该连接上,从而实现转发的功能。
自己尝试将修改后的main.asc连同之前解压得到的其他几个文件一起使用far工具打包,得到的main.far实测不能正常工作。后来采用将原始main,rar中
main.asc文件替换为自己修改的版本(使用7zip替换),测试后能实现转发功能。
测试结果:
使用FlashPlayer连接两台FMS后均能正常收到流,但边缘FMS相比源FMS稳定性差很多,较常出现视频的卡顿缓冲。估计是因为多了一次RTMP的转发导致,交换源FMS与边缘FMS,结论还是不变,可以排除是服务器带宽不足导致。
另外,服务器上ASC的调试方法是通过trace写日志到文件中,日志文件位于:
Adobe\Flash Media Server 3.5\logs\_defaultVHost_\live\_definst_ 下。
不知道高版本的FMS是否有所改进,另外是否可以通过为连接添加onStatus回调函数来提高源FMS与边缘FMS之间线路稳定性。
结论:
需要高稳定性的FMS推送集群方案时,建议还是由推送源推送多路给各个FMS服务器,缺点是对推送源的上行带宽要求较高。
今后若有时间再继续深入改进本方案。
参考:
FMS Dev Guide.pdf