그래서 간단한 플래시 게임을 만들고 있습니다. 기본적으로 나는 여러 개의 레이어로 합쳐져서 최종 노래를 구성하는 몇 가지 샘플 음악으로 30 초 동안 진행되는 턴테이블을 가지고 있습니다.게임 세션 소리 재생/녹음
이제 게임이 끝날 때 소리를 녹음하고 재생할 수 있기를 바랍니다.
저는 MP3 오디오를 받아 들여 동일한 사운드 채널에 오디오를 믹스하려는 희망으로 byteArrays로 바꾸는 SoundFx 클래스를 만들었습니다.
이제 필자는 바이타 레이를 제대로 혼합 할 수 없기 때문에 일정한 한계에 도달했습니다. 믹스에 채널을 추가 할 때 바이트 배열을 인코딩 할 수 없다고 생각하기 시작했습니다.
나는 올바른 방향으로 인도하고 싶습니다. 여기서부터 진행하는 가장 좋은 방법은 재생이 좋을 지 모르겠습니다. 버튼 로그를 작성하면 재생을 수정하고 두 번째 실행에서 오디오를 혼합하여 곧바로 파일로 이동합니다. 그러나 이것을 달성하기위한 긴 길처럼 보입니다. 사전에 내 엉터리 영어에 대한
많은 감사와 사과
데이비드 R.
문제에 대한 몇 가지 코드 :
private var srcSound:Sound;
private var sound1:Sound;
private var sound2:Sound;
private var soundChannel:SoundChannel;
private var bytes:ByteArray;
private var incbytes:ByteArray;
private var mixedBytes:ByteArray;
public var pitchShiftFactor:Number;
public var position:Number;
public var AddSound:Boolean = false;
public var incremental:Number;
public var left1:Number;
public var left2:Number;
public var right1:Number;
public var right2:Number;
public var mixedBytes1:Number;
public var mixedBytes2:Number;
public function SoundFx() {
}
public function playFx(srcSound:Sound):void{
this.srcSound = srcSound;
position = 0;
var morphedSound:Sound = new Sound();
morphedSound.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
soundChannel = morphedSound.play();
}
public function addSound(sound1:Sound , sound2:Sound):void{
this.sound1 = sound1;
this.sound2 = sound2;
sound1.addEventListener(SampleDataEvent.SAMPLE_DATA, addSampleData);
position = 0;
soundChannel = sound1.play();
soundChannel = sound2.play();
AddSound = true;
}
private function addSampleData(event:SampleDataEvent):void{
position = 0;
var incbytes:ByteArray = new ByteArray();
position += sound1.extract(incbytes, 4096, position);
var bytes:ByteArray = new ByteArray();
position += sound2.extract(bytes, 4096, position);
event.data.writeBytes(mixBytes(bytes, incbytes));
}
private function sampleDataHandler(event:SampleDataEvent):void
{
var bytes:ByteArray = new ByteArray();
position += srcSound.extract(bytes, 4096, position);
event.data.writeBytes(editBytes(bytes));
}
private function mixBytes(bytes1:ByteArray , bytes2:ByteArray):ByteArray{
bytes.position = 0;
incbytes.position = 0;
var returnBytes:ByteArray = new ByteArray();
while(bytes1.bytesAvailable > 0)
{
left1 = bytes1.readFloat();
left2 = bytes2.readFloat();
right1 = bytes1.readFloat();
right2 = bytes2.readFloat();
mixedBytes1 = left1 + left2;
mixedBytes2 = right1 + right1;
mixedBytes.writeFloat(mixedBytes1);
mixedBytes.writeFloat(mixedBytes2);
}
return mixedBytes;
}
private function editBytes(bytes:ByteArray):ByteArray{
//var skipCount:Number = 0;
var returnBytes:ByteArray = new ByteArray();
bytes.position = 0;
while(bytes.bytesAvailable > 0)
{
//skipCount++;
returnBytes.writeFloat(bytes.readFloat());
returnBytes.writeFloat(bytes.readFloat());
}
return returnBytes;
}
}
감사합니다! 나는 그것을 밖으로 체크하고 메신저가 끝날 때 결과 게시 :) – user1375895