Blame view

trunk/research/players/srs_bwt/src/srs_bwt.as 11.4 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
package
{	
	import SrsClass.SrsElapsedTimer;

	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.NetStatusEvent;
	import flash.events.TimerEvent;
	import flash.external.ExternalInterface;
	import flash.net.NetConnection;
	import flash.net.ObjectEncoding;
	import flash.system.System;
	import flash.ui.ContextMenu;
	import flash.ui.ContextMenuItem;
	import flash.utils.Timer;
	import flash.utils.setTimeout;

	public class srs_bwt extends Sprite
	{		
winlin authored
23
		private var connection:NetConnection = null;
24
		
winlin authored
25 26 27 28 29 30 31
		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;
32 33 34 35 36 37 38 39
		
		// server ip get from server
		private var server_ip:String;
		
		// test wheth publish should to stop
		private var stop_pub:Boolean = false;
		
		// js interface
winlin authored
40
		private var js_on_player_ready:String;
41 42 43 44 45 46 47 48 49 50 51
		private var js_update_progress:String;
		private var js_update_status:String;
		
		private var value_progressbar:Number = 0;
		private var max_progressbar:Number = 0;
		
		// set NetConnection ObjectEncoding to AMF0
		NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;
		
		public function srs_bwt()
		{
winlin authored
52 53 54 55 56 57 58 59 60 61 62 63
            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 {
64 65 66 67
			this.stage.scaleMode = StageScaleMode.NO_SCALE;
			this.stage.align = StageAlign.TOP_LEFT;
			
			var flashvars:Object 	   = this.root.loaderInfo.parameters;
winlin authored
68 69 70 71 72 73 74 75 76
            
            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;
77
						
winlin authored
78
			// init context menu
79 80
			var myMenu:ContextMenu  = new ContextMenu();
			myMenu.hideBuiltInItems();
winlin authored
81
			myMenu.customItems.push(new ContextMenuItem("SRS 带宽测试工具", true));
82
			this.contextMenu = myMenu;
winlin authored
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
            
            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();
            
107 108 109 110
			// init connection
			connection = new NetConnection;
			connection.client = this;
			connection.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
winlin authored
111
			connection.connect(url);
112 113 114 115 116 117 118 119 120 121
			//connection.connect("rtmp://192.168.8.234:1935/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com");
			
			// for play to update progress bar
			elapTimer  = new SrsElapsedTimer;
			
			// we suppose the check time = 7 S
			updatePlayProgressTimer = new Timer(100);
			updatePlayProgressTimer.addEventListener(TimerEvent.TIMER, onTimerTimeout);
			updatePlayProgressTimer.start();
		}
winlin authored
122 123 124 125 126 127 128 129 130 131 132 133 134
        private function js_call_stop():void {
            if (connection) {
                connection.close();
                connection = null;
            }
            if (updatePlayProgressTimer) {
                updatePlayProgressTimer.stop();
                updatePlayProgressTimer = null;
            }
            if (elapTimer) {
                elapTimer.restart();
            }
        }
135 136 137 138 139
        
        // srs infos
        private var srs_server:String = null;
        private var srs_primary_authors:String = null;
        private var srs_id:String = null;
140
        private var srs_pid:String = null;
141
        private var srs_server_ip:String = null;
142 143 144 145 146 147 148 149 150
        private function update_context_items():void {
            // for context menu
            var customItems:Array = [new ContextMenuItem("SrsPlayer")];
            if (srs_server != null) {
                customItems.push(new ContextMenuItem("Server: " + srs_server));
            }
            if (srs_primary_authors != null) {
                customItems.push(new ContextMenuItem("PrimaryAuthors: " + srs_primary_authors));
            }
151 152 153
            if (srs_server_ip != null) {
                customItems.push(new ContextMenuItem("SrsIp: " + srs_server_ip));
            }
154 155 156
            if (srs_pid != null) {
                customItems.push(new ContextMenuItem("SrsPid: " + srs_pid));
            }
157 158 159 160 161
            if (srs_id != null) {
                customItems.push(new ContextMenuItem("SrsId: " + srs_id));
            }
            contextMenu.customItems = customItems;
        }
162 163 164
		
		// get NetConnection NetStatusEvent
		public function onStatus(evt:NetStatusEvent) : void{
winlin authored
165 166 167 168
			trace(evt.info.code);
            
            if (evt.info.hasOwnProperty("data") && evt.info.data) {
                if (evt.info.data.hasOwnProperty("srs_server")) {
169
                    srs_server = evt.info.data.srs_server;
winlin authored
170
                }
winlin authored
171
                if (evt.info.data.hasOwnProperty("srs_primary_authors")) {
172 173 174 175
                    srs_primary_authors = evt.info.data.srs_primary_authors;
                }
                if (evt.info.data.hasOwnProperty("srs_id")) {
                    srs_id = evt.info.data.srs_id;
winlin authored
176
                }
177 178 179
                if (evt.info.data.hasOwnProperty("srs_pid")) {
                    srs_pid = evt.info.data.srs_pid;
                }
180 181 182
                if (evt.info.data.hasOwnProperty("srs_server_ip")) {
                    srs_server_ip = evt.info.data.srs_server_ip;
                }
183
                update_context_items();
winlin authored
184 185
            }
            
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
			switch(evt.info.code){
				case "NetConnection.Connect.Failed":
					updateState("连接服务器失败!");
					break;
				case "NetConnection.Connect.Rejected":
					updateState("服务器拒绝连接!");
					break;
				case "NetConnection.Connect.Success":
					server_ip = evt.info.data.srs_server_ip;
					updateState("连接服务器成功!");
					break;
				case "NetConnection.Connect.Closed":
					//updateState("连接已断开!");
					break;
			}
		}
winlin authored
202 203 204 205 206 207
        
        public function onTimerTimeout(evt:TimerEvent):void
        {	
            value_progressbar = elapTimer.elapsed();
            updateProgess(value_progressbar, max_progressbar);
        }
208 209 210 211 212 213 214 215 216 217
		
		/**
		 * NetConnection callback this function, when recv server call "onSrsBandCheckStartPlayBytes"
		 * then start @updatePlayProgressTimer for updating the progressbar
		 * */
		public function onSrsBandCheckStartPlayBytes(evt:Object):void{			
			var duration_ms:Number = evt.duration_ms;
			var interval_ms:Number = evt.interval_ms;
			
			connection.call("onSrsBandCheckStartingPlayBytes", null);
winlin authored
218
			updateState("开始测试下行带宽,服务器IP:" + server_ip);
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
			
			// we suppose play duration_ms = pub duration_ms
			max_progressbar = duration_ms * 2;
		}
		
		public function onSrsBandCheckPlaying(evt:Object):void{
		}
		
		public function onSrsBandCheckStopPlayBytes(evt:Object):void{			
			var duration_ms:Number = evt.duration_ms;
			var interval_ms:Number = evt.interval_ms;
			var duration_delta:Number = evt.duration_delta;
			var bytes_delta:Number = evt.bytes_delta;
			
			var kbps:Number = 0;
			if(duration_delta > 0){
				kbps = bytes_delta * 8.0 / duration_delta; // b/ms == kbps
			}
			kbps = (int(kbps * 10))/10.0;

			flash.utils.setTimeout(stopPlayTest, 0);
240
            updateState("下行带宽测试完毕,服务器: " + server_ip + "," + kbps + "kbps,开始测试上行带宽。");
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
		}
		
		private function stopPlayTest():void{
			connection.call("onSrsBandCheckStoppedPlayBytes", null);
		}
		
		public function onSrsBandCheckStartPublishBytes(evt:Object):void{			
			var duration_ms:Number = evt.duration_ms;
			var interval_ms:Number = evt.interval_ms;
						
			connection.call("onSrsBandCheckStartingPublishBytes", null);
			
			flash.utils.setTimeout(publisher, 0);
		}
		
		private function publisher():void{
			if (stop_pub) {
				return;
			}
			
			var data:Array = new Array();
			
			var data_size:int = 100;
			for(var i:int; i < data_size; i++){
				data.push("SrS band check data from client's publishing......");
			}
			data_size += 100;
			connection.call("onSrsBandCheckPublishing", null, data);
						
			flash.utils.setTimeout(publisher, 0);			
		}
		
		public function onSrsBandCheckStopPublishBytes(evt:Object):void{
			var duration_ms:Number = evt.duration_ms;
			var interval_ms:Number = evt.interval_ms;
			var duration_delta:Number = evt.duration_delta;
			var bytes_delta:Number = evt.bytes_delta;
			
			var kbps:Number = 0;
			if(duration_delta > 0){
				kbps = bytes_delta * 8.0 / duration_delta; // b/ms == kbps
			}
			kbps = (int(kbps * 10))/10.0;
			
			stopPublishTest();
		}
		
		private function stopPublishTest():void{
			if(connection.connected){
				connection.call("onSrsBandCheckStoppedPublishBytes", null);
			}
			stop_pub = true;
			
			value_progressbar = max_progressbar;
			updateProgess(value_progressbar, max_progressbar);
			updatePlayProgressTimer.stop();
		}
		
		public function onSrsBandCheckFinished(evt:Object):void{			
			var code:Number = evt.code;
			var start_time:Number = evt.start_time;
			var end_time:Number = evt.end_time;
			var play_kbps:Number = evt.play_kbps;
			var publish_kbps:Number = evt.publish_kbps;
			var play_bytes:Number = evt.play_bytes;
			var play_time:Number = evt.play_time;
			var publish_bytes:Number = evt.publish_bytes;
			var publish_time:Number = evt.publish_time;
			
			updateState("检测结束: 服务器: " + server_ip + " 上行: " + publish_kbps + " kbps" + " 下行: " + play_kbps + " kbps"
				+ " 测试时间: " + (end_time-start_time)/1000 + " 秒");
			connection.call("finalClientPacket", null);
		}
		
		// update progressBar's value
		private function updateProgess(value:Number, maxValue:Number):void{
winlin authored
317
			flash.external.ExternalInterface.call(this.js_update_progress, this.js_id, value * 100 / maxValue);
318 319 320 321 322
			trace(value + "-" + maxValue + "-" + value * 100 / maxValue + "%");
		}
		
		// update checking status
		private function updateState(text:String):void{
winlin authored
323
			flash.external.ExternalInterface.call(this.js_update_status, this.js_id, text);
324 325
			trace(text);
		}
winlin authored
326 327 328
        
        public function onBWDone():void{
        }
329 330
	}
}