diff --git a/trunk/research/players/js/srs.bandwidth.js b/trunk/research/players/js/srs.bandwidth.js index 79c51e2f8..1b63b2ac8 100755 --- a/trunk/research/players/js/srs.bandwidth.js +++ b/trunk/research/players/js/srs.bandwidth.js @@ -1,27 +1,136 @@ -// for bw to init url -// url: scheme://host:port/path?query#fragment -function srs_init_bwt(rtmp_url, hls_url) { - update_nav(); - - if (rtmp_url) { - //var query = parse_query_string(); - var search_filed = String(window.location.search).replace(" ", "").split("?")[1]; - $(rtmp_url).val("rtmp://" + window.location.host + ":" + 1935 + "/app?" + search_filed); - } - if (hls_url) { - $(hls_url).val(build_default_hls_url()); - } -} - -function srs_bwt_check_url(url) { - if (url.indexOf("key") != -1 && url.indexOf("vhost") != -1) { - return true; - } - - return false; -} - -function srs_bwt_build_default_url() { - var url_default = "rtmp://" + window.location.host + ":" + 1935 + "/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com"; - return url_default; +/** +* the SrsBandwidth object. +* @param container the html container id. +* @param width a float value specifies the width of bandwidth. +* @param height a float value specifies the height of bandwidth. +* @param private_object [optional] an object that used as private object, +* for example, the logic chat object which owner this bandwidth. +*/ +function SrsBandwidth(container, width, height, private_object) { + if (!SrsBandwidth.__id) { + SrsBandwidth.__id = 100; + } + if (!SrsBandwidth.__bandwidths) { + SrsBandwidth.__bandwidths = []; + } + + SrsBandwidth.__bandwidths.push(this); + + this.private_object = private_object; + this.container = container; + this.width = width; + this.height = height; + this.id = SrsBandwidth.__id++; + this.stream_url = null; + this.callbackObj = null; + + // the callback set data. + this.percent = 0; + this.status = ""; +} +/** +* user can set some callback, then start the bandwidth. +* @param url the bandwidth test url. +* callbacks: +* on_bandwidth_ready():void, when srs bandwidth ready, user can play. +* on_update_progress(percent:Number):void, when srs bandwidth update the progress. +* percent:Number 100 means 100%. +* on_update_status(status:String):void, when srs bandwidth update the status. +* status:String the human readable status text. +*/ +SrsBandwidth.prototype.start = function(url) { + if (url) { + this.stream_url = url; + } + + // embed the flash. + var flashvars = {}; + flashvars.id = this.id; + flashvars.on_bandwidth_ready = "__srs_on_bandwidth_ready"; + flashvars.on_update_progress = "__srs_on_update_progress"; + flashvars.on_update_status = "__srs_on_update_status"; + + var params = {}; + params.wmode = "opaque"; + params.allowFullScreen = "true"; + params.allowScriptAccess = "always"; + + var attributes = {}; + + var self = this; + + swfobject.embedSWF( + "srs_bwt/release/srs_bwt.swf?_version="+srs_get_version_code(), + this.container, + this.width, this.height, + "11.1.0", "js/AdobeFlashbandwidthInstall.swf", + flashvars, params, attributes, + function(callbackObj){ + self.callbackObj = callbackObj; + } + ); + + return this; +} +/** +* play the stream. +* @param stream_url the url of stream, rtmp or http. +* @param volume the volume, 0 is mute, 1 is 100%, 2 is 200%. +*/ +SrsBandwidth.prototype.check_bandwidth = function(url) { + this.stop(); + SrsBandwidth.__bandwidths.push(this); + + if (url) { + this.stream_url = url; + } + + this.callbackObj.ref.__check_bandwidth(this.stream_url); +} +SrsBandwidth.prototype.stop = function(url) { + for (var i = 0; i < SrsBandwidth.__bandwidths.length; i++) { + var bandwidth = SrsBandwidth.__bandwidths[i]; + + if (bandwidth.id != this.id) { + continue; + } + + SrsBandwidth.__bandwidths.splice(i, 1); + break; + } + + this.callbackObj.ref.__stop(); +} +SrsBandwidth.prototype.on_bandwidth_ready = function() { +} +SrsBandwidth.prototype.on_update_progress = function(percent) { +} +SrsBandwidth.prototype.on_update_status = function(status) { +} +function __srs_find_bandwidth(id) { + for (var i = 0; i < SrsBandwidth.__bandwidths.length; i++) { + var bandwidth = SrsBandwidth.__bandwidths[i]; + + if (bandwidth.id != id) { + continue; + } + + return bandwidth; + } + + throw new Error("bandwidth not found. id=" + id); +} +function __srs_on_bandwidth_ready(id) { + var bandwidth = __srs_find_bandwidth(id); + bandwidth.on_bandwidth_ready(); +} +function __srs_on_update_progress(id, percent) { + var bandwidth = __srs_find_bandwidth(id); + bandwidth.percent = percent; + bandwidth.on_update_progress(percent); +} +function __srs_on_update_status(id, status) { + var bandwidth = __srs_find_bandwidth(id); + bandwidth.status = status; + bandwidth.on_update_status(status); } \ No newline at end of file diff --git a/trunk/research/players/js/srs.page.js b/trunk/research/players/js/srs.page.js index 68ce4bd6c..9fd0a5780 100755 --- a/trunk/research/players/js/srs.page.js +++ b/trunk/research/players/js/srs.page.js @@ -80,6 +80,18 @@ function build_default_publish_rtmp_url() { return "rtmp://" + server + ":" + port + "/" + app + "...vhost..." + vhost + "/" + stream; } } +// for the bandwidth tool to init page +function build_default_bandwidth_rtmp_url() { + var query = parse_query_string(); + + var server = (query.server == undefined)? window.location.hostname:query.server; + var port = (query.port == undefined)? 1935:query.port; + var vhost = (query.vhost == undefined)? "bandcheck.srs.com":query.vhost; + var app = (query.app == undefined)? "app":query.app; + var key = (query.key == undefined)? "35c9b402c12a7246868752e2878f7e0e":query.key; + + return "rtmp://" + server + ":" + port + "/" + app + "?key=" + key + "&vhost=" + vhost; +} /** @param server the ip of server. default to window.location.hostname @@ -139,6 +151,15 @@ function srs_init_publish(rtmp_url) { $(rtmp_url).val(build_default_publish_rtmp_url()); } } +// for bw to init url +// url: scheme://host:port/path?query#fragment +function srs_init_bwt(rtmp_url, hls_url) { + update_nav(); + + if (rtmp_url) { + $(rtmp_url).val(build_default_bandwidth_rtmp_url()); + } +} // check whether can republish function srs_can_republish() { diff --git a/trunk/research/players/js/srs.player.js b/trunk/research/players/js/srs.player.js index 3d9da3bb5..dad0ba927 100755 --- a/trunk/research/players/js/srs.player.js +++ b/trunk/research/players/js/srs.player.js @@ -63,7 +63,7 @@ SrsPlayer.prototype.start = function(url) { "srs_player/release/srs_player.swf?_version="+srs_get_version_code(), this.container, this.width, this.height, - "11.1", "js/AdobeFlashPlayerInstall.swf", + "11.1.0", "js/AdobeFlashPlayerInstall.swf", flashvars, params, attributes, function(callbackObj){ self.callbackObj = callbackObj; diff --git a/trunk/research/players/js/srs.publisher.js b/trunk/research/players/js/srs.publisher.js index 50363e7d5..25f29bfed 100755 --- a/trunk/research/players/js/srs.publisher.js +++ b/trunk/research/players/js/srs.publisher.js @@ -73,7 +73,7 @@ SrsPublisher.prototype.start = function() { "srs_publisher/release/srs_publisher.swf?_version="+srs_get_version_code(), this.container, this.width, this.height, - "11.1", "js/AdobeFlashPlayerInstall.swf", + "11.1.0", "js/AdobeFlashPlayerInstall.swf", flashvars, params, attributes, function(callbackObj){ self.callbackObj = callbackObj; diff --git a/trunk/research/players/srs_bwt.html b/trunk/research/players/srs_bwt.html index 3f68ea6b5..dc2593adb 100755 --- a/trunk/research/players/srs_bwt.html +++ b/trunk/research/players/srs_bwt.html @@ -12,113 +12,60 @@ - - + @@ -141,38 +88,43 @@
- +
+ + Usage: 点击“开始测速”即可测带宽,最大可测试带宽由服务器限制 +
URL: - + -
- +
-
+
+
+
diff --git a/trunk/research/players/srs_bwt/.actionScriptProperties b/trunk/research/players/srs_bwt/.actionScriptProperties index cd87f23d7..f95be3da9 100755 --- a/trunk/research/players/srs_bwt/.actionScriptProperties +++ b/trunk/research/players/srs_bwt/.actionScriptProperties @@ -1,6 +1,6 @@ - + @@ -17,13 +17,13 @@ - - + + - + diff --git a/trunk/research/players/srs_bwt/release/srs_bwt.swf b/trunk/research/players/srs_bwt/release/srs_bwt.swf index 3e8978311..c540d3825 100755 Binary files a/trunk/research/players/srs_bwt/release/srs_bwt.swf and b/trunk/research/players/srs_bwt/release/srs_bwt.swf differ diff --git a/trunk/research/players/srs_bwt/src/srs_bwt.as b/trunk/research/players/srs_bwt/src/srs_bwt.as index ef69cc8c8..4e21cef83 100755 --- a/trunk/research/players/srs_bwt/src/srs_bwt.as +++ b/trunk/research/players/srs_bwt/src/srs_bwt.as @@ -20,10 +20,15 @@ package public class srs_bwt extends Sprite { - private var connection:NetConnection; + private var connection:NetConnection = null; - private var updatePlayProgressTimer:Timer; - private var elapTimer:SrsElapsedTimer; + private var updatePlayProgressTimer:Timer = null; + private var elapTimer:SrsElapsedTimer = null; + + // user set id. + private var js_id:String = null; + // play param url. + private var user_url:String = null; // server ip get from server private var server_ip:String; @@ -32,8 +37,8 @@ package private var stop_pub:Boolean = false; // js interface + private var js_on_player_ready:String; private var js_update_progress:String; - private var js_progress_reset:String; private var js_update_status:String; private var value_progressbar:Number = 0; @@ -44,25 +49,66 @@ package public function srs_bwt() { + if (!this.stage) { + this.addEventListener(Event.ADDED_TO_STAGE, this.system_on_add_to_stage); + } else { + this.system_on_add_to_stage(null); + } + } + + /** + * system event callback, when this control added to stage. + * the main function. + */ + private function system_on_add_to_stage(evt:Event):void { this.stage.scaleMode = StageScaleMode.NO_SCALE; this.stage.align = StageAlign.TOP_LEFT; var flashvars:Object = this.root.loaderInfo.parameters; - this.js_update_progress = flashvars.update_progress; - this.js_progress_reset = flashvars.progress_reset; - this.js_update_status = flashvars.update_status; + + if (!flashvars.hasOwnProperty("id")) { + throw new Error("must specifies the id"); + } + + this.js_id = flashvars.id; + this.js_on_player_ready = flashvars.on_bandwidth_ready; + this.js_update_progress = flashvars.on_update_progress; + this.js_update_status = flashvars.on_update_status; - // init context menu, add action "Srs 带宽测试工具 0.1" + // init context menu var myMenu:ContextMenu = new ContextMenu(); myMenu.hideBuiltInItems(); - myMenu.customItems.push(new ContextMenuItem("Srs 带宽测试工具 0.1", true)); + myMenu.customItems.push(new ContextMenuItem("SRS 带宽测试工具", true)); this.contextMenu = myMenu; - + + flash.utils.setTimeout(this.system_on_js_ready, 0); + } + + /** + * system callack event, when js ready, register callback for js. + * the actual main function. + */ + private function system_on_js_ready():void { + if (!flash.external.ExternalInterface.available) { + trace("js not ready, try later."); + flash.utils.setTimeout(this.system_on_js_ready, 100); + return; + } + + flash.external.ExternalInterface.addCallback("__check_bandwidth", this.js_call_check_bandwidth); + flash.external.ExternalInterface.addCallback("__stop", this.js_call_stop); + + flash.external.ExternalInterface.call(this.js_on_player_ready, this.js_id); + } + + private function js_call_check_bandwidth(url:String):void { + js_call_stop(); + // init connection connection = new NetConnection; connection.client = this; connection.addEventListener(NetStatusEvent.NET_STATUS, onStatus); - connection.connect(flashvars.url); + connection.connect(url); //connection.connect("rtmp://192.168.8.234:1935/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com"); // for play to update progress bar @@ -73,10 +119,36 @@ package updatePlayProgressTimer.addEventListener(TimerEvent.TIMER, onTimerTimeout); updatePlayProgressTimer.start(); } + private function js_call_stop():void { + if (connection) { + connection.close(); + connection = null; + } + if (updatePlayProgressTimer) { + updatePlayProgressTimer.stop(); + updatePlayProgressTimer = null; + } + if (elapTimer) { + elapTimer.restart(); + } + } // get NetConnection NetStatusEvent public function onStatus(evt:NetStatusEvent) : void{ - trace(evt.info.code); + trace(evt.info.code); + + if (evt.info.hasOwnProperty("data") && evt.info.data) { + // for context menu + var customItems:Array = [new ContextMenuItem("SrsPlayer")]; + if (evt.info.data.hasOwnProperty("srs_server")) { + customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server)); + } + if (evt.info.data.hasOwnProperty("srs_contributor")) { + customItems.push(new ContextMenuItem("Contributor: " + evt.info.data.srs_contributor)); + } + contextMenu.customItems = customItems; + } + switch(evt.info.code){ case "NetConnection.Connect.Failed": updateState("连接服务器失败!"); @@ -92,8 +164,13 @@ package //updateState("连接已断开!"); break; } - } + + public function onTimerTimeout(evt:TimerEvent):void + { + value_progressbar = elapTimer.elapsed(); + updateProgess(value_progressbar, max_progressbar); + } /** * NetConnection callback this function, when recv server call "onSrsBandCheckStartPlayBytes" @@ -104,20 +181,13 @@ package var interval_ms:Number = evt.interval_ms; connection.call("onSrsBandCheckStartingPlayBytes", null); - updateState("测试下行带宽(" + server_ip + ")"); + updateState("开始测试下行带宽,服务器IP:" + server_ip); // we suppose play duration_ms = pub duration_ms max_progressbar = duration_ms * 2; } public function onSrsBandCheckPlaying(evt:Object):void{ - - } - - public function onTimerTimeout(evt:TimerEvent):void - { - value_progressbar = elapTimer.elapsed(); - updateProgess(value_progressbar, max_progressbar); } public function onSrsBandCheckStopPlayBytes(evt:Object):void{ @@ -133,6 +203,7 @@ package kbps = (int(kbps * 10))/10.0; flash.utils.setTimeout(stopPlayTest, 0); + updateState("下行带宽测试完毕:" + kbps + "kbps,开始测试上行带宽。"); } private function stopPlayTest():void{ @@ -144,7 +215,6 @@ package var interval_ms:Number = evt.interval_ms; connection.call("onSrsBandCheckStartingPublishBytes", null); - updateState("测试上行带宽(" + server_ip + ")"); flash.utils.setTimeout(publisher, 0); } @@ -208,20 +278,19 @@ package connection.call("finalClientPacket", null); } - public function onBWDone():void{ - // do nothing - } - // update progressBar's value private function updateProgess(value:Number, maxValue:Number):void{ - flash.external.ExternalInterface.call(this.js_update_progress, value * 100 / maxValue + "%"); + flash.external.ExternalInterface.call(this.js_update_progress, this.js_id, value * 100 / maxValue); trace(value + "-" + maxValue + "-" + value * 100 / maxValue + "%"); } // update checking status private function updateState(text:String):void{ - flash.external.ExternalInterface.call(this.js_update_status, text); + flash.external.ExternalInterface.call(this.js_update_status, this.js_id, text); trace(text); } + + public function onBWDone():void{ + } } } \ No newline at end of file