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