2009-10-25 4 views
11

Donc .. J'ai un tampon avec des données MP3 (Si je voudrais enregistrer ce tampon et appelez-le buffer.mp3 il serait jouer, mais dans cette situation, je ne devrais pas enregistrer dans le système de fichiers). Je dois jouer, mais je ne peux pas, que dois-je faire?Comment lire le son MP3 à partir du tampon (ByteArray/Stream) dans ActionScript 3?


J'ai essayé le code suivant à jouer buffrer (ByteArray \ flux) (je reçois des données MP3 à partir du serveur de la méthode d'obtention de données fonctionne très bien j'appelle le retour ByteArray readResponse (testé sur son int texte, etc.) parce que J'ai une méthode de prononciation 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); 
     } 
+0

Ce fil pourrait être utile http://stackoverflow.com/questions/1553563/play-flv-from-bytearray-in-flash-player – Amarghosh

Répondre

2

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

Vous pourriez avoir besoin de vérifier ce qui est stocké dans votre readResponse ByteArray ou comment les données sont aratio lorsque vous le charger. Assurez-vous qu'il est chargé URLLoader en utilisant URLLoaderDataFormat.BINARY ou simplement en utilisant un URLStream comme je l'ai fait ici.

+0

comme @ user238621 a dit que cela me donne seulement un tas de sons distordus aléatoires –

4

Je ne pense pas qu'il y ait une solution au format mp3, les données binaires, mais si elle est un wav un, alors 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; 
    } 

Rappelez-vous d'enlever la tête wav avant que les données d'échantillonnage bien. En outre, cela ne fonctionne 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 des échantillons pour obtenir une fréquence de 44,1 kHz. Faites attention aux sons mono, car vous devez fournir à la fois les échantillons de canal droit & gauche à Flash, donc vous devez répéter les échantillons.

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

Questions connexes