2011-02-26 19 views
3

我有兩個不同音頻剪輯的兩個採樣數組。如果我只是以編程方式將它們添加到一起,這將相當於在音頻編輯套件中將一個音軌疊加到另一個音軌上嗎?就好像我有一個低音鼓的音頻片段,我希望他們一起演奏。以編程方式合併兩段音頻

我可能會做這樣的事情:

for (int i = 0; i < length_of_array; i++){ 
    final_array[i] = first_array[i] + second_array[i]; 
} 

如果不這樣做的方式,我能得到什麼是正確的做法一些指示?

+2

你試過看看它聽起來像什麼嗎? (實際上,要*聽到*它聽起來更像是正確的) – 2011-02-26 09:49:11

回答

10

這是一個正確的方法。合併在音頻行話中稱爲混音。

但是:

如果你的樣品是短(16位有符號) - 你將不得不使用int(32位有符號)加法,然後手工裁剪的樣品。如果不這樣做,你的價值觀會包裹,你就會有這麼多的樂趣聽你做了什麼:)

這裏談到的代碼:

short first_array[1024]; 
short second_array[1024]; 
short final_array[1024]; 
for (int i = 0; i < length_of_array; i++) 
{ 
    int mixed=(int)first_array[i] + (int)second_array[i]; 
    if (mixed>32767) mixed=32767; 
    if (mixed<-32768) mixed=-32768; 
    final_array[i] = (short)mixed; 
} 

在大多數情況下,你不需要任何否則用於正常音頻採樣,因爲剪輯將在極其罕見的情況下發生。我是從實踐談起而不是從理論談起。

+0

不錯的工作!謝謝:) – 2011-02-26 19:03:50

+1

@Daniel你將如何在php或任何其他服務器端語言中使用兩個mp3(例如)文件來完成此操作? – trainoasis 2014-05-19 14:46:18

+1

@trainoasis你不會。爲了混合2個mp3,你必須將它們解碼爲PCM,然後(如果需要的話)重新編碼回mp3。直接的mp3混音是不可能的。至少不是在字節級別。 – 2014-05-21 08:57:04

1

一般來說,這會得到你想要的 - 但是,請注意clipping。也就是說,小心不要結束整數溢出;並且不要通過將該值限制爲所討論的類型的最大值/最小值來避免這種情況。您可能需要應用compressor才能將這些值添加到範圍內。

+0

+1第二鏈接 – 2014-05-28 21:03:36

5

如果兩個音頻剪輯的採樣率和所需混音級別相同,則您的上述合併方法將起作用。如果所需的混合水平是不同的,那麼你的調音臺的一個稍微更一般的形式是這樣的:

mixed_result[i] = rescale_and_clip_fix(volume1 * input1[i] + volume2 * input2[i]); 

凡rescale_and_clip_fix()可能是一個限制器或壓縮機,以下確保相乘後的規模是正確的結果的數據類型。如果結果數組是整數數據類型,那麼您可能還想在縮放時進行舍入或噪聲過濾。

如果採樣率不同,則需要首先對其中一個輸入通道和/或之後的結果進行採樣率轉換。

相關問題