Come riprodurre l'audio MP3 dal buffer (ByteArray / Stream) in ActionScript 3?
-
06-07-2019 - |
Domanda
Quindi .. Ho un buffer con dati MP3 (Se salvassi questo buffer e lo chiamassi buffer.mp3, sarebbe riprodotto, ma in questa situazione non dovrei salvarlo nel file system) . Devo giocarci, ma non posso, cosa devo fare?
Ho provato il codice successivo per riprodurre quel buffer (ByteArray \ Stream) (ottengo i dati MP3 dal server il metodo per ottenere i dati funziona bene (testato su int di testo ecc.) chiamo il ByteArray readResponse restituito perché ho un metodo di salvezza ed è la sua risposta).
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);
}
Soluzione
Questo non funziona poiché SampleDataEvent.data prevede dati di campionamento non compressi, non MP3. Usa http://wiki.github.com/claus/as3swf / play-mp3-direttamente-da-bytearray invece.
Altri suggerimenti
Non credo che ci sia una soluzione per i dati binari mp3, ma se è uno wav, allora dovrebbe funzionare:
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;
}
Ricorda però di rimuovere l'intestazione wav prima di campionare i dati. Inoltre, funziona bene solo quando la frequenza di campionamento è di 44,1 kHz. Per altre frequenze di campionamento, è necessario ripetere o rimuovere manualmente i campioni per renderlo simile a 44,1 kHz. Prestare attenzione ai suoni mono, poiché è necessario fornire sia sinistro che amp; campioni di canale destro su Flash, quindi è necessario ripetere i campioni.
Un buon punto di partenza è la classe WavDecoder all'interno del pacchetto audio.format.wav di Popforge.
Per me funziona quanto segue:
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);
}
}
}
Potrebbe essere necessario controllare cosa è memorizzato nel ByteArray readResponse o come vengono letti i dati durante il caricamento. Assicurarsi che sia caricato URLLoader usando URLLoaderDataFormat.BINARY o semplicemente usando un URLStream come ho fatto qui.