--- In flexcoders@yahoogroups.com, "Netaman" <rtigrett@...> wrote: > > Is it possible to play an AVI with Motion JPG and PCM Audio(wav) in flex? > > I know about standingwave3 to play audio, does anyone have an algorithm to > parse the video and audio from the AVI in actionscript? > > Randy >
Yes it is possible, took the weekend, but I can play AVI, just bytes ready to be read, attached is the application, also had to do some c work in the standingwave3 lib so that it plays 16bit 16Khz 1 channel WAVs, <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="readAVI()"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <fx:Script> <![CDATA[ import com.noteflight.standingwave3.elements.Sample; import com.noteflight.standingwave3.formats.WaveFile; import com.noteflight.standingwave3.output.AudioPlayer; import mx.collections.ArrayCollection; import spark.collections.Sort; import spark.collections.SortField; private static const RIFF:Number = 1380533830; private static const AVILIST:Number = 1279873876; private static const AVIIDX:Number = 1768192049; private static const AVIMOVI:Number = 1836021353; private static const AVIVID:Number = 808477795; private static const AVISND:Number = 808548194; private static const AVIVIDCOMP:Number = 808477794; public var player:AudioPlayer=new AudioPlayer(4096); public var soundBytes:ByteArray; public var aviBuffer:ByteArray; public var wavData:ByteArray = new ByteArray(); public var imageArray:ArrayCollection = new ArrayCollection(); public var myTextLoader:URLLoader = new URLLoader(); public var indexCnt:int = 0; public var loader:Loader; public var AU:AVIUtility = new AVIUtility(); public var timer:Timer = new Timer(34); public function readAVI():void { myTextLoader.addEventListener(Event.COMPLETE, onLoaded); myTextLoader.dataFormat= URLLoaderDataFormat.BINARY; myTextLoader.load(new URLRequest("lf_8.avi")); } function onLoaded(e:Event):void { trace("finished loading video"); aviBuffer = ByteArray(e.target.data); while (findAudio()){ } trace("Images" + (indexCnt-1).toString()); timer.addEventListener(TimerEvent.TIMER,changeImage); timer.start(); createAudio(); } private var index:int = 0; private function changeImage(e:TimerEvent):void{ if (imageArray.length < 0) return; var status:Boolean = true; for (var h:int = 0;h<imageArray.length;h++){ status = status && imageArray[h].status; if (status == false) return; } pageViewer.source = imageArray[index].storedImage ; if(index<imageArray.length-1) index++; else timer.stop();; } private function findAudio():Boolean{ var startAudio:ByteArray = new ByteArray(); var a:int = 0; var sizeU:uint; var audio:ByteArray; var foundAll:Boolean = false; if(aviBuffer.length > 1){ for (a;aviBuffer.position<=aviBuffer.length -1;){ sizeU = aviBuffer.readUnsignedInt(); aviBuffer.endian = Endian.LITTLE_ENDIAN; switch (sizeU){ case RIFF: //trace("RIFF"); sizeU = aviBuffer.readUnsignedInt(); //trace("Size:" + sizeU.toString() + " Pos:" + aviBuffer.position.toString()); break; case AVILIST: //trace("LIST"); sizeU = aviBuffer.readUnsignedInt(); //trace("Size:" + sizeU.toString() + " Pos:" + aviBuffer.position.toString()); break; case AVIIDX: //trace("IDX1"); sizeU = aviBuffer.readUnsignedInt(); //trace("Size:" + sizeU.toString() + " Pos:" + aviBuffer.position.toString()); foundAll = true; break; case AVIMOVI: //trace("MOVI"); //trace("Pos:" + aviBuffer.position.toString()); break; case AVIVID: //trace("00DC"); sizeU = aviBuffer.readUnsignedInt(); if (sizeU < 100) break; saveImages(aviBuffer.position,sizeU); //trace("Size:" + sizeU.toString() + " Pos:" + aviBuffer.position.toString()); break; case AVIVIDCOMP: //trace("00DB"); sizeU = aviBuffer.readUnsignedInt(); if (sizeU < 100) break; saveImages(aviBuffer.position,sizeU); //trace("Size:" + sizeU.toString() + " Pos:" + aviBuffer.position.toString()); break; case AVISND: //trace("01WB"); sizeU = aviBuffer.readUnsignedInt(); if (sizeU < 100) break; //trace("Size:" + sizeU.toString() + " Pos:" + aviBuffer.position.toString()); aviBuffer.endian = Endian.BIG_ENDIAN; aviBuffer.readBytes(wavData,wavData.length,sizeU); break; } aviBuffer.endian = Endian.BIG_ENDIAN if (foundAll == true) break; } } return false; } private function saveImages(sPos:uint,iSize:uint):void{ trace("SI Size:" + iSize..toString() + " Pos:" + sPos.toString()); var image:ByteArray= new ByteArray(); aviBuffer.endian = Endian.BIG_ENDIAN; aviBuffer.readBytes(image,0,iSize); loader = new Loader(); var nIC:MJPG = new MJPG(); nIC.storedIndex = indexCnt; imageArray.addItem(nIC); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,function (e:Event):void {imageArray[nIC.storedIndex].storedImage = new Bitmap(e.target.content.bitmapData);imageArray[nIC.storedIndex].status = true;}); loader.loadBytes(image); indexCnt++; } public function createAudio():void { player.stop(); player=new AudioPlayer(4096); var newWavHdr:ByteArray = new ByteArray(); WaveFile.writeBytesToWavFile(newWavHdr,wavData,16000,1,16); var sample:Sample= WaveFile.createSample(newWavHdr); sample.standardize(); player.play(sample); } ]]> </fx:Script> <mx:Image id="pageViewer" width="100%" height="100%"/> </s:Application>