--- 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>


Reply via email to