1

だから私は簡単なフラッシュゲームを作っています。基本的に、私は30秒間続くターンテーブルを持っており、いくつかのサンプル音楽が複数のサウンドレイヤーに追加されて最終的な曲を形成します。

これで、ゲーム終了時にサウンドを録音して再生できるようにしたいと思います。

同じサウンドチャンネルにオーディオをミックスすることを期待して、mp3オーディオをバイト配列に変換する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;
    }



}
4

2 に答える 2

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

サウンドミキサークラスのリンク: http ://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundMixer.html

于 2012-11-01T06:07:47.097 に答える
0

サーバー側で使用したスト​​ラタス(巻雲)インターネットラジオを試し、そのデータを描画と再生のためSoundMixer.computeSpectrum()にクライアント側に渡しました。 それは機能しましたが、1台のコンピューター上のクライアントとサーバーで非常に空腹でした(そしていくつかの曲がロードされて生のオーディオデータに変換されました:)NetStream.send()

だから、試しcomputeSpectrum()てみてください、それは「オーディオログ」を作成するのに最適のようです

于 2012-05-05T11:17:40.317 に答える