ref: f7849b3926738e3ea28ba5979effc05832a583e7
dir: /flex/test/h264test.mxml/
<?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"> <fx:Script> <![CDATA[ import h264bsd.CroppingInfo; import h264bsd.Decoder; import mx.core.UIComponent; private function loadFile():void { var fileRef:FileReference = new FileReference(); fileRef.addEventListener(Event.SELECT, onFileSelected); fileRef.browse(); function onFileSelected(e:Event):void { e.target.addEventListener(Event.COMPLETE, onFileComplete); e.target.load(); } function onFileComplete(e:Event):void { loopH264Data(e.target.data as ByteArray); } } private function loopH264Data(data:ByteArray):void { if(data == null) return; var decoder:Decoder = new Decoder(); var renderTarget:Bitmap = new Bitmap(); var renderComponent:UIComponent = new UIComponent(); renderComponent.addChild(renderTarget); main.addElement(renderComponent); decoder.queueInput(data); loopBody(); function loopBody():void { var result:int = decoder.decode(); switch(result) { case Decoder.NO_INPUT: data.position = 0; decoder.queueInput(data); setTimeout(loopBody, 0); break; case Decoder.HDRS_RDY: var cinfo:CroppingInfo = decoder.getCroppingInfo(); renderTarget.bitmapData = new BitmapData(cinfo.width, cinfo.height); setTimeout(loopBody, 0); break; case Decoder.PIC_RDY: decoder.drawNextOutputPicture(renderTarget.bitmapData); ++frameCount; setTimeout(loopBody, 0); break; case Decoder.RDY: loopBody(); break; default: throw new Error("An error has occured in the decoder"); break; } } var lastUpdateTime:int = getTimer(); var lastFrameCount:int = 0; var frameCount:int = 0; setInterval(updateStatus, 1000); function updateStatus():void { var updateTime:int = getTimer(); var interval:int = updateTime - lastUpdateTime; lastUpdateTime = updateTime; var frameCountSinceLast:int = frameCount - lastFrameCount; lastFrameCount = frameCount; var frameRate:Number = frameCountSinceLast * 1000 / interval; statusLabel.text = "FPS: " + frameRate.toFixed(2); } } ]]> </fx:Script> <s:VGroup id="main"> <s:HGroup id="statusPanel" verticalAlign="middle"> <s:Button label="Load File" click="loadFile()"/> <s:Label id="statusLabel"/> </s:HGroup> </s:VGroup> </s:Application>