2012-05-04 3 views
1

그래서 간단한 플래시 게임을 만들고 있습니다. 기본적으로 나는 여러 개의 레이어로 합쳐져서 최종 노래를 구성하는 몇 가지 샘플 음악으로 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; 
    } 



} 

답변

2

나는 내가 당신의 생각을 얻었다고 생각한다.

퍼널과 같이 모든 SoundChannel 클래스 (사운드 레이어가 추가됨)를 SoundMixer 클래스에 전달해야합니다 (어도비 사이트에 많은 정보가 있습니다). 그런 다음 SAMPLEDATA 이벤트 리스너를 추가해야합니다 soundmixer를 호출하고 해당 사운드 믹서의 바이트 배열을 캡처하면 최종 믹스 다운의 바이트 배열을 가져 오는 것과 같습니다. 그런 다음 해당 바이트를 wav or mp3으로 인코딩합니다. 죄송합니다. 코드를 작성할 수는 없지만 코드는 아직 좋지 않지만 믹싱 사운드는 훌륭합니다. 여기

어도비 사이트 자체 형태의 예는 다음과 같습니다

function loaded(event:Event):void 
{ 
    outputSnd.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound); 
    outputSnd.play(); 
} 

유용한 링크 : http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html

SoundMixer 클래스 링크 : http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundMixer.html

0

층운 (권운) 인터넷 라디오 실험 전에서 SoundMixer.computeSpectrum() 사용 서버 쪽을 선택하고 그리기 및 재생을 위해 NetStream.send()을 사용하여 해당 데이터를 클라이언트 측으로 전달했습니다.
그것은 작동하지만, 아주 (여러 곡 그래서, computeSpectrum()을 시도로드 및 원시 오디오 데이터 :

로 변환으로하고, 그것이 "오디오 로그"를 만들기위한 완벽한 것 같다 하나의 컴퓨터에 클라이언트와 서버와의 배고픈 램되었다

+0

감사합니다! 나는 그것을 밖으로 체크하고 메신저가 끝날 때 결과 게시 :) – user1375895