Actionscript 3에서 버퍼 (BytearRay/Stream)에서 MP3 사운드를 재생하는 방법?
-
06-07-2019 - |
문제
그래서 .. 나는 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을 사용하여로드하십시오.