0

URL から「.ogg」ファイルを取得して、Flex プログラムで再生しようとしています。

「.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 ライブラリを使用して実装しようとしています。

私が今実装しているコード:

        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);
        }  */

関数loaded()で、両方のエンコーディングを使用:

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

それで、何かヒントはありますか?他の可能な解決策はありますか?

アップデート

最後に、別のソリューションを選択しました。ogg オーディオの mp3 への変換を拒否しました。その代わりに、ogg オーディオはサーバーにあり、MainApp.html ファイルのオーディオ HTML タグを介して再生するための URL だけが必要です。よりシンプルで効率的。

4

1 に答える 1