Domanda

Quindi .. Ho un buffer con dati MP3 (Se salvassi questo buffer e lo chiamassi buffer.mp3, sarebbe riprodotto, ma in questa situazione non dovrei salvarlo nel file system) . Devo giocarci, ma non posso, cosa devo fare?


Ho provato il codice successivo per riprodurre quel buffer (ByteArray \ Stream) (ottengo i dati MP3 dal server il metodo per ottenere i dati funziona bene (testato su int di testo ecc.) chiamo il ByteArray readResponse restituito perché ho un metodo di salvezza ed è la sua risposta).

            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);  
        }
È stato utile?

Soluzione

Questo non funziona poiché SampleDataEvent.data prevede dati di campionamento non compressi, non MP3. Usa http://wiki.github.com/claus/as3swf / play-mp3-direttamente-da-bytearray invece.

Altri suggerimenti

Non credo che ci sia una soluzione per i dati binari mp3, ma se è uno wav, allora dovrebbe funzionare:


   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;
  }

Ricorda però di rimuovere l'intestazione wav prima di campionare i dati. Inoltre, funziona bene solo quando la frequenza di campionamento è di 44,1 kHz. Per altre frequenze di campionamento, è necessario ripetere o rimuovere manualmente i campioni per renderlo simile a 44,1 kHz. Prestare attenzione ai suoni mono, poiché è necessario fornire sia sinistro che amp; campioni di canale destro su Flash, quindi è necessario ripetere i campioni.

Un buon punto di partenza è la classe WavDecoder all'interno del pacchetto audio.format.wav di Popforge.

Per me funziona quanto segue:

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

Potrebbe essere necessario controllare cosa è memorizzato nel ByteArray readResponse o come vengono letti i dati durante il caricamento. Assicurarsi che sia caricato URLLoader usando URLLoaderDataFormat.BINARY o semplicemente usando un URLStream come ho fatto qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top