12 Stimmen

Wie spielt man MP3-Sound aus einem Puffer (ByteArray/Stream) in ActionScript 3 ab?

Also ich habe eine Puffer mit MP3-Daten (Wenn ich diesen Puffer speichern würde und ihn buffer.mp3 nennen würde, würde er abgespielt werden, aber in dieser Situation sollte ich ihn nicht im Dateisystem speichern). Ich muss es spielen, aber ich kann nicht, was soll ich tun?


Ich habe versucht, den folgenden Code zu spielen, dass buffrer(ByteArray \Stream ) (Ich bekomme MP3-Daten vom Server die Methode des Erhaltens von Daten funktioniert gut (getestet auf Text int's etc.) Ich rufe die zurückgegebene ByteArray readResponse, weil ich einige Seading-Methode haben und es ist es die Antwort).

            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 Stimmen

Dieser Thread könnte hilfreich sein stackoverflow.com/questions/1553563/

5voto

Vancura Punkte 66

Dies funktioniert nicht, da SampleDataEvent.data unkomprimierte Rohsample-Daten erwartet, nicht MP3. Verwenden Sie https://github.com/claus/as3swf/wiki/play-mp3-directly-from-bytearray stattdessen.

4voto

YTF Punkte 41

Ich glaube nicht, dass es eine Lösung für mp3-Binärdaten gibt, aber wenn es sich um eine wav-Datei handelt, sollte dies funktionieren:

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

Denken Sie jedoch daran, den wav-Header vor dem Sampling der Daten zu entfernen. Außerdem funktioniert es nur gut, wenn die Samplerate 44,1 kHz beträgt. Bei anderen Sampleraten müssen Sie Samples manuell wiederholen oder entfernen, um sie 44,1kHz-ähnlich zu machen. Achten Sie auf Mono-Sounds, da Sie Flash sowohl Samples für den linken als auch für den rechten Kanal zur Verfügung stellen müssen, also Samples wiederholen müssen.

Ein guter Ausgangspunkt ist die Klasse WavDecoder im audio.format.wav-Paket von Popforge.

2voto

Joshua Noble Punkte 830

Bei mir funktioniert das wie folgt:

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

Möglicherweise müssen Sie überprüfen, was in Ihrem readResponse ByteArray gespeichert ist oder wie die Daten eingelesen werden, wenn Sie sie laden. Stellen Sie sicher, dass es die URLLoader mit URLLoaderDataFormat.BINARY oder einfach durch die Verwendung eines URLStream geladen wird, wie ich hier getan habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X