我將兩個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始終是立體聲。
我讀過,如果你「只是分配一個緩衝區的原始PCM數據大小的兩倍,並在原來的緩衝區每樣把它兩次在新緩衝區」
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音頻速度正常,但聽起來像花栗鼠。
你是說'minBufferSize'的一個緩衝區是N秒的音頻,但另一個是2N秒的音頻? – Gabe 2012-04-07 17:01:10
我更新了這個問題,經過研究,將單聲道轉換爲立體聲似乎更好,但我仍然遇到問題。 minbufferSize是立體聲中N秒的音頻。所以當我以1:1混合wavbuffer時,它播放的速度太快了。 – nawlrus 2012-04-07 19:05:20
對'mixedBuffer'的操作有什麼作用?如果您只是將一個樣本添加到另一個樣本並將結果舍入到16位中,您將無法獲得任何好的結果。你必須調整結果。至於原始的WAV數據,是的,你只需交錯樣本(假設你已經修復了數據頭)。 – Malcolm 2012-04-07 19:34:49