Como jogar som MP3 de tampão (ByteArray / Stream) em ActionScript 3?
-
06-07-2019 - |
Pergunta
Então .. Eu tenho um buffer com dados MP3 (Se eu salvar este tampão e chamá-lo buffer.mp3 ele iria jogar, mas nesta situação eu não deveria guardá-lo no sistema de arquivos) . eu tenho que jogá-lo, mas não posso, o que devo fazer?
Eu tentei o seguinte código para jogar esse buffrer (ByteArray \ Stream) (I obter dados MP3 a partir de servidor do método de obtenção de dados funciona bem (testado em de int texto etc) eu chamo o retornou ByteArray readResponse porque eu tenho algum método seading e é a sua resposta).
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);
}
Solução
Este não funciona desde SampleDataEvent.data espera dados de amostra RAW sem compressão, e não MP3. Use http://wiki.github.com/claus/as3swf / play-mp3-diretamente-de-bytearray .
Outras dicas
Eu não acho que há uma solução para dados mp3 binários, mas se é um wav, então isso deve 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;
}
Lembre-se de remover o cabeçalho de wav antes de provar de dados embora. Além disso, ele só funciona bem quando a taxa de amostragem de 44.1kHz. Para outras taxas de amostragem, você precisa amostras repetidas ou remover manualmente para torná-lo 44,1-like. Fazer prestar atenção ao mono sons, como você precisa fornecer duas amostras de canais esquerdo e direito para Flash, portanto, necessidade de amostras repetidas.
bom ponto de partida é a classe WavDecoder dentro do pacote audio.format.wav de Popforge.
Os seguintes trabalhos para mim:
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);
}
}
}
Você pode precisar verificar o que está armazenado em sua readResponse ByteArray ou como os dados está sendo lido em quando você está carregando-lo. Certificar-se de que ele é carregado o URLLoader usando URLLoaderDataFormat.BINARY ou apenas usando um URLStream como eu fiz aqui.