ActionScript 3でバッファー(ByteArray / Stream)からMP3サウンドを再生する方法は?

StackOverflow https://stackoverflow.com/questions/1619773

質問

だから。 MP3データを含むバッファ(このバッファを保存してbuffer.mp3と呼ぶと再生されますが、この状況ではファイルシステムに保存しないでください) 。 再生する必要がありますが、できません。どうすればよいですか


次のコードを再生して、そのbuffrer(ByteArray \ Stream)を再生しようとしました(サーバーからMP3データを取得します。そしてそれは応答です)。

            protected function Play(event:MouseEvent):void
        {
            var mySound:Sound = new Sound();
            mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, soundFill);
            mySound.play(); 
        }

        public function soundFill(event:SampleDataEvent):void
        {
            event.data.writeBytes(readResponse.buffer, 0, readResponse.buffer.length);  
        }
役に立ちましたか?

解決

SampleDataEvent.dataはMP3ではなく、圧縮されていない生のサンプルデータを想定しているため、これは機能しません。 http://wiki.github.com/claus/as3swfを使用します。代わりに/ play-mp3-directly-from-bytearray

他のヒント

mp3バイナリデータの解決策はないと思いますが、wavであれば、これは動作するはずです:


   private function loaded(event:Event):void {
   var urlStream:URLStream = event.target as URLStream;
   bArr = new ByteArray();
   urlStream.readBytes(bArr, 0);
   /**
    * Remove wav header here
    */
   bArr.position = 0;
   sampleMP3.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
   soundChannel = sampleMP3.play();
  }

  private function sampleDataHandler(event:SampleDataEvent):void {
   var bytesToRead:int = (bArr.bytesAvailable > 65536 ? 65536 : bArr.bytesAvailable);
   event.data.writeBytes(bArr, bArr.position, bytesToRead);
   bArr.position += bytesToRead;
  }

データをサンプリングする前にwavヘッダーを削除することを忘れないでください。また、サンプルレートが44.1kHzの場合にのみ機能します。他のサンプルレートの場合、サンプルを手動で繰り返すか削除して、44.1kHzのようにする必要があります。左と&の両方を供給する必要があるため、モノラルサウンドに注意してください。 Flashへの正しいチャネルサンプル。サンプルを繰り返す必要があります。

良い出発点は、Popforgeのaudio.format.wavパッケージ内のWavDecoderクラスです。

以下は私にとってはうまくいきます:

package
{
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.SampleDataEvent;
 import flash.media.Sound;
 import flash.media.SoundChannel;
 import flash.net.URLRequest;
 import flash.net.URLStream;
 import flash.utils.ByteArray;

 public class QuickSoundTest extends Sprite
 {
  public var sampleMP3:Sound;
  private var soundChannel:SoundChannel; 
  public var bArr:ByteArray;

  public function QuickSoundTest()
  {
   sampleMP3 = new Sound();

   var urlReq:URLRequest = new URLRequest("test.mp3");
   var urlStream:URLStream = new URLStream();
   urlStream.addEventListener(Event.COMPLETE, loaded);
   urlStream.load(urlReq);

  }

  private function loaded(event:Event):void {
   var urlStream:URLStream = event.target as URLStream;
   bArr = new ByteArray();
   urlStream.readBytes(bArr, 0, 40960);
   sampleMP3.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
   soundChannel = sampleMP3.play();
  }

  private function sampleDataHandler(event:SampleDataEvent):void {
   event.data.writeBytes(bArr, 0, 40960);
  }
 }
}

readResponse ByteArrayに保存されている内容、または読み込み中にデータを読み込む方法を確認する必要がある場合があります。 URLLoaderDataFormat.BINARYを使用して、またはここで行ったようにURLStreamを使用して、URLLoaderが読み込まれていることを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top