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);  
        }
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top