Changeset 807
- Timestamp:
- 01/26/10 21:36:50 (3 years ago)
- Location:
- trunk/fl5
- Files:
-
- 7 edited
-
player.swf (modified) (previous)
-
src/com/longtailvideo/jwplayer/media/RTMPMediaProvider.as (modified) (16 diffs)
-
src/com/longtailvideo/jwplayer/model/PlaylistItem.as (modified) (5 diffs)
-
src/com/longtailvideo/jwplayer/model/PlaylistItemLevel.as (modified) (2 diffs)
-
src/com/longtailvideo/jwplayer/player/PlayerVersion.as (modified) (1 diff)
-
src/com/longtailvideo/jwplayer/utils/NetClient.as (modified) (1 diff)
-
src/com/longtailvideo/jwplayer/view/View.as (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/fl5/src/com/longtailvideo/jwplayer/media/RTMPMediaProvider.as
r806 r807 41 41 /** The currently playing RTMP stream. **/ 42 42 private var _currentFile:String; 43 /** The currently active RTMP stream. **/44 private var _currentStream:String;45 43 /** ID for the position interval. **/ 46 44 private var _positionInterval:Number; 47 /** Loader instance that loads the XML file. **/48 private var _xmlLoader :AssetLoader;45 /** Loaders for loading SMIL files. **/ 46 private var _xmlLoaders:Dictionary; 49 47 /** NetStream instance that handles the stream IO. **/ 50 48 private var _stream:NetStream; … … 79 77 _connection.objectEncoding = ObjectEncoding.AMF0; 80 78 _connection.client = new NetClient(this); 81 _xmlLoader = new AssetLoader(); 82 _xmlLoader.addEventListener(Event.COMPLETE, loaderHandler); 83 _xmlLoader.addEventListener(ErrorEvent.ERROR, errorHandler); 79 _xmlLoaders = new Dictionary(); 84 80 _transformer = new SoundTransform(); 85 81 _video = new Video(320, 240); … … 126 122 Configger.saveCookie('bandwidth', bdw); 127 123 if (item.levels.length > 0 && item.getLevel(config.bandwidth, config.width) != item.currentLevel) { 128 item.setLevel(item.getLevel(config.bandwidth, config.width));129 124 swap(item.currentLevel); 130 125 } … … 152 147 _position = 0; 153 148 _bufferFull = false; 154 if (item.levels.length > 0) {155 loadLevelSync();156 }157 149 _timeoffset = item.start; 150 if (item.levels.length > 0) { item.setLevel(item.getLevel(config.bandwidth, config.width)); } 158 151 clearInterval(_positionInterval); 159 152 setState(PlayerState.BUFFERING); 160 153 sendBufferEvent(0); 161 154 if (getConfigProperty('loadbalance')) { 162 if (!item.hasOwnProperty('smil')) { item.smil = []; } 163 item.smilIndex = item.levels.length > 0 ? item.currentLevel : 0; 164 item.smil[item.smilIndex] = item.file; 165 _xmlLoader.load(item.file, XML); 166 } else { 155 loadSmil(); 156 } else { 167 157 finishLoad(); 168 } 169 } 170 158 } 159 } 160 161 /** Load a SMIL file for load-balancing **/ 162 private function loadSmil():void { 163 if (!item.hasOwnProperty('smil')) { 164 item.smil = []; 165 if (item.levels.length > 0) { 166 for (var i:Number = 0; i < item.levels.length; i++) { 167 item.smil[i] = (item.levels[i] as PlaylistItemLevel).file; 168 } 169 } else { 170 item.smil[0] = item.file; 171 } 172 } 173 174 var smilFile:String = item.levels.length > 0 ? item.smil[item.currentLevel] : item.smil[0]; 175 176 var loader:AssetLoader = new AssetLoader(); 177 loader.addEventListener(Event.COMPLETE, loaderHandler); 178 loader.addEventListener(ErrorEvent.ERROR, errorHandler); 179 _xmlLoaders[loader] = smilFile; 180 loader.load(smilFile, XML); 181 } 182 171 183 /** Finalizes the loading process **/ 172 184 private function finishLoad():void { 173 var ext:String = item.file.substr(-4); 174 if (ext == '.mp3'){ 185 if (item.file.substr(-4) == '.mp3') { 175 186 media = null; 176 } else {187 } else if (!media) { 177 188 media = _video; 178 189 } 179 if (item.streamer != _currentStream || !_isStreaming) { 180 _currentStream = item.streamer; 181 sendMediaEvent(MediaEvent.JWPLAYER_MEDIA_LOADED); 182 _connection.connect(item.streamer); 183 } else { 184 seek(_timeoffset); 185 } 186 } 187 188 /** Make sure the selected level is actually the item.file. **/ 189 private function loadLevelSync():void { 190 for (var i:Number = 0; i < item.levels.length; i++) { 191 if (item.file == (item.levels[i] as PlaylistItemLevel).file) { 192 item.setLevel(i); 193 break; 194 } 195 } 196 } 197 190 sendMediaEvent(MediaEvent.JWPLAYER_MEDIA_LOADED); 191 _connection.connect(item.streamer); 192 } 193 198 194 /** Get the streamer / file from the loadbalancing XML. **/ 199 195 private function loaderHandler(evt:Event):void { 200 196 var xml:XML = XML((evt.target as AssetLoader).loadedObject); 201 item.streamer = xml.head.meta.@base.toString();202 197 var fileLocation:String = xml.body.video.@src.toString(); 198 var smilLocation:String = _xmlLoaders[evt.target]; 199 delete _xmlLoaders[evt.target]; 203 200 if (item.levels.length > 0) { 204 (item.levels[item.smilIndex] as PlaylistItemLevel).file = fileLocation; 201 var level:PlaylistItemLevel = item.levels[(item.smil as Array).indexOf(smilLocation)] as PlaylistItemLevel; 202 level.streamer = xml.head.meta.@base.toString(); 203 level.file = fileLocation; 205 204 } else { 206 item.file = fileLocation; 205 item.streamer = xml.head.meta.@base.toString(); 206 item.file = fileLocation; 207 207 } 208 208 finishLoad(); … … 239 239 setStream(); 240 240 } 241 if (dat.code == 'NetStream.Play.TransitionComplete' || (dat.code == 'NetStream.Play.Transition' && dat.reason == 'NetStream.Transition.Success')) {241 if (dat.code == 'NetStream.Play.TransitionComplete') { 242 242 if (_transitionLevel >= 0) { 243 Logger.log("Transition to level " + item.currentLevel + " complete");243 Logger.log("Transition to level " + item.currentLevel + " complete"); 244 244 _transitionLevel = -1; 245 245 } … … 256 256 257 257 clearInterval(_positionInterval); 258 s etState(PlayerState.PAUSED);258 super.pause(); 259 259 if (_stream) { 260 260 Logger.log("NetStream.pause()"); … … 265 265 /** Resume playing. **/ 266 266 override public function play():void { 267 if (_stream) { 267 clearInterval(_positionInterval); 268 if (state == PlayerState.PAUSED) { 268 269 Logger.log("NetStream.resume()"); 269 270 _stream.resume(); 270 271 } 271 clearInterval(_positionInterval); 272 _positionInterval = setInterval(positionInterval, 100); 273 setState(PlayerState.PLAYING); 272 super.play(); 273 _positionInterval = setInterval(positionInterval, 100); 274 274 } 275 275 … … 307 307 if (state == PlayerState.PLAYING) { 308 308 if (item.levels.length > 0 && item.currentLevel != item.getLevel(config.bandwidth, config.width)) { 309 item.setLevel(item.getLevel(config.bandwidth, config.width));310 309 if (_dynamic) { 311 swap(item. currentLevel);310 swap(item.getLevel(config.bandwidth, config.width)); 312 311 } else { 313 312 seek(position); … … 319 318 /** Seek to a new position. **/ 320 319 override public function seek(pos:Number):void { 321 _timeoffset = pos;320 super.seek(pos); 322 321 _transitionLevel = -1; 322 _timeoffset = pos; 323 323 clearInterval(_positionInterval); 324 324 clearInterval(_bandwidthInterval); … … 331 331 } 332 332 } 333 if (state != PlayerState.PLAYING) {333 if (state == PlayerState.PAUSED) { 334 334 play(); 335 335 } … … 343 343 try { 344 344 _stream.play(getID(item.file)); 345 } catch(e:Error) {} 345 } catch(e:Error) { 346 Logger.log("Error: " + e.message); 347 } 346 348 } 347 if (_timeoffset > =0 || state == PlayerState.IDLE) {349 if (_timeoffset > 0 || state == PlayerState.IDLE) { 348 350 if (_stream) { 349 351 Logger.log("NetStream.seek(" + _timeoffset + ")"); … … 378 380 case 'NetConnection.Connect.Success': 379 381 if (evt.info.secureToken != undefined) { 380 _connection.call("secureTokenResponse", null, TEA.decrypt(evt.info.secureToken,381 config.token));382 _connection.call("secureTokenResponse", null, TEA.decrypt(evt.info.secureToken, 383 config.token)); 382 384 } 383 385 if (evt.info.data) { … … 389 391 } else { 390 392 if (item.levels.length > 0) { 391 if (_dynamic || _bandwidth Interval) {393 if (_dynamic || _bandwidthChecked) { 392 394 setStream(); 393 395 } else { … … 478 480 /** Replace file values with original redirects **/ 479 481 if (item.levels.length > 0) { 480 for (var i:Number = 0; i < item.levels.length; i++) {481 if (i < item.smil.length && item.smil[i]) {482 (item.levels[i] as PlaylistItemLevel).file = item.smil[i];482 for each (var level:PlaylistItemLevel in item.levels) { 483 for (var i:Number = 0; i < (item.smil as Array).length; i++) { 484 level.file = item.smil[i]; 483 485 } 484 486 } … … 503 505 } else { 504 506 _transitionLevel = newLevel; 505 Logger.log('transition to level ' + item.currentLevel + ' initiated'); 507 item.setLevel(newLevel); 508 Logger.log('transition to level ' + newLevel + ' initiated'); 506 509 var nso:NetStreamPlayOptions = new NetStreamPlayOptions(); 507 510 nso.streamName = getID(item.file); … … 519 522 _stream.soundTransform = _transformer; 520 523 } 524 525 super.setVolume(vol); 521 526 } 522 527 -
trunk/fl5/src/com/longtailvideo/jwplayer/model/PlaylistItem.as
r805 r807 15 15 public var mediaid:String = ""; 16 16 public var start:Number = 0; 17 public var streamer:String = "";18 17 public var tags:String = ""; 19 18 public var title:String = ""; … … 21 20 22 21 protected var _file:String = ""; 22 protected var _streamer:String = ""; 23 23 protected var _currentLevel:Number = -1; 24 24 protected var _levels:Array = []; … … 32 32 for each (var level:Object in levels) { 33 33 if (level['file'] && level['bitrate'] && level['width']) { 34 addLevel(new PlaylistItemLevel(level['file'], level['bitrate'], level['width'] ));34 addLevel(new PlaylistItemLevel(level['file'], level['bitrate'], level['width'], level['streamer'])); 35 35 } 36 36 } … … 44 44 public function get file():String { 45 45 if (_levels.length > 0 && _currentLevel > -1 && _currentLevel < _levels.length) { 46 return (_levels[_currentLevel] as PlaylistItemLevel).file; 46 var level:PlaylistItemLevel = _levels[_currentLevel] as PlaylistItemLevel; 47 return level.file ? level.file : _file; 47 48 } else { 48 49 return _file; … … 53 54 public function set file(f:String):void { 54 55 _file = f; 56 } 57 58 /** Streamer property is now a getter, to take levels into account **/ 59 public function get streamer():String { 60 if (_levels.length > 0 && _currentLevel > -1 && _currentLevel < _levels.length) { 61 var level:PlaylistItemLevel = _levels[_currentLevel] as PlaylistItemLevel; 62 return level.streamer ? level.streamer : _streamer; 63 } else { 64 return _streamer; 65 } 66 } 67 68 /** Streamer setter. Note, if levels are defined, this will be ignored. **/ 69 public function set streamer(s:String):void { 70 _streamer = s; 55 71 } 56 72 -
trunk/fl5/src/com/longtailvideo/jwplayer/model/PlaylistItemLevel.as
r805 r807 6 6 public var bitrate:Number = 0; 7 7 public var width:Number = 0; 8 public var streamer:String = ""; 8 9 9 10 /** … … 12 13 * @param width - The width of the file 13 14 */ 14 public function PlaylistItemLevel(file:String, bitrate:Number, width:Number ) {15 public function PlaylistItemLevel(file:String, bitrate:Number, width:Number, streamer:String="") { 15 16 this.file = file; 17 this.streamer = streamer; 16 18 this.bitrate = bitrate; 17 19 this.width = width; -
trunk/fl5/src/com/longtailvideo/jwplayer/player/PlayerVersion.as
r806 r807 3 3 4 4 public class PlayerVersion { 5 protected static var _version:String = "5.1.80 6";5 protected static var _version:String = "5.1.807"; 6 6 7 7 public static function get version():String { -
trunk/fl5/src/com/longtailvideo/jwplayer/utils/NetClient.as
r806 r807 95 95 96 96 /** Receive NetStream playback codes. **/ 97 public function onPlayStatus(dat:Object):void { 98 if (dat.code == "NetStream.Play.Complete") { 99 forward(dat, 'complete'); 100 } else { 101 forward(dat, 'playstatus'); 97 public function onPlayStatus(... rest):void { 98 for each (var dat:Object in rest) { 99 if (dat && dat.hasOwnProperty('code')) { 100 if (dat.code == "NetStream.Play.Complete") { 101 forward(dat, 'complete'); 102 } else { 103 forward(dat, 'playstatus'); 104 } 105 } 102 106 } 103 107 } -
trunk/fl5/src/com/longtailvideo/jwplayer/view/View.as
r805 r807 133 133 setupComponents(); 134 134 135 RootReference.stage.addEventListener(Event.FULLSCREEN, resizeHandler);136 135 RootReference.stage.addEventListener(Event.RESIZE, resizeHandler); 137 136 … … 244 243 245 244 protected function resizeHandler(event:Event):void { 246 redraw();247 248 245 var currentFSMode:Boolean = (RootReference.stage.displayState == StageDisplayState.FULL_SCREEN); 249 246 if (_model.fullscreen != currentFSMode) { 250 247 dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_FULLSCREEN, currentFSMode)); 251 248 } 249 250 redraw(); 252 251 } 253 252
Note: See TracChangeset
for help on using the changeset viewer.
