Changeset 12
- Timestamp:
- 06/15/08 16:44:15 (5 years ago)
- Location:
- trunk/as3
- Files:
-
- 12 edited
-
com/jeroenwijering/models/HTTPModel.as (modified) (1 diff)
-
com/jeroenwijering/models/RTMPModel.as (modified) (4 diffs)
-
com/jeroenwijering/models/SoundModel.as (modified) (1 diff)
-
com/jeroenwijering/models/VideoModel.as (modified) (4 diffs)
-
com/jeroenwijering/models/YoutubeModel.as (modified) (1 diff)
-
com/jeroenwijering/parsers/TTParser.as (modified) (1 diff)
-
com/jeroenwijering/player/Player.as (modified) (1 diff)
-
com/jeroenwijering/utils/Playlister.as (modified) (1 diff)
-
com/jeroenwijering/views/CaptionsView.as (modified) (7 diffs)
-
com/jeroenwijering/views/ControlbarView.as (modified) (6 diffs)
-
player.fla (modified) (previous)
-
player.swf (modified) (previous)
Legend:
- Unmodified
- Added
- Removed
-
trunk/as3/com/jeroenwijering/models/HTTPModel.as
r11 r12 278 278 if (h264) { pos += timeoffset; } 279 279 var dur = model.playlist[model.config['item']]['duration']; 280 if(bfr < 100 && pos < Math.abs(dur-stream.bufferTime-1)) {280 if(bfr<100 && pos < Math.abs(dur-stream.bufferTime*2)) { 281 281 model.sendEvent(ModelEvent.BUFFER,{percentage:bfr}); 282 if(model.config['state'] != ModelStates.BUFFERING ) {282 if(model.config['state'] != ModelStates.BUFFERING && bfr<50) { 283 283 model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.BUFFERING}); 284 284 } -
trunk/as3/com/jeroenwijering/models/RTMPModel.as
r8 r12 41 41 connection.addEventListener(NetStatusEvent.NET_STATUS,statusHandler); 42 42 connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR,errorHandler); 43 connection.addEventListener(IOErrorEvent.IO_ERROR,errorHandler); 43 44 connection.objectEncoding = ObjectEncoding.AMF0; 44 45 video = new Video(320,240); … … 101 102 }; 102 103 104 103 105 /** Get id3 information from netstream class. **/ 104 106 public function onID3(info:Object) { 105 var dat = new Object();106 for(var i in info) {107 dat[i] = info[i];108 }109 model.sendEvent(ModelEvent.META,dat);110 };111 112 113 /** Get textdata from netstream. **/114 public function onImageData(info:Object) {115 107 var dat = new Object(); 116 108 for(var i in info) { … … 233 225 evt.info.code == "NetConnection.Connect.Failed") { 234 226 stop(); 235 model.sendEvent(ModelEvent.ERROR,{message:"RTMP stream not found: " +227 model.sendEvent(ModelEvent.ERROR,{message:"RTMP stream not found: "+ 236 228 model.playlist[model.config['item']]['file']}); 237 229 } … … 245 237 clearInterval(timeinterval); 246 238 connection.close(); 247 stream.close();239 if(stream) { stream.close(); } 248 240 video.attachNetStream(null); 249 model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.IDLE});250 241 }; 251 242 -
trunk/as3/com/jeroenwijering/models/SoundModel.as
r8 r12 57 57 private function errorHandler(evt:ErrorEvent) { 58 58 model.sendEvent(ModelEvent.ERROR,{message:evt.text}); 59 stop(); 59 60 }; 60 61 -
trunk/as3/com/jeroenwijering/models/VideoModel.as
r10 r12 87 87 88 88 89 /** Get textdata from netstream. **/90 public function on ImageData(info:Object) {91 var dat = new Object();92 for(var i in info) {93 dat[i] = info[i];94 } 89 /** Handler for captionate events. **/ 90 public function onCaption(cps:String,spk:Number) { 91 var dat = { 92 captions:cps, 93 speaker:spk 94 }; 95 95 model.sendEvent(ModelEvent.META,dat); 96 96 }; 97 98 99 /** Handler for onLastSecond call. **/100 public function onLastSecond(info:Object) { };101 97 102 98 … … 115 111 for(var i in info) { dat[i] = info[i]; } 116 112 model.sendEvent(ModelEvent.META,dat); 113 if(model.playlist[model.config['item']]['start'] > 0) { 114 seek(model.playlist[model.config['item']]['start']); 115 } 117 116 } 118 117 }; … … 167 166 /** Receive NetStream status updates. **/ 168 167 private function statusHandler(evt:NetStatusEvent) { 169 if(evt.info.code == "NetStream.Play.Stop" ) {168 if(evt.info.code == "NetStream.Play.Stop" && stream.bytesLoaded == stream.bytesTotal) { 170 169 clearInterval(timeinterval); 171 170 model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.COMPLETED}); … … 192 191 var pos = Math.round(stream.time*10)/10; 193 192 var dur = model.playlist[model.config['item']]['duration']; 194 if(bfr < 100 && pos < Math.abs(dur-stream.bufferTime -1)) {193 if(bfr < 100 && pos < Math.abs(dur-stream.bufferTime*2)) { 195 194 model.sendEvent(ModelEvent.BUFFER,{percentage:bfr}); 196 if(model.config['state'] != ModelStates.BUFFERING ) {195 if(model.config['state'] != ModelStates.BUFFERING && bfr < 50) { 197 196 model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.BUFFERING}); 198 197 } -
trunk/as3/com/jeroenwijering/models/YoutubeModel.as
r10 r12 119 119 /** Catch youtube errors. **/ 120 120 public function onError(erc:String) { 121 model.sendEvent(ModelEvent.ERROR,{message:'YouTube error: '+erc}); 121 var fil = model.playlist[model.config['item']]['file']; 122 model.sendEvent(ModelEvent.ERROR,{message:"YouTube error (video not found?):\n"+fil}); 122 123 stop(); 123 124 }; -
trunk/as3/com/jeroenwijering/parsers/TTParser.as
r1 r12 72 72 TTParser.style = dat.children()[1].@style; 73 73 } else if(div.@style > 0) { 74 TTParser.style = div.@style; 74 TTParser.style = div.@style; 75 75 } 76 76 for each (var i in div.children()) { -
trunk/as3/com/jeroenwijering/player/Player.as
r11 r12 58 58 plugins:undefined, 59 59 state:undefined, 60 version:'4.0 r1 0',60 version:'4.0 r12', 61 61 width:400 62 62 }; -
trunk/as3/com/jeroenwijering/utils/Playlister.as
r1 r12 97 97 } 98 98 if(_playlist.length == 0) { 99 fmt = 'No suitable playlist elements found.';99 fmt = 'No suitable mediafiles found in this feed.'; 100 100 dispatchEvent(new ErrorEvent(ErrorEvent.ERROR,false,false,fmt)); 101 101 -
trunk/as3/com/jeroenwijering/views/CaptionsView.as
r1 r12 39 39 public function CaptionsView(vie:View) { 40 40 view = vie; 41 view.addControllerListener(ControllerEvent.ERROR,errorHandler); 41 42 view.addControllerListener(ControllerEvent.CAPTION,captionHandler); 42 43 view.addControllerListener(ControllerEvent.ITEM,itemHandler); 43 44 view.addControllerListener(ControllerEvent.RESIZE,resizeHandler); 45 view.addModelListener(ModelEvent.ERROR,errorHandler); 44 46 view.addModelListener(ModelEvent.META,metaHandler); 45 view.addModelListener(ModelEvent.TIME,timeHandler);46 47 view.addModelListener(ModelEvent.STATE,stateHandler); 48 view.addViewListener(ViewEvent.ERROR,errorHandler); 47 49 loader = new URLLoader(); 48 50 loader.addEventListener(Event.COMPLETE,loaderHandler); 49 loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,errorHandler);50 loader.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);51 captions = new Array();52 clip = new MovieClip();53 view.skin.addChild(clip);51 clip = view.skin.captions; 52 clip.field.autoSize = 'center'; 53 if(view.config['caption'] == false) { 54 clip.visible = false; 55 } 54 56 }; 55 57 … … 61 63 62 64 63 /** Draw a caption in specific formatting on stage. **/64 private function drawCaption(nbr:Number) {65 Draw.clear(clip);66 if(nbr > -1) {67 var stl = styles[captions[nbr]['style']];68 var tfd = new TextField();69 tfd.width = view.config['width'];70 tfd.wordWrap = true;71 tfd.autoSize = 'left';72 tfd.multiline = true;73 tfd.selectable = false;74 clip.addChild(tfd);75 tfd.defaultTextFormat = new TextFormat(stl['fontFamily'],stl['fontSize'],'0x'+stl['color'].substr(-6),76 stl['fontWeight'],stl['fontStyle'],null,null,null,stl['textAlign'], stl['padding'], stl['padding'],null,null);77 tfd.text = captions[nbr]['text'];78 if(stl['displayAlign'] == 'center') {79 tfd.y = view.config['height']/2 - tfd.height/2;80 } else if (stl['displayAlign'] == 'after') {81 tfd.y = view.config['height'] - tfd.height - stl['padding'];82 } else {83 tfd.y = stl['padding'];84 }85 if(stl['opacity'] > 0) {86 var rct = Draw.rect(clip,'0x'+stl['backgroundColor'].substr(-6),87 view.config['width'],tfd.height+2*stl['padding'],0,tfd.y-stl['padding'],stl['opacity']);88 clip.swapChildrenAt(0,1);89 } else {90 var flt = new GlowFilter(Number('0x'+stl['backgroundColor'].substr(-6)),100,2,2,10);91 clip.filters = new Array(flt);92 }93 }94 };95 96 97 65 /** Catch security and io errors. **/ 98 private function errorHandler(evt: ErrorEvent) {99 view.sendEvent('ERROR',evt.text);66 private function errorHandler(evt:Object) { 67 setCaption(evt.data.message); 100 68 }; 101 69 … … 103 71 /** Check for captions with a new item. **/ 104 72 private function itemHandler(evt:ControllerEvent) { 73 current = -1; 74 captions = new Array(); 105 75 var cap = view.playlist[evt.data.index]['captions']; 106 76 if(cap && cap != location) { 77 view.addModelListener(ModelEvent.TIME,timeHandler); 107 78 try { 108 79 location = cap; … … 127 98 captions = TTParser.parseCaptions(dat); 128 99 } else { 129 view.sendEvent('ERROR',' This playlist isnot a valid TimedText file.');100 view.sendEvent('ERROR','Captions are not a valid TimedText file.'); 130 101 } 131 102 }; … … 133 104 134 105 /** Resize the captions if the display changes. **/ 135 private function resizeHandler(evt:ControllerEvent) { 106 private function resizeHandler(evt:ControllerEvent=undefined) { 107 clip.back.height = clip.field.height+15; 108 clip.width = view.config['width']; 109 clip.scaleY = clip.scaleX; 110 clip.y = Math.round(view.config['height'] - clip.height); 136 111 }; 137 112 … … 139 114 /** Catch and display captions that are sent through metadata. **/ 140 115 private function metaHandler(evt:ModelEvent) { 116 if (evt.data.text != undefined && evt.data.trackid != undefined) { 117 setCaption(evt.data.text); 118 } else if(evt.data.captions != undefined) { 119 setCaption(evt.data.captions); 120 } 121 }; 122 123 124 /** Set a caption on screen. **/ 125 private function setCaption(txt:String) { 126 clip.field.htmlText = txt; 127 resizeHandler(); 128 }; 129 130 131 /** Check the playback state; hide captions if not playing. **/ 132 private function stateHandler(evt:ModelEvent) { 133 if(view.config['caption'] == true) { 134 clip.visible = true; 135 } else { 136 clip.visible = false; 137 } 141 138 }; 142 139 … … 146 143 var cur = -1; 147 144 var pos = evt.data.position; 148 if (captions.length == 0) { return; }149 145 for(var i=0; i<captions.length; i++) { 150 if((captions[i]['begin'] < pos && captions[i]['end'] && captions[i]['end'] > pos) || 151 (captions[i]['begin'] < pos && !captions[i]['end'] && captions[i+1] && captions[i+1]['begin'] > pos)) { 146 if(captions[i]['begin'] < pos && captions[i]['end'] > pos) { 152 147 cur = i; 153 148 break; 154 149 } 155 150 } 156 if(cur != current) { 151 if(cur == -1) { 152 setCaption(''); 153 } else if(cur != current) { 157 154 current = cur; 158 drawCaption(cur); 159 } 160 }; 161 162 163 /** Check the playback state; hide captions if not playing. **/ 164 private function stateHandler(evt:ModelEvent) { 165 if(evt.data.newState !== ModelStates.PLAYING || evt.data.newState == ModelStates.BUFFERING) { 166 clip.visible = true; 167 } else { 168 clip.visible = false; 155 setCaption(captions[cur]['text']); 169 156 } 170 157 }; -
trunk/as3/com/jeroenwijering/views/ControlbarView.as
r10 r12 174 174 private function resizeHandler(evt:ControllerEvent) { 175 175 var wid = stacker.width; 176 if(view.config['controlbar'] == 'over' || evt.data.fullscreen ==true) {176 if(view.config['controlbar']=='over' || evt.data.fullscreen==true) { 177 177 bar.y = evt.data.height - view.config['controlbarheight']*2; 178 178 if(evt.data.width > 640) { … … 192 192 } 193 193 if(bar.fullscreenButton) { 194 if(view.config['fullscreen'] == false || bar.stage.displayState ==null) {194 if(view.config['fullscreen']==false || bar.stage.displayState==null) { 195 195 bar.fullscreenButton.visible = false; 196 196 bar.normalscreenButton.visible = false; … … 240 240 switch(evt.data.newstate) { 241 241 case ModelStates.PLAYING: 242 if(view.config['controlbar'] == 'over' || bar.stage.displayState == 'fullScreen') { 242 if(view.config['controlbar'] == 'over' || 243 bar.stage.displayState == 'fullScreen') { 243 244 hiding = setTimeout(moveTimeout,1000); 244 view.skin.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);245 view.skin.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler); 245 246 } 246 247 case ModelStates.BUFFERING: … … 251 252 break; 252 253 default: 253 if(view.config['controlbar'] == 'over' || bar.stage.displayState == 'fullScreen') { 254 if(view.config['controlbar'] == 'over' || 255 bar.stage.displayState == 'fullScreen') { 254 256 clearTimeout(hiding); 255 257 Animations.fade(bar,1); 256 view.skin.removeEventListener(MouseEvent.MOUSE_MOVE, moveHandler);258 view.skin.removeEventListener(MouseEvent.MOUSE_MOVE,moveHandler); 257 259 } 258 260 if(bar.playButton && bar.pauseButton) { … … 311 313 /** Handle a press on the timeslider **/ 312 314 private function timedownHandler(evt:MouseEvent) { 313 var rct = new Rectangle(bar.timeSlider.rail.x,bar.timeSlider.icon.y,bar.timeSlider.rail.width,0); 315 var rct = new Rectangle(bar.timeSlider.rail.x, 316 bar.timeSlider.icon.y,bar.timeSlider.rail.width,0); 314 317 bar.timeSlider.icon.startDrag(true,rct); 315 318 bar.stage.addEventListener(MouseEvent.MOUSE_UP,timeupHandler); … … 349 352 /** Handle a move over the volumebar **/ 350 353 private function volumedownHandler(evt:MouseEvent) { 351 var rct = new Rectangle(bar.volumeSlider.rail.x,bar.volumeSlider.icon.y,bar.volumeSlider.rail.width,0); 354 var rct = new Rectangle(bar.volumeSlider.rail.x, 355 bar.volumeSlider.icon.y,bar.volumeSlider.rail.width,0); 352 356 bar.volumeSlider.icon.startDrag(true,rct); 353 357 bar.stage.addEventListener(MouseEvent.MOUSE_UP,volumeupHandler);
Note: See TracChangeset
for help on using the changeset viewer.
