2012-09-29 106 views
0

我正在尋找一種方法,可以將多個wave文件合併成一個使用python的wave文件並在linux上運行它。我不想在默認的shell命令行和默認的python模塊之外使用任何添加。例如,如果我有a.wav和b.wav。我想創建一個以a.wav和b.wav中的內容開始的c.wav。 我已經找到了wave模塊,可以打開一個wave文件並寫入一個新文件。因爲我是這個音頻世界的新手。我仍然無法弄清楚如何去做。下面是我的代碼Linux和python:將多個wave文件合併到一個wave文件

import struct, wave 

waveFileA = wave.open('./a.wav', 'r') 
waveFileB = wave.open('./b.wav', 'r') 
waveFileC = wave.open('./c.wav', 'w') 

lengthA = waveFileA.getnframes() 
for i in range(0,lengthA): 
    waveFileC.writeframes(waveFileA.readframes(1)) 

lengthB = waveFileB.getnframes() 
for i in range(0,lengthB): 
    waveFileC.writeframes(waveFileB.readframes(1)) 

waveFileA.close() 
waveFileB.close() 
waveFileC.close() 

當我運行這段代碼,我得到這個錯誤:

wave.Error: # channels not specified 

請任何一個能幫助我嗎?

+1

請發佈它的完整回溯,它死在哪一行? – Perkins

回答

2

看起來您需要撥打n=waveFileA.getnchannels()來查找第一個輸入文件使用的通道數量,對於waveFileB也是如此,那麼您需要使用waveFileC.setnchannels(n)來告訴它要將多少個通道放入外發文件。我不知道它將如何處理不同的數字頻道的輸入文件......

3

你需要設置的通道數,採樣寬度和幀速率:

waveFileC.setnchannels(waveFileA.getnchannels()) 
waveFileC.setsampwidth(waveFileA.getsampwidth()) 
waveFileC.setframerate(waveFileA.getframerate()) 

如果你想處理具有不同設置的a.wav和b.wav,您需要使用像pysox這樣的設置將它們轉換爲相同的設置,或者對於nchannels和sampwidth,您可以自己通過它進行處理。

+0

它看起來像你有一個關鍵,thx。不過,你能告訴我更多的情況,a.wav和b.wav有不同的設置嗎? – victorxiv