2014-09-14 2 views
0

꽤 흔한 문제 인 것처럼 보이지만 여전히 해결책을 찾을 수 없습니다.Android/iOS에서 Adobe AIR로 AAC 스트림 재생

목표는 Adobe AIR 모바일 앱에서 일부 AAC 스트림을 재생하는 것입니다.

https://code.google.com/p/project-thunder-snow/의 트랜스 코더를 사용했습니다. 하나는 FLV 헤더를 AAC 데이터에 추가하므로 표준 AS3 NetStream 객체를 통해 스트림을 재생할 수 있습니다 (이해함). Win 및 Mac에서는 잘 작동하지만 Android 또는 iOS에서 실행되는 동일한 앱은 소리도 오류도 발생하지 않습니다. 나는 transcoder가 잘 작동한다는 것을 알아 냈다. 원인은 NetStreams의 특성 인 과 다르다.

그래서 PC와 모바일 플랫폼의 NetStream 간의 차이점을 설명하는 솔루션이나 설명서가 있습니까?

+0

안녕하십니까,이 질문에 답변 해 주실 수 있습니까? http://stackoverflow.com/questions/25819826/shoutcast-aacplus-streaming-with-as3. Thunder-Snow를 사용하여 재생할 위치와 방법 및 위치를 보여주는 예제를 제공 할 수 있습니다. –

+0

FLOS는 iOS에서 지원되지 않습니다. Android에서는 메모리 카드에서 저장된 FLV 파일을 재생할 수 있지만 스트리밍에 대해서는 알지 못합니다. 따라서 모바일에서이 AAC 데이터를 가져올 때 FLV를 래핑하지 말고 대신 [[Native Extensions] (http://www.adobe.com)를 사용하여 다른 기본 응용 프로그램 (즉, 내장 된 OS 디코더)에 버퍼하고 보내십시오. /devnet/air/native-extensions-for-air.html)] 및 [[Google 결과] (https://www.google.co.uk/?gws_rd=cr&ei=nqYkUqj1Osi20QXAhoHoDQ#q=as3%20android%)도 참조하십시오. 20 %% 20extensions)]. 고려해야 할 한가지지만 나 자신을 시도하지 않았습니다. –

+0

일부 사람들은 어떻게 든 Android에서 재생할 수있는 것처럼 보입니다. http://stackoverflow.com/questions/20714135/streaming-aac-inside-flv-on-ios-using-air. 우리는 Android 용 네이티브 확장을 만들려고 시도했지만 사용 가능한 C/Java 솔루션을 사용하여 ANE를 만드는 것은 어렵습니다. ((( –

답변

0

좋아요 ... 나는 당신을위한 단서를 가지고 있습니다. 난 당신이 플래시 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.

은 그래서 플레이어가 &가 ExternalInterface를 사용하는 HTML 페이지 내부에서만 사용하도록 설계되어 보인다 (자바 스크립트) 브라우저에서 SWF로 메타 데이터를 가져 오는 경우

ExternalInterface 항목을 제거했으며 브라우저/HTML없이 Flash Player & Device Central에서 정상적으로 작동했습니다. 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); */ } 

    } 

} 
+0

흠 ... 예제의 기본 버전에 관해서는 HTML이나 다른 앱 컨테이너를 대상으로한다. 외부 인터페이스를 구현합니다. 업데이트 된 버전에 컨테이너 제거 호출이있는 것 같습니다. 독립 실행 형 플레이어에서 앱을 실행해도 좋지만 모바일 플랫폼에서는 도움이되지 않습니다. ( –

+0

이 게임에서 카이저가 필요합니다 .. 테스트 링크는 무엇입니까? Chrome에서 작동하지 않는 스트림이 있지만 괜찮 았음을 발견했습니다. .Explorer 및 Firefox에도이 업데이트 된 코드가 포함되어 있습니다. Shoutcast 또는 Icecast 시스템이 더 까다 롭습니다. '...'또는 '...없이 URL을 사용해보십시오./;'Flash와 같은 브라우저 관련 트릭이므로 –

+0

'String = "http://aacplus-ac-64.timlradio.co.uk/;"''String = "http : // aacplus-ac-64가됩니다. .timlradio.co.uk ";하지만 어쨌든 나는 내 링크가 비 영국 연결을 좋아하지 않을 수도 있다는 것을 발견했다. –