在Android / iOS中使用Adobe AIR播放AAC流

时间:2014-09-14 19:44:45

标签: android ios actionscript air aac

看起来这是一个非常常见的问题,但我仍然看不到任何解决方案。

目标是在Adobe AIR移动应用程序中播放一些AAC流。

我使用了https://code.google.com/p/project-thunder-snow/的转码器。一个将FLV标头添加到AAC数据,因此可以通过标准AS3 NetStream对象播放流(据我所知)。它适用于Win和Mac,但在Android或iOS上启动的相同应用程序既不会产生声音也不会产生任何错误。我已经发现转码器工作正常,原因是不同的 NetStreams的特点。

那么,有没有解决方案,或者至少有任何描述PC和移动平台上NetStreams之间差异的文档?

1 个答案:

答案 0 :(得分:0)

好的......我可能会为你提供一些线索。我尝试在Flash CS5中运行您在other question上发布的NBAAC代码链接并收到此错误:

onChannelReady : MetaData Error: Error #2067: The ExternalInterface is not available in this container. ExternalInterface requires Internet Explorer ActiveX, Firefox, Mozilla 1.7.5 and greater, or other browsers that support NPRuntime.

所以看起来播放器的设计只能在html页面中使用。使用ExternalInterface(Javascript)从浏览器获取元数据到SWF

我删除了ExternalInterface的东西,它在Flash Player& Device Central没有浏览器/ HTML。在您的AIR应用程序中尝试此代码(我不再安装AIR以确认..)

package
{
        import com.thebitstream.flv.CodecFactory;
        import com.thebitstream.flv.Transcoder;
        import com.thebitstream.flv.codec.*;
        import com.thebitstream.ice.*;
        import com.thebitstream.nsv.*;

        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.ProgressEvent;
        import flash.events.SecurityErrorEvent;
        //import flash.external.externalInterface;
        import flash.media.SoundTransform;
        import flash.net.NetConnection;
        import flash.net.NetStream;
        import flash.net.NetStreamAppendBytesAction;
        import flash.net.URLRequest;
        import flash.net.URLRequestMethod;
        import flash.net.URLStream;
        import flash.utils.ByteArray;
        import flash.utils.setTimeout;

        [SWF (width="250",height="250")]

        public dynamic class NBAAC_AIR_v2 extends Sprite
        {
            public var request:URLRequest;
            public var transcoder :Transcoder
            public var transport :NetConnection;
            public var transportStream :NetStream;
            public var serverConnection:URLStream;

            //public var host:String=" "; //now not used in line... request=new URLRequest(resource);
            public var resource:String="http://aacplus-ac-64.timlradio.co.uk/;"; //test station

            public function NBAAC_AIR_v2 ()
            {
                super();

                /*
                if(loaderInfo.parameters.host)
                        host=loaderInfo.parameters.host;
                if(loaderInfo.parameters.resource)
                        resource=loaderInfo.parameters.resource;
                 */       

                //CodecFactory.ImportCodec(MetaData);

                CodecFactory.ImportCodec(AAC);
                CodecFactory.ImportCodec(AACP);         

                transcoder = new Transcoder();
                transcoder.addEventListener(CodecEvent.STREAM_READY,onChannelReady);
                transcoder.addEventListener(StreamDataEvent.DATA, onTag);
                transcoder.initiate();

                transcoder.loadCodec("AAC");

                transport = new NetConnection();
                transport.connect(null);

                flash.utils.setTimeout(boot,500);
            }

            public function boot():void
            {
                //externalInterface.addCallback('nbaac.setVolume', onVolume);
                //externalInterface.addCallback('nbaac.togglePause', onTogglePause);
                //externalInterface.addCallback('nbaac.setBuffer', setBufferLength);
                //externalInterface.addCallback('nbaac.getBuffer', getBufferLength);
                //externalInterface.addCallback('nbaac.getTime', getTime);

                /*
                var meta:Object={};
                meta.uri="";
                meta.StreamTitle=""; 
                */

                //externalInterface.call('logit','start up');

                transportStream = new NetStream(transport);
                transportStream.bufferTime=2;
                transportStream.client = this;
                transportStream.soundTransform=new SoundTransform(.5,0);
                transportStream.play(null);                             
                transportStream.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);

                var headerTag:ByteArray=transcoder.createHeader(false,true);
                transportStream.appendBytes(headerTag);                         
                headerTag.clear();

                //transcoder.readMetaObject(meta,0);

                serverConnection=new URLStream();
                serverConnection.addEventListener(ProgressEvent.PROGRESS,loaded);
                serverConnection.addEventListener(IOErrorEvent.IO_ERROR, onIo);                                 
                serverConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onNoPolicy);
                serverConnection.addEventListener(Event.CLOSE, onClose);

                request=new URLRequest(resource); //removed "host" from url

                //request.requestHeaders=[new URLRequestHeader("GET",resource+" HTTP/1.0")];
                //request.requestHeaders=[new URLRequestHeader("Icy-MetaData","1")];

                request.method=URLRequestMethod.GET;
                serverConnection.load(request);
            }

            private function getTime() :Number
            {   return transportStream.time;  }

            private function getBufferLength() :Number
            {  return transportStream.bufferLength; }

            private function setBufferLength (val:Number) :void
            {   transportStream.bufferTime = val;  }

            private function onTogglePause():void
            {   transportStream.togglePause(); }

            private function onVolume (val:Number) :void
            {   transportStream.soundTransform = new SoundTransform(val, 0); }

            private function onIo(pe:IOErrorEvent) :void
            {  /* externalInterface.call('logit','IOErrorEvent') */  }

            private function onTag(sde:StreamDataEvent) :void
            {
                    sde.tag.position=0;
                    transportStream.appendBytes(sde.tag);
            }

            private function onChannelReady(ce:CodecEvent) :void
            {  trace('onChannelReady :',ce.codec.type); }

            private function onClose(e:Event):void
            {   /* externalInterface.call('logit','onClose') */ }

            public function onMetaData(e:Object):void
            {  /* externalInterface.call('logit','onMetaData') */ }

            private function loaded(e:ProgressEvent):void
            {                       
                var chunk:ByteArray=new ByteArray();

                while(serverConnection.bytesAvailable)
                {   chunk.writeByte( serverConnection.readByte() ); }

                chunk.position=0;   
                transcoder.addRawData( chunk, 0, "AAC" );                                                        
            }

            private function onNoPolicy(se:SecurityErrorEvent):void
            { /* externalInterface.call('logit','SecurityErrorEvent'+host+resource+'<br />'+se.text); */ }

    }

}