That's great arron, I actually started looking into this metod yesterday
myself after seeing the activePlayer index in the FLVPlayback component. I
was thinking that extending the component would be best.

Well, I will be very greatful for your help/class.

Cheers
Jim

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of aaron smith
Sent: 16 May 2006 23:55
To: Flashcoders mailing list
Subject: Re: [Flashcoders] Multiple FLVPlayback problem

one other thing, you might want to split up your video even more.. like 
6 - 10 clips. that way they're way smaller files.. seeking and loading 
wouldn't be a problem then.


aaron smith wrote:
> I'm also working on a project that requires multiple flv's also. What 
> I did was create a very basic multiple flv player. then with that you 
> listen to whatever events you want to tap into. say for some video 
> controls and what not. I will share it with you later tonight. I need 
> to refactor it a bit and add a little more functionality..  but it 
> works great!
>
> I need to build in seeking capabilities and cuepoint capabilities.. 
> other than that. it all works great. I am using with 2 - 5 MB files. 
> of about 2 or 3 files.. so total up those files and generally its 
> about 10 - 15 megs..
>
> as far as preloading the flvs. what you need to do is start playing 
> the first one. then when you get a metadata event for that one. start 
> playing the second one, once you get metadeta for that one. add it to 
> total time and pause it.. it will still continue to download the flv 
> though... so basically you need to wait till one has metadeta.. then 
> start the next one. or you could come up with some other way of doing 
> this. but thats how I had to do it without killing the player because 
> of all the video loading.  this way works great locally. over the net 
> it also works great but my files are considerablly smaller.
>
> like I said. i'll share this with you later tonight.. I also am 
> planning on releasing it for public use. I just need to get it ready 
> for release.
>
> smith
>
>
>
>
> Jim Tann wrote:
>> Originally posted on OSFlash.org list, sorry to double post, sent to
>> wrong list.
>>
>> Hi all,
>>
>> I am working on several projects that have very large videos (1-2 hours)
>> that need to be delivered on CD-Rom & Intranet. After trying to use one
>> large video file I realized there is a large problem when seeking to any
>> point in the video in that It has to buffer itself up to the point you
>> wish to play & on these large videos that can take quite some time.
>>
>> This led me to chop the video up into 2 min chunks & write a segmented
>> video player so they play as one video. This is working great on most
>> machines but on the occasional Windows 98 machine it is crashing when
>> initially grabbing the flv's.
>> I think the problem is that when initializing the component it is trying
>> to load all the flv's at once.
>> Does anyone have any insight into this? Is there another segmented video
>> player about?
>>
>> Here is the class:
>>
>> /***************************************
>> * @author - James Tann
>> * * FILE            :: SegmentedFLVPlayback.as
>> * PACKAGE        :: com.codesortium.video.SegmentedFLVPlayback
>> * AUTHOR        :: James Tann
>> * AUTHOR SITE    :: http://www.avtgroup.com
>> * CREATED        :: 10/04/2006
>> * DESCRIPTION    :: ****************************************/
>> // ** AUTO-UI IMPORT STATEMENTS **
>> // ** END AUTO-UI IMPORT STATEMENTS **
>> import mx.video.FLVPlayback;
>> import mx.utils.Delegate;
>> import mx.events.EventDispatcher;
>>
>> class com.codesortium.video.SegmentedFLVPlayback extends MovieClip {
>> // Constants:
>>     public static var CLASS_REF        :Function    =
>> com.codesortium.video.SegmentedFLVPlayback;
>>     public static var LINKAGE_ID    :String        =
>> "SegmentedFLVPlayback";
>>     public static var SymbolLinked    :Boolean    =
>> Object.registerClass(LINKAGE_ID, CLASS_REF);
>>     
>> // Public Properties:
>>     public var addEventListener            :Function;
>>     public var removeEventListener        :Function;
>>     public var autoPlay                    :Boolean
>> = false;
>>     public var bufferTime                :Number
>> = 0.1;
>>     public var playheadTime                :Number
>> = 0;
>>     public var playheadUpdateInterval    :Number        = 250;
>>     public var progressInterval            :Number
>> = 250;
>>     public var state                    :String
>> = "";
>>     public var totalTime                :Number
>> = 0;
>>     public var stateResponsive            :Boolean
>> = false;
>>     public var buffering                :Boolean
>> = false;
>> // Private Properties:
>>     private var dispatchEvent        :Function;
>>     private var _arrFLVPlayback        :Array;
>>     private var _activeFlvPlayback    :FLVPlayback;
>>     private var _totalLength        :Number
>> = 0;
>>     private var _position            :Number
>> = 0;
>>     private var _volume                :Number
>> = 100;
>>     private var _arrCuePoints        :Array;
>> // UI Elements:
>>
>> // ** AUTO-UI ELEMENTS **
>>     private var mcBackground:MovieClip;
>> // ** END AUTO-UI ELEMENTS **
>>
>> // Initialization:
>>     private function SegmentedFLVPlayback() {
>>         EventDispatcher.initialize(this);
>>         _arrFLVPlayback        = new Array();
>>         _arrCuePoints        = new Array();
>>     }
>>     private function onLoad():Void {         configUI();     }
>>
>> // Public Methods:
>>     public function toString() : String {
>>         return "com.codesortium.video.SegmentedFLVPlayback";
>>     }
>>     
>>     public function get width():Number{
>>         return _width;
>>     }
>>     
>>     public function set width(intSet:Number):Void{
>>         _width = intSet;
>>     }
>>     
>>     public function get height():Number{
>>         return _height;
>>     }
>>     
>>     public function set height(intSet:Number):Void{
>>         _height = intSet;
>>     }
>>     
>>     public function get length():Number{
>>         return _totalLength;
>>     }
>>     
>>     public function get playing():Boolean{
>>         return _activeFlvPlayback.playing;
>>     }
>>     
>>     public function get volume():Number{
>>         return _volume;
>>     }
>>     
>>     public function set volume(intSet:Number):Void{
>>         _volume = intSet;
>>        
>>         for(var i:Number=0; i<_arrFLVPlayback.length; i++){
>>             FLVPlayback(_arrFLVPlayback[i]).volume =
>> _volume;
>>         }
>>     }
>>     
>>     public function addFLV(strURI:String):Void{
>>         var newFLVPlayback    :FLVPlayback;
>>        
>>         newFLVPlayback =
>> FLVPlayback(this.attachMovie("FLVPlayback","FLVPlayback" +
>> _arrFLVPlayback.length, this.getNextHighestDepth()));
>>        
>>         newFLVPlayback.addEventListener("metadataReceived",
>> Delegate.create(this, onMetadata));
>>         newFLVPlayback.addEventListener("ready",
>> Delegate.create(this, onReady));
>>         newFLVPlayback.addEventListener("playheadUpdate",
>> Delegate.create(this, onPlayheadUpdate));
>>         newFLVPlayback.addEventListener("stateChange",
>> Delegate.create(this, onStateChange));
>>        
>>         newFLVPlayback.addEventListener("complete",
>> Delegate.create(this, onComplete));
>>        
>>         newFLVPlayback.maintainAspectRatio        = false;
>>         newFLVPlayback.autoPlay
>> = false;
>>         newFLVPlayback.bufferTime
>> = bufferTime;
>>         newFLVPlayback.playheadUpdateInterval    =
>> playheadUpdateInterval;
>>         newFLVPlayback.progressInterval            =
>> progressInterval;
>>        
>>         if(_arrFLVPlayback.length != 0){
>>             newFLVPlayback._visible    = false;
>>         }else{
>>             _activeFlvPlayback            =
>> newFLVPlayback;
>>             _activeFlvPlayback.autoPlay    = autoPlay;
>>         }
>>        
>>         newFLVPlayback.contentPath
>> = strURI;
>>         _arrFLVPlayback.push(newFLVPlayback);
>>     }
>>     
>>     public function pause():Void{
>>         _activeFlvPlayback.pause();
>>     }
>>     
>>     public function play():Void{
>>         _activeFlvPlayback.play();
>>     }
>>     
>>     public function stop():Void{
>>         _activeFlvPlayback.stop();
>>         seek(0);
>>     }
>>     
>>     public function seek(time:Number):Void{
>>         var blnSet        :Boolean    = false;
>>         var intLength    :Number        = 0;
>>         var blnPlaying    :Boolean    =
>> _activeFlvPlayback.playing;
>>        
>>         buffering    = true;
>>         dispatchEvent({type:"seeking", target:this});
>>        
>>         for(var i:Number=0; i<_arrFLVPlayback.length; i++){
>>             if(!blnSet){
>>                 var flvCurrent    :FLVPlayback    =
>> _arrFLVPlayback[i];
>>                
>>                 if(time < (intLength +
>> flvCurrent.totalTime)){
>>                     if(flvCurrent !=
>> _activeFlvPlayback){
>>     
>> _activeFlvPlayback.stop();
>>                        
>>                         _activeFlvPlayback =
>> flvCurrent;
>>                        
>>     
>> _activeFlvPlayback.seek(time - intLength);
>>                        
>>                         if(blnPlaying){
>>     
>> _activeFlvPlayback.play();
>>                         }
>>                     }else{
>>                         flvCurrent.seek(time -
>> intLength);
>>                     }
>>                    
>>                     blnSet = true;
>>                 }else{
>>                     intLength +=
>> flvCurrent.totalTime;
>>                 }
>>             }
>>         }
>>
>>     }
>>     
>>     public function addCuePoint(intNew:Number):Void{
>>         var blnAdd    :Boolean    = true;
>>        
>>         for(var i:Number=0; i<_arrCuePoints.length; i++){
>>             if(_arrCuePoints[i] == intNew){
>>                 blnAdd = false;
>>             }
>>         }
>>        
>>         if(blnAdd){
>>             _arrCuePoints.push(intNew);
>>             _arrCuePoints.sort(Array.NUMERIC);
>>         }
>>     }
>>     
>>     public function removeCuePoint(intRemove:Number):Void{
>>         var blnAdd    :Boolean    = true;
>>        
>>         for(var i:Number=0; i<_arrCuePoints.length; i++){
>>             if(_arrCuePoints[i] == intRemove){
>>                 _arrCuePoints.splice(i,1);
>>                 _arrCuePoints.sort(Array.NUMERIC);
>>                 break;
>>             }
>>         }
>>     }
>>     
>>     public function seekToNextCuePoint():Void{
>>         for(var i:Number=0; i<_arrCuePoints.length; i++){
>>             if((_arrCuePoints[i] < playheadTime)){
>>                 if(_arrCuePoints[i+1] != null){
>>                     if(_arrCuePoints[i+1] >
>> playheadTime){
>>     
>> seek(_arrCuePoints[i+1]);
>>                     }
>>                 }
>>             }
>>         }
>>     }
>>     
>>     public function seekToLastCuePoint():Void{
>>         for(var i:Number=0; i<_arrCuePoints.length; i++){
>>             if((_arrCuePoints[i] < playheadTime)){
>>                 if(_arrCuePoints[i+1] != null){
>>                     if(_arrCuePoints[i+1] >
>> playheadTime){
>>                         if(((_arrCuePoints[i] +
>> 2) > playheadTime) && (_arrCuePoints[i-1] != null)){
>>     
>> seek(_arrCuePoints[i-1]);
>>                         }else{
>>     
>> seek(_arrCuePoints[i]);
>>                         }
>>                     }
>>                 }
>>             }
>>         }
>>     }
>>     
>> // Semi-Private Methods:
>> // Private Methods:
>>     private function configUI():Void {
>>     }
>>     
>>     private function seekPercent(time:Number):Void{
>>         seek((totalTime/100)*time);
>>     }
>>
>>     private function onMetadata(event:Object,
>> delegate:Function):Void{
>>         totalTime += event.info.duration;
>>         _totalLength += (event.info.duration * 1000);
>>         dispatchEvent({type:"metadata", target:this});
>>         event.target.removeEventListener("metadata", delegate);
>>     }
>>     
>>     private function onReady(event:Object, delegate:Function):Void{
>>         FLVPlayback(event.target).volume = _volume;
>>         stateResponsive = true;
>>         dispatchEvent({type:"ready", target:this});
>>         event.target.removeEventListener("ready", delegate);
>>     }
>>     
>>     private function onPlayheadUpdate(event:Object,
>> delegate:Function):Void{
>>         var blnSet        :Boolean    = false;
>>         var intLength    :Number        = 0;
>>        
>>         for(var i:Number=0; i<_arrFLVPlayback.length; i++){
>>             var flvCurrent        :FLVPlayback    =
>> _arrFLVPlayback[i];
>>             var blnIsCurrent    :Boolean
>> = (flvCurrent == _activeFlvPlayback);
>>            
>>             flvCurrent._visible = blnIsCurrent;
>>            
>>             if(!blnSet){
>>                 if(blnIsCurrent){
>>                     intLength    += playheadTime
>> + (event.playheadTime - playheadTime);
>>                     blnSet        = true;
>>                 }else{
>>                     intLength    +=
>> flvCurrent.totalTime;
>>                 }
>>             }
>>         }
>>        
>>         playheadTime = intLength;
>>         dispatchEvent({type:"playheadUpdate", target:this,
>> playheadTime:playheadTime});
>>     }
>>     
>>     private function onStateChange(event:Object,
>> delegate:Function):Void{
>>         if(event.target == _activeFlvPlayback){
>>             var objEvent    :Object = new Object();
>>             objEvent.target            = this;
>>             objEvent.type            = "stateChange";
>>             objEvent.state            = event.state;
>>             objEvent.playheadTime    = playheadTime;
>>            
>>             dispatchEvent(objEvent);
>>            
>>             switch(event.state){
>>                 case "buffering":
>>                     buffering    = true;
>>                     dispatchEvent({type:"buffering",
>> target:this});
>>                 break;
>>                 case "playing":
>>                     buffering    = false;
>>                     dispatchEvent({type:"playing",
>> target:this});
>>                 break;
>>                 case "stopped":
>>                     buffering    = false;
>>                     dispatchEvent({type:"stopped",
>> target:this});
>>                 break;
>>                 case "paused":
>>                     buffering    = false;
>>                     dispatchEvent({type:"paused",
>> target:this});
>>                 break;
>>             }
>>         }
>>     }
>>     
>>     private function onComplete(event:Object,
>> delegate:Function):Void{
>>         var blnSet    :Boolean    = false;
>>        
>>         if(_arrFLVPlayback.length > 1){   
>>             for(var i:Number=0; i<_arrFLVPlayback.length;
>> i++){
>>                 if(!blnSet){
>>                     if(_arrFLVPlayback[i] ==
>> _activeFlvPlayback){
>>                         blnSet
>> = true;
>>     
>> _activeFlvPlayback._visible = false;
>>                        
>>                         if(i ==
>> (_arrFLVPlayback.length-1)){
>>     
>> _activeFlvPlayback = _arrFLVPlayback[0];
>>     
>> _activeFlvPlayback._visible = true;
>>     
>> dispatchEvent({type:"complete", target:this});
>>                         }else{
>>     
>> _activeFlvPlayback = _arrFLVPlayback[i+1];
>>                            
>>     
>> _activeFlvPlayback._visible = true;
>>     
>> _activeFlvPlayback.play();
>>                         }
>>                     }
>>                 }
>>             }
>>         }
>>     }
>> }
>>
>>
>> Cheers
>> Jim
>>
>> _______________________________________________
>> osflash mailing list
>> osflash@osflash.org
>> http://osflash.org/mailman/listinfo/osflash_osflash.org
>>
>>
>> _______________________________________________
>> Flashcoders@chattyfig.figleaf.com
>> To change your subscription options or search the archive:
>> http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
>>
>> Brought to you by Fig Leaf Software
>> Premier Authorized Adobe Consulting and Training
>> http://www.figleaf.com
>> http://training.figleaf.com
>>
>>
>>
>>
>>   
>
> _______________________________________________
> Flashcoders@chattyfig.figleaf.com
> To change your subscription options or search the archive:
> http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
>
> Brought to you by Fig Leaf Software
> Premier Authorized Adobe Consulting and Training
> http://www.figleaf.com
> http://training.figleaf.com
>
>
>
>

_______________________________________________
Flashcoders@chattyfig.figleaf.com
To change your subscription options or search the archive:
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Brought to you by Fig Leaf Software
Premier Authorized Adobe Consulting and Training
http://www.figleaf.com
http://training.figleaf.com

_______________________________________________
Flashcoders@chattyfig.figleaf.com
To change your subscription options or search the archive:
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Brought to you by Fig Leaf Software
Premier Authorized Adobe Consulting and Training
http://www.figleaf.com
http://training.figleaf.com

Reply via email to