2012-04-07 301 views
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始終是立體聲。

我讀過,如果你「只是分配一個緩衝區的原始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音頻速度正常,但聽起來像花栗鼠。

+0

你是說'minBufferSize'的一個緩衝區是N秒的音頻,但另一個是2N秒的音頻? – Gabe 2012-04-07 17:01:10

+0

我更新了這個問題,經過研究,將單聲道轉換爲立體聲似乎更好,但我仍然遇到問題。 minbufferSize是立體聲中N秒的音頻。所以當我以1:1混合wavbuffer時,它播放的速度太快了。 – nawlrus 2012-04-07 19:05:20

+0

對'mixedBuffer'的操作有什麼作用?如果您只是將一個樣本添加到另一個樣本並將結果舍入到16位中,您將無法獲得任何好的結果。你必須調整結果。至於原始的WAV數據,是的,你只需交錯樣本(假設你已經修復了數據頭)。 – Malcolm 2012-04-07 19:34:49

回答

2

在我看來,就好像你的第一個for循環應該是

j < minBufferSize - 1 

/2就意味着你將永遠不會讀取所有的波緩衝區的或寫你的整個音響緩衝區, - 即使你只讀一半波緩衝區,因爲這是所有的數據,因爲它是單聲道的,你仍然需要寫整個立體聲緩衝區。你還需要將J增加1而不是2,這樣你可以讀取每個單聲道採樣。

速度問題似乎是因爲你應該在j和k上設置立體聲波緩衝器都等於在j處的波緩衝器。它似乎只是複製原始單聲道文件的一半。然後將其作爲立體聲回放(即:將字節速率翻倍)。

我想第一個循環看起來應該更喜歡這種

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; 
} 

-edited修復壞的ipad打字!

+0

聖潔的廢話。非常感謝。這工作。這是我第一次處理音頻,所以我的邏輯完全關閉了。非常感謝!! – nawlrus 2012-04-07 22:04:22

相關問題