¿Cómo reproducir el sonido MP3 desde el búfer (ByteArray / Stream) en ActionScript 3?
-
06-07-2019 - |
Pregunta
Entonces ... tengo un búfer con datos MP3 (si quisiera guardar este búfer y llamarlo buffer.mp3, se reproducirá, pero en esta situación no debería guardarlo en el sistema de archivos) . Tengo que jugarlo, pero no puedo, ¿qué debo hacer?
Intenté el siguiente código para reproducir ese buffrer (ByteArray \ Stream) (Obtengo datos MP3 del servidor. El método para obtener datos funciona bien (probado en el texto int, etc.) Llamo a la respuesta ByteArray readResponse porque tengo algún método de impresión. y es su respuesta).
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);
}
Solución
Este no funciona, ya que SampleDataEvent.data espera datos de muestra sin comprimir, no MP3. Utilice http://wiki.github.com/claus/as3swf / play-mp3-direct-from-bytearray en su lugar.
Otros consejos
No creo que haya una solución para los datos binarios de mp3, pero si es una wav, entonces debería funcionar:
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;
}
Sin embargo, recuerde eliminar el encabezado wav antes de muestrear datos. Además, solo funciona bien cuando la frecuencia de muestreo es 44.1kHz. Para otras frecuencias de muestreo, debe repetir o eliminar manualmente las muestras para que sean 44.1 kHz. Preste atención a los sonidos mono, ya que necesita suministrar tanto amp; & amp; Muestras del canal correcto a Flash, por lo que es necesario repetir las muestras.
Un buen punto de partida es la clase WavDecoder dentro del paquete audio.format.wav de Popforge.
Lo siguiente funciona para mí:
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);
}
}
}
Es posible que deba verificar lo que está almacenado en su ReadResponse ByteArray o cómo se leen los datos cuando los está cargando. Asegurándome de que haya cargado el URLLoader usando URLLoaderDataFormat.BINARY o simplemente usando un URLStream como lo he hecho aquí.