2012-05-04 19 views
1

私は簡単なフラッシュゲームを作っています。基本的には、30秒間連続してターンテーブルを持ち、複数のサンプルレイヤーを組み合わせて、最終的なソングを構成します。ゲームセッションサウンド再生/録音

これで、ゲームの最後にサウンドを録音して再生したいと考えています。

私は、mp3オーディオを取り込んで、同じサウンドチャンネルにオーディオをミックスすることを希望するbyteArraysに変換するSoundFxクラスを作成しました。

私はバイトタイムを適切にミックスすることができないので、今私は一定の邪魔になりました。私はあなたがミックスにチャンネルを追加すると、バイトの配列をエンコードすることは不可能だと思っています。

私は正しい方向に導かれたいと思っています。私はここから進んでいく最善の方法、たとえ再生だけでいいのか分からない。ボタンログを作成すると、おそらく再生を修正し、2回目の実行でオーディオをミキシングしてファイルにまっすぐ進むことができます。これを達成するには長い道のりが間違いないようです。事前に私の安っぽい英語

多くの感謝と謝罪

デヴィッド・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クラスに渡すようにしてください(これはAdobeのサイトで十分です)。そして、それにSAMPLEDATAイベントリスナーを追加してくださいサウンドミキサーを使用し、そのサウンドミキサーのバイト配列をキャプチャすると、最終的なミックスダウンのバイト配列を取得するのと同じようになり、それらのバイトをwav or mp3にエンコードします。 申し訳ありませんが、私はあなたのためにコードを書くことができません、私はまだ非常に良いコードではないが、私は音をミキシングに良いです。ここで

は、Adobe社のサイト自体の形式の例です:

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

関連する問題