2

2 つの 16 ビット PCM サンプルを短いバッファーに混合しています。

// This is our buffer for PCM audio data
mp3Buffer = new short[minBufferSize];
wavBuffer = new short[minBufferSize];
mixedBuffer = new short[minBufferSize];

これらのバッファに mp3 ファイルと wav ファイルの両方からのサンプルを入れています。wav ファイルは常にモノラルで、mp3 は常にステレオであることがわかりました。

「元の PCM データの 2 倍のサイズのバッファーを割り当て、元のバッファー内のすべてのサンプルに対して、新しいバッファーに 2 回入れる」と読みました。

short[] stereoWavBuffer = new short[minBufferSize];
int k = 1;
for (int j = 0; j < minBufferSize / 2; j += 2)
{
    stereoWavBuffer[j] = wavBuffer[j];
    stereoWavBuffer[k] = wavBuffer[k];
     k += 2;

                }
                // TO DO -  Add the 2 buffers together

                for (int i = 0; i < minBufferSize; i++){
                    mixedBuffer[i] = (short)(mp3Buffer[i] + stereoWavBuffer[i]);
                }


                track.write(mixedBuffer, 0, minBufferSize); 
}

どうすればこれを達成できますか? これを試してみましたが、wav オーディオは通常の速度になりましたが、シマリスのように聞こえます。

4

1 に答える 1

2

あなたの最初のforループがそうであるように私には見えます

j < minBufferSize - 1

/2 は、Wave バッファーのすべてを読み取ったり、ステレオ バッファー全体を書き込んだりしないことを意味します。Wave バッファーの半分だけを読み取ったとしても、それがすべてのデータであり、モノラルであるため、ステレオ バッファー全体を書き込む必要があります。また、各モノ サンプルを読み取るために、J を 2 ではなく 1 ずつ増やす必要があります。

速度の問題は、ステレオウェーブバッファーを j に設定し、k を両方とも j のウェーブバッファーに等しく設定する必要があるためと思われます。実際には、元のモノファイルの半分を複製しているようです。そしてそれをステレオとして再生します(つまり、バイトレートを2倍にします)。

最初のループはもっとこのように見えるべきだと思います

int k = 0;
for (int j = 0; j < minBufferSize / 2; j++) //Assuming you only have half a buffer since mono???
{
    stereoWavBuffer[k] = wavBuffer[j];
    stereoWavBuffer[k+1] = wavBuffer[j];
     k += 2;
}

-ipad のタイピングの悪さを修正するために編集しました!

于 2012-04-07T20:49:14.570 に答える