문제

그래서 .. 나는 a MP3 데이터로 버퍼 (이 버퍼를 저장하고 Buffer.mp3이라고 부르면이 상황에서는 파일 시스템에 저장해서는 안됩니다). 나는 그것을 연주해야하지만 할 수는 없다. 나는 무엇을해야합니까?


다음 코드를 시도하여 해당 Buffrer (BytearRay Stream)를 재생하려고 시도했습니다 (서버에서 MP3 데이터를 얻습니다. 데이터를 얻는 방법이 정상적으로 작동합니다 (텍스트 int 등에서 테스트). 나는 returedearray readResponse라고 부릅니다. 응답).

            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);  
        }
도움이 되었습니까?

해결책

이것은 sampledataevent.data가 MP3가 아닌 압축되지 않은 원시 샘플 데이터를 기대하기 때문에 작동하지 않습니다. 사용 http://wiki.github.com/claus/as3swf/play-mp3-directly-from-bytearray 대신에.

다른 팁

MP3 바이너리 데이터에 대한 해결책이 있다고 생각하지 않지만 WAV라면 작동해야합니다.


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

그래도 데이터를 샘플링하기 전에 WAV 헤더를 제거해야합니다. 또한 샘플 속도가 44.1kHz 인 경우에만 잘 작동합니다. 다른 샘플 속도의 경우 44.1kHz와 같은 샘플을 수동으로 반복하거나 제거해야합니다. 왼쪽 및 오른쪽 채널 샘플을 플래시에 공급해야하므로 모노 사운드에주의를 기울이므로 샘플을 반복해야합니다.

좋은 출발점은 Popforge의 Audio.format.wav 패키지 내부의 Wavdecoder 클래스입니다.

다음은 저를 위해 작동합니다.

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

readResponse ByTearRay에 저장된 내용 또는로드 할 때 데이터를 읽는 방법을 확인해야 할 수도 있습니다. urlloaderDataformat.binary를 사용하여 urlloader를로드하거나 여기에서 한 것처럼 URLStream을 사용하여로드하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top