Frage

Also .. Ich habe einen Puffer mit MP3-Daten (Wenn ich würde diesen Puffer speichern und nenne es buffer.mp3 würde es spielen, aber in dieser Situation soll ich es nicht auf dem Dateisystem speichern) . Ich habe es zu spielen, aber ich kann nicht, was soll ich tun?


habe ich versucht, den nächsten Code, dass buffrer (ByteArray \ Stream) zu spielen (ich MP3-Daten vom Server erhalten die Methode der Daten immer funktioniert (getestet auf Text int usw.) Ich rufe die zurück ByteArray Readresponse, weil ich einige seading Verfahren haben und es ist, es ist response).

            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);  
        }
War es hilfreich?

Lösung

Dies funktioniert nicht, da SampleDataEvent.data komprimierte RAW-Sample-Daten erwartet, nicht MP3. Verwenden Sie http://wiki.github.com/claus/as3swf / Play-mp3-direkt-from-bytearray statt.

Andere Tipps

Ich glaube nicht, gibt es eine Lösung, um binäre Daten MP3, aber wenn es sich um eine wav ein ist, dann sollte diese Arbeit:


   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 daran, wav-Header zu entfernen, bevor obwohl Daten abgetastet wird. Auch ist es funktioniert nur dann gut, wenn Abtastrate 44,1 kHz. Für andere Abtastraten, müssen Sie manuell Proben wiederholen oder zu entfernen, um es 44,1 artig zu machen. zahlen Sie die Aufmerksamkeit auf Mono-Sounds, wie Sie beide linke und rechte Kanalproben auf Flash liefern müssen, damit Proben wiederholen müssen.

Guter Ausgangspunkt ist WavDecoder Klasse innerhalb Popforge der audio.format.wav Pakets.

Die folgenden Werke für mich:

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

Sie müssen möglicherweise überprüfen, was in Ihrer Readresponse ByteArray gespeichert wird oder wie die Daten in immer lesen, wenn Sie es sind geladen. Sicherzustellen, dass sie die URLLoader mit URLLoaderDataFormat.BINARY geladen wird oder nur durch einen URLStream mit, wie ich hier getan habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top