12
votes

Comment jouer au son MP3 de la mémoire tampon (byTeArray / flux) dans ActionScript 3?

SO .. J'ai un tampon avec des données MP3 forts> (si je sauvegarderiez ce tampon et appelez-le tampon.mp3 il jouerait, mais dans cette situation, je ne devrais pas l'enregistrer au système de fichiers) . Je dois y jouer, mais je ne peux pas, que dois-je faire? strong>


J'ai essayé le code suivant pour jouer ce tampon (byteArray \ flux) (i Obtenir des données MP3 du serveur La méthode d'obtention de données fonctionne bien (testée sur le texte Int, etc.) J'appelle la réponse renvoyée par ByTeArray ReadReResponse, car j'ai une méthode de saisie et c'est une réponse). P>

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


1 commentaires

3 Réponses :


2
votes

Les œuvres suivantes pour moi:

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


1 commentaires

Comme @ user238621, dit cela ne me donne qu'un tas de sons distorqués aléatoires



5
votes

Celui-ci ne fonctionne pas depuis SampleDatevent.data attend des données d'échantillons bruts non compressés, pas mp3. Utilisez https://github.com/claus/as3swf/wiki / Play-Mp3-directement-directement-byteArray à la place.


0 commentaires

4
votes

Je ne pense pas qu'il existe une solution aux données binaires MP3, mais si c'est une solution de WAV, cela devrait fonctionner:

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


0 commentaires