Question

Donc .. j'ai un tampon contenant des données MP3 (si je voulais enregistrer ce tampon et l'appeler tampon.mp3, il serait lu, mais dans ce cas, je ne devrais pas l'enregistrer dans un système de fichiers) . Je dois y jouer mais je ne peux pas, que dois-je faire?

J'ai essayé le code suivant pour lire ce tampon (ByteArray \ Stream) (j'obtiens des données MP3 du serveur. La méthode d'obtention des données fonctionne correctement (testée sur du texte entier, etc.). J'appelle le readResponse ByteArray renvoyé parce que j'ai une méthode de lecture et c’est sa réponse).

            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);  
        }
Était-ce utile?

La solution

Celui-ci ne fonctionne pas car SampleDataEvent.data attend des exemples de données brutes non compressées, pas de MP3. Utilisez http://wiki.github.com/claus/as3swf / play-mp3-directement-de-bytearray à la place.

Autres conseils

Je ne pense pas qu'il existe une solution pour les données binaires mp3, mais si c'est un fichier 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;
  }

N'oubliez pas de supprimer l'en-tête wav avant d'échantillonner les données. En outre, cela ne fonctionne bien que lorsque la fréquence d'échantillonnage est de 44,1 kHz. Pour les autres fréquences d'échantillonnage, vous devez répéter ou supprimer manuellement les échantillons pour obtenir une résolution de 44,1 kHz. Faites attention aux sons mono, car vous devez fournir à la fois les touches left & amp; les échantillons du canal droit en Flash, il est donc nécessaire de répéter les échantillons.

Le bon point de départ est la classe WavDecoder dans le paquet audio.format.wav de Popforge.

Ce qui suit fonctionne 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);
  }
 }
}

Vous devrez peut-être vérifier ce qui est stocké dans votre ByteArray readResponse ou la manière dont les données sont lues lorsque vous les chargez. Assurez-vous qu’il est chargé dans URLLoader à l’aide d’URLLoaderDataFormat.BINARY ou tout simplement en utilisant un URLStream comme je l’ai fait ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top