2015-01-16 154 views
0

我试图从URL中获取“.ogg”文件并在我的Flex程序中播放它。Adob​​e Flex使用Ogg Vorbis编码器将“.ogg”文件转换为与Sound类一起播放

我就使用“.MP3" 文件测试,它工作一切正常,与此代码:

 public function getFileRemote(url:String, id:String):void{ 
      var s:Sound = new Sound(); 
      s.addEventListener(Event.COMPLETE, onSoundLoaded); 
      var req:URLRequest = new URLRequest(url); 
      s.load(req); 

     } 

     private function onSoundLoaded(event:Event):void 
     { 
      var localSound:Sound = event.target as Sound; 
      localSound.play(); 
     } 

但是,对于” .OGG”格式的文件不起作用。所以,我已经检查了一些可能的解决方案,并且试图用Ogg Vorbis Encoder library来实现一个解决方案。

的代码,因为我有它现在实现:

 public function getFileRemote(url:String, id:String):void 
     { 
      urlStream = new URLStream(); 
      var urlReq:URLRequest = new URLRequest(url); 
      urlStream.addEventListener(Event.COMPLETE, loaded); 
      urlStream.load (urlReq); 
     } 

     private function handleSoundData(e:SampleDataEvent):void 
     {//handleSoundData 
      var result:Object; 
      var tmpBuffer:ByteArray = new ByteArray(); 
      result = _oggManager.getSampleData(NUM_SAMPLES, tmpBuffer); 

      if (tmpBuffer.length < NUM_SAMPLES * BYTES_PER_SAMPLE) 
      {//reset 
       trace("Reset"); 
       //Right now the only way to rewind is reseting the decoder 
       _oggManager.initDecoder(_oggBytes); 
       result = _oggManager.getSampleData(NUM_SAMPLES, tmpBuffer); 
      }//reset 

      tmpBuffer.position = 0; 
      while (tmpBuffer.bytesAvailable) 
      {//feed 
       //feed data 
       e.data.writeFloat(tmpBuffer.readFloat());  //Left Channel 
       e.data.writeFloat(tmpBuffer.readFloat());  //Right Channel 
      }//feed 

     }//handleSoundData 

     private function loaded(event:Event):void 
     { 
      urlStream.readBytes(_oggBytes, 0, urlStream.bytesAvailable); 
      //urlStream.readBytes(_oggBytes); 
      _oggManager.decode(_oggBytes); 
      //_oggManager.initDecoder(_oggBytes); 
      //Make sound 
      _sound = new Sound(); 
      _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, handleSoundData, false, 0, true); 
      _soundChannel = _sound.play(); 
      //trace(urlLoader.data); 
     } */ 

在加载的温控功能(),无论是与两个编码:

  • _oggManager.decode(_oggBytes);
  • _oggManager.initDecoder(_oggBytes);

我得到这个错误:

Main Thread (Suspended: TypeError: Error #1009: Cannot access a property or method of a null object reference.) 
    es.maubic.oxford.portal.views.sessions::ListAudiosView/loaded 

所以,任何提示?其他可能的解决方案?

UPDATE

最后,我选择了另一种解决方案。 我拒绝将ogg音频转换为mp3。 取而代之的是,现在ogg audios在服务器中,我只需要通过我的MainApp.html文件中的音频html标签来播放它们的URL。更简单,更高效。

+2

与论坛网站不同,我们不使用“谢谢”或“任何帮助表示赞赏”,或在[so]上签名。请参阅“[应该'嗨','谢谢''标语和祝福从帖子中删除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts)。顺便说一句,它是“提前致谢”,而不是“先进感谢”。 –

+0

@JohnSaunders相关知识 – daniegarcia254

+0

'_oggManager'的定义在哪里?它看起来像'loaded'函数中的null。 – Brian

回答

0

我已经为问题中的问题建立了替代解决方案。

取而代之的是.OGG文件转换成.MP3文件,我修改我的代码,以便直接再现应用从URL中.OGG文件(其中,它存储在服务器)。

将此代码添加到主应用程序HTML文件(在我的情况Admin.html):

<audio id="audioOgg"> 
     <source src='' type='audio/ogg'> 
    </audio> 

    <script language="JavaScript" type="text/javascript"> 
     var media = document.getElementById("audioOgg"); 
     var cp=document.getElementById("Admin"); 
     var audioId; 
     function playAudio(audioURL, id) { 
      media.src = audioURL; 
      audioId = id; 
      media.play(); 
      cp.onStartAudio(audioId); 
     } 
     function pauseAudio() { 
      media.pause(); 
     } 
    </script> 

而这种代码在的.mxml文件:

<?xml version="1.0" encoding="utf-8"?> 
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="Audio List" 
       horizontalScrollPolicy="off" verticalScrollPolicy="auto" width="510" height="340" 
       showCloseButton="true" close="closeWindow()"> 
    <mx:Script> 
     <![CDATA[ 
      import flash.external.ExternalInterface; 

      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 
      import mx.managers.PopUpManager; 
      import mx.controls.Alert; 

      [Embed(source='../assets/play-btn-small.png')] 
      var Play:Class; 
      [Embed(source='../assets/stop-btn-small.png')] 
      var Stop:Class; 

      [Blindable] 
      public var dpc:ArrayCollection; 

      public function playAudio(audioURL:String, audioId:String){ 
       ExternalInterface.call("playAudio", audioURL, id); 
      } 

      public function pauseAudio(){ 
       ExternalInterface.call("pauseAudio"); 
      } 
     ]]> 
    </mx:Script> 
    <mx:Rotate id="rotate" /> 
    <mx:Zoom id="zoom" /> 
    <mx:VBox top="0" bottom="0" left="0" right="0" paddingTop="20" paddingLeft="20"> 
     <mx:Text fontWeight="bold" height="20"> 
      <mx:text>Click the play/pause button for listening/pause each audio individually:</mx:text> 
     </mx:Text> 
    </mx:VBox> 
    <mx:DataGrid id="gridAudios" top="50" bottom="20" left="20" right="20" width="100%" doubleClickEnabled="false"> 
     <mx:columns> 
      <mx:DataGridColumn headerText="Name" dataField="audioId"/> 
      <mx:DataGridColumn id="btnCol" headerText="" textAlign="center"> 
       <mx:itemRenderer> 
        <mx:Component> 
         <mx:HBox horizontalAlign="center"> 
          <mx:Script> 
           <![CDATA[ 
            protected function image1_clickHandler(event:MouseEvent):void 
            { 
             if (data.status=='playing'){ 
              outerDocument.pauseAudio(); 
              data.status=''; 
             }else{ 
              outerDocument.playAudio(data.url,data.audioId); 
              data.status='playing'; 
             } 
            } 
           ]]> 
          </mx:Script> 

          <mx:Image click="image1_clickHandler(event)" 
             toolTip="{data.status=='playing' ? 'Stop' : 'Play'}" 
             useHandCursor="true" source="{data.status=='playing' ? outerDocument.Stop : outerDocument.Play}"/> 
         </mx:HBox> 
        </mx:Component> 
       </mx:itemRenderer> 
      </mx:DataGridColumn> 
     </mx:columns> 
    </mx:DataGrid> 
</mx:TitleWindow> 

感谢ExternalInterface class我可以调用在我的Admin.html文件中声明的Javascript函数,以重现和停止标记元素的音频,并将音频标识符作为参数传递给参数。

+0

如果这是您自己问题的答案,请将其标记为正确答案。干杯! – charliebrownie