Changeset 12


Ignore:
Timestamp:
06/15/08 16:44:15 (5 years ago)
Author:
jeroen
Message:

added caption display for 3GPP and Captionate

Location:
trunk/as3
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/as3/com/jeroenwijering/models/HTTPModel.as

    r11 r12  
    278278                if (h264) { pos += timeoffset; } 
    279279                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)) { 
    281281                        model.sendEvent(ModelEvent.BUFFER,{percentage:bfr}); 
    282                         if(model.config['state'] != ModelStates.BUFFERING) { 
     282                        if(model.config['state'] != ModelStates.BUFFERING  && bfr<50) { 
    283283                                model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.BUFFERING}); 
    284284                        } 
  • trunk/as3/com/jeroenwijering/models/RTMPModel.as

    r8 r12  
    4141                connection.addEventListener(NetStatusEvent.NET_STATUS,statusHandler); 
    4242                connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR,errorHandler); 
     43                connection.addEventListener(IOErrorEvent.IO_ERROR,errorHandler); 
    4344                connection.objectEncoding = ObjectEncoding.AMF0; 
    4445                video = new Video(320,240); 
     
    101102        }; 
    102103 
     104 
    103105        /** Get id3 information from netstream class. **/ 
    104106        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) { 
    115107                var dat = new Object(); 
    116108                for(var i in info) {  
     
    233225                        evt.info.code == "NetConnection.Connect.Failed") { 
    234226                        stop(); 
    235                         model.sendEvent(ModelEvent.ERROR,{message:"RTMP stream not found: " +  
     227                        model.sendEvent(ModelEvent.ERROR,{message:"RTMP stream not found: "+ 
    236228                                model.playlist[model.config['item']]['file']}); 
    237229                } 
     
    245237                clearInterval(timeinterval); 
    246238                connection.close(); 
    247                 stream.close(); 
     239                if(stream) { stream.close(); } 
    248240                video.attachNetStream(null); 
    249                 model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.IDLE}); 
    250241        }; 
    251242 
  • trunk/as3/com/jeroenwijering/models/SoundModel.as

    r8 r12  
    5757        private function errorHandler(evt:ErrorEvent) { 
    5858                model.sendEvent(ModelEvent.ERROR,{message:evt.text}); 
     59                stop(); 
    5960        }; 
    6061 
  • trunk/as3/com/jeroenwijering/models/VideoModel.as

    r10 r12  
    8787 
    8888 
    89         /** Get textdata from netstream. **/ 
    90         public function onImageData(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                }; 
    9595                model.sendEvent(ModelEvent.META,dat); 
    9696        }; 
    97  
    98  
    99         /** Handler for onLastSecond call. **/ 
    100         public function onLastSecond(info:Object) { }; 
    10197 
    10298 
     
    115111                        for(var i in info) { dat[i] = info[i]; } 
    116112                        model.sendEvent(ModelEvent.META,dat); 
     113                        if(model.playlist[model.config['item']]['start'] > 0) { 
     114                                seek(model.playlist[model.config['item']]['start']); 
     115                        } 
    117116                } 
    118117        }; 
     
    167166        /** Receive NetStream status updates. **/ 
    168167        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) { 
    170169                        clearInterval(timeinterval); 
    171170                        model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.COMPLETED}); 
     
    192191                var pos = Math.round(stream.time*10)/10; 
    193192                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)) { 
    195194                        model.sendEvent(ModelEvent.BUFFER,{percentage:bfr}); 
    196                         if(model.config['state'] != ModelStates.BUFFERING) { 
     195                        if(model.config['state'] != ModelStates.BUFFERING && bfr < 50) { 
    197196                                model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.BUFFERING}); 
    198197                        } 
  • trunk/as3/com/jeroenwijering/models/YoutubeModel.as

    r10 r12  
    119119        /** Catch youtube errors. **/ 
    120120        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}); 
    122123                stop(); 
    123124        }; 
  • trunk/as3/com/jeroenwijering/parsers/TTParser.as

    r1 r12  
    7272                        TTParser.style = dat.children()[1].@style; 
    7373                } else if(div.@style > 0) { 
    74                         TTParser.style = div.@style;  
     74                        TTParser.style = div.@style; 
    7575                } 
    7676                for each (var i in div.children()) { 
  • trunk/as3/com/jeroenwijering/player/Player.as

    r11 r12  
    5858                plugins:undefined, 
    5959                state:undefined, 
    60                 version:'4.0 r10', 
     60                version:'4.0 r12', 
    6161                width:400 
    6262        }; 
  • trunk/as3/com/jeroenwijering/utils/Playlister.as

    r1 r12  
    9797                } 
    9898                if(_playlist.length == 0) {  
    99                         fmt = 'No suitable playlist elements found.'; 
     99                        fmt = 'No suitable mediafiles found in this feed.'; 
    100100                        dispatchEvent(new ErrorEvent(ErrorEvent.ERROR,false,false,fmt)); 
    101101                         
  • trunk/as3/com/jeroenwijering/views/CaptionsView.as

    r1 r12  
    3939        public function CaptionsView(vie:View) { 
    4040                view = vie; 
     41                view.addControllerListener(ControllerEvent.ERROR,errorHandler); 
    4142                view.addControllerListener(ControllerEvent.CAPTION,captionHandler); 
    4243                view.addControllerListener(ControllerEvent.ITEM,itemHandler); 
    4344                view.addControllerListener(ControllerEvent.RESIZE,resizeHandler); 
     45                view.addModelListener(ModelEvent.ERROR,errorHandler); 
    4446                view.addModelListener(ModelEvent.META,metaHandler); 
    45                 view.addModelListener(ModelEvent.TIME,timeHandler); 
    4647                view.addModelListener(ModelEvent.STATE,stateHandler); 
     48                view.addViewListener(ViewEvent.ERROR,errorHandler); 
    4749                loader = new URLLoader(); 
    4850                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                } 
    5456        }; 
    5557 
     
    6163 
    6264 
    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  
    9765        /** 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); 
    10068        }; 
    10169 
     
    10371        /** Check for captions with a new item. **/ 
    10472        private function itemHandler(evt:ControllerEvent) { 
     73                current = -1; 
     74                captions = new Array(); 
    10575                var cap = view.playlist[evt.data.index]['captions']; 
    10676                if(cap && cap != location) { 
     77                        view.addModelListener(ModelEvent.TIME,timeHandler); 
    10778                        try { 
    10879                                location = cap; 
     
    12798                        captions = TTParser.parseCaptions(dat); 
    12899                } else { 
    129                         view.sendEvent('ERROR','This playlist is not a valid TimedText file.'); 
     100                        view.sendEvent('ERROR','Captions are not a valid TimedText file.'); 
    130101                } 
    131102        }; 
     
    133104 
    134105        /** 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); 
    136111        }; 
    137112 
     
    139114        /** Catch and display captions that are sent through metadata. **/ 
    140115        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                } 
    141138        }; 
    142139 
     
    146143                var cur = -1; 
    147144                var pos = evt.data.position; 
    148                 if (captions.length == 0) { return; } 
    149145                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) { 
    152147                                cur = i; 
    153148                                break; 
    154149                        } 
    155150                } 
    156                 if(cur != current) { 
     151                if(cur == -1) { 
     152                        setCaption(''); 
     153                } else if(cur != current) { 
    157154                        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']); 
    169156                } 
    170157        }; 
  • trunk/as3/com/jeroenwijering/views/ControlbarView.as

    r10 r12  
    174174        private function resizeHandler(evt:ControllerEvent) { 
    175175                var wid = stacker.width; 
    176                 if(view.config['controlbar'] == 'over' || evt.data.fullscreen == true) { 
     176                if(view.config['controlbar']=='over' || evt.data.fullscreen==true) { 
    177177                        bar.y = evt.data.height - view.config['controlbarheight']*2; 
    178178                        if(evt.data.width > 640) {  
     
    192192                } 
    193193                if(bar.fullscreenButton) { 
    194                         if(view.config['fullscreen'] == false || bar.stage.displayState == null) { 
     194                        if(view.config['fullscreen']==false || bar.stage.displayState==null) { 
    195195                                bar.fullscreenButton.visible = false; 
    196196                                bar.normalscreenButton.visible = false; 
     
    240240                switch(evt.data.newstate) {  
    241241                        case ModelStates.PLAYING: 
    242                                 if(view.config['controlbar'] == 'over' || bar.stage.displayState == 'fullScreen') { 
     242                                if(view.config['controlbar'] == 'over' ||  
     243                                        bar.stage.displayState == 'fullScreen') { 
    243244                                        hiding = setTimeout(moveTimeout,1000); 
    244                                         view.skin.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler); 
     245                                        view.skin.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler); 
    245246                                } 
    246247                        case ModelStates.BUFFERING: 
     
    251252                                break; 
    252253                        default:  
    253                                 if(view.config['controlbar'] == 'over' || bar.stage.displayState == 'fullScreen') { 
     254                                if(view.config['controlbar'] == 'over' ||  
     255                                        bar.stage.displayState == 'fullScreen') { 
    254256                                        clearTimeout(hiding); 
    255257                                        Animations.fade(bar,1); 
    256                                         view.skin.removeEventListener(MouseEvent.MOUSE_MOVE, moveHandler); 
     258                                        view.skin.removeEventListener(MouseEvent.MOUSE_MOVE,moveHandler); 
    257259                                } 
    258260                                if(bar.playButton && bar.pauseButton) { 
     
    311313        /** Handle a press on the timeslider **/ 
    312314        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); 
    314317                bar.timeSlider.icon.startDrag(true,rct); 
    315318        bar.stage.addEventListener(MouseEvent.MOUSE_UP,timeupHandler); 
     
    349352        /** Handle a move over the volumebar **/ 
    350353        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); 
    352356                bar.volumeSlider.icon.startDrag(true,rct); 
    353357                bar.stage.addEventListener(MouseEvent.MOUSE_UP,volumeupHandler); 
Note: See TracChangeset for help on using the changeset viewer.