2012-04-07 25 views
2

2つの16ビットPCMサンプルを短いバッファーに混合します。Java - 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は常にステレオになることがわかった。

私はどのようにあなたがいる場合「だけのオリジナル緩衝液中で2回、元のPCMデータのサイズ、およびすべてのサンプルのためのバッファを割り当てる新しい緩衝液中で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オーディオは今では普通のスピードですが、チンパンジーのように聞こえます。

+0

「minBufferSize」の1つのバッファがオーディオのN秒ですが、もう1つのバッファは2N秒のオーディオですか? – Gabe

+0

質問を更新しましたが、研究の結果、モノラルをステレオに変換する方が良いようですが、まだ問題が残っています。 minbufferSizeはステレオでN秒間の音声です。だから私は1:1でwavbufferをミックスすると、あまりにも速く再生されます。 – nawlrus

+0

'mixedBuffer'の操作は何をしますか? 1つのサンプルを別のサンプルに追加して16ビットに収まるように結果を丸めれば、良い結果は得られません。結果をスケールする必要があります。生のWAVデータについては、はい、サンプルをインタリーブするだけです(データヘッダーを修正したと仮定して)。 – Malcolm

答えて

2

ループのためのあなたの最初の

j < minBufferSize - 1 

/2であるべきかのようにそれは、あなたが波のバッファのすべてを読んでいないか、あなたの全体のステレオバッファを書くん意味します私には見えます - あなただけ読んでても、ウェーブバッファーの半分です。なぜならモノであるため、これはすべてのデータです。それでもステレオバッファー全体を書き込む必要があります。また、各モノサンプルを読み込むためにJを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のタイピングを修正する-edited!

+0

聖なるくそ。どうもありがとうございます。それはうまくいった。これは私のロジックが完全にオフになるようにオーディオを扱う初めてのことです。どうもありがとうございます!! – nawlrus

関連する問題