2

16ビットのモノラルサウンドをステレオに変換しようとしています。サウンドはバイト配列として格納されるため、私の理解では、一度に 2 バイトを複製することになります。

ここに画像の説明を入力

私はこれを正しく行っていますか?私が作成したコードは、周波数を変更します。

編集:

モノトーンの生成と保存に成功していますbyte [] generatedSnd

モノラルサウンドの再生 (動作中):

    AudioTrack audioTrack = null;                                   // Get audio track
    try {
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, (int)numSamples*2,
                AudioTrack.MODE_STATIC);
        audioTrack.setStereoVolume(0f, 1f);
        audioTrack.write(generatedSnd, 0, generatedSnd.length);     // Load the track
        audioTrack.play();                                          // Play the track
    }
    catch (Exception e){ }

ステレオ サウンドへの変換:

    int monoByteArrayLength = generatedSnd.length;
    byte [] stereoGeneratedSnd = new byte[monoByteArrayLength * 2];

    stereoGeneratedSnd[0] = generatedSnd[0];
    stereoGeneratedSnd[2] = generatedSnd[0];

    for (int x=1; x<monoByteArrayLength; x+=2) {

        stereoGeneratedSnd[x*2-1] = generatedSnd[x];
        stereoGeneratedSnd[x*2+1] = generatedSnd[x];

        if (x+1 < monoByteArrayLength) {
            stereoGeneratedSnd[x*2] = generatedSnd[x+1];
            stereoGeneratedSnd[x*2+2] = generatedSnd[x+1];
        }
    }

    AudioTrack audioTrack = null;                                   // Get audio track
    try {
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate, AudioFormat.CHANNEL_OUT_STEREO,
                AudioFormat.ENCODING_PCM_16BIT, (int)numSamples*2,
                AudioTrack.MODE_STATIC);
        audioTrack.setStereoVolume(0f, 1f);
        audioTrack.write(stereoGeneratedSnd, 0, stereoGeneratedSnd.length);     // Load the track
        audioTrack.play();                                          // Play the track
    }
    catch (Exception e){ }

私がやろうとしているのは、1つのチャンネルだけからサウンドを再生することです

4

2 に答える 2

5

一度に2バイトを複製するのは意図的ですか? 16bit PCM Wave フォーマットのステレオモードは次のようになります。

DATA[ ] : [1st byte from Chanel 1], [1st byte from Chanel 2], [2nd byte from Chanel 1], [2nd byte from Chanel 2]...

したがって、モノをステレオに変換する場合、配列は次のようになります。

Mono   : 0, 1, 2, 3 ...
Stereo : 0, 0, 1, 1, 2, 2, 3, 3 ...

チャンネルが 1 つだけ必要な場合

Stereo : 0, 0, 1, 0, 2, 0, 3, 0 ...
于 2015-03-30T06:48:51.923 に答える
2

倍加アルゴリズムからの出力は です0, 1, 2, 1, 2, 3, 4, 3, 4, 5, 0, 5

倍増を行うより簡単な (そして正しい) 方法は次のとおりです。

for (int i = 0; i < monoByteArrayLength; i += 2) {
    stereoGeneratedSnd[i*2+0] = generatedSnd[i];
    stereoGeneratedSnd[i*2+1] = generatedSnd[i+1];
    stereoGeneratedSnd[i*2+2] = generatedSnd[i];
    stereoGeneratedSnd[i*2+3] = generatedSnd[i+1];
}

出力:0, 1, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5

于 2013-10-11T08:02:36.840 に答える