我試圖打開立體聲流並將其轉換爲單聲道,在python中使用wave module。 到目前爲止,我能寫從16位立體聲小端文件中的單個(左或右)聲道:立體聲到蟒蛇的單波插值
LEFT, RIGHT = 0, 1
def mono_single(cont, chan=LEFT):
a = iter(cont)
mono_cont = ''
if chan:
a.next(); a.next()
while True:
try:
mono_cont += a.next() + a.next()
a.next(); a.next()
except StopIteration:
return mono_cont
stereo = wave.open('stereofile.wav', 'rb')
mono = wave.open('monofile.wav', 'wb')
mono.setparams(stereo.getparams())
mono.setnchannels(1)
mono.writeframes(mono_single(stereo.readframes(stereo.getnframes())))
mono.close()
可正常工作。當我嘗試將兩個立體聲聲道縮混到一個單聲道時,問題就出現了。 我認爲之間的簡單平均值左右就足夠了,而這正是我試圖至今:
def mono_mix(cont):
a = iter(cont)
mono_cont = ''
while True:
try:
left = ord(a.next()) + (ord(a.next()) << 8)
right = ord(a.next()) + (ord(a.next()) << 8)
value = (left + right)/2
mono_cont += chr(value & 255) + chr(value >> 8)
except StopIteration:
return mono_cont
stereo = wave.open('stereofile.wav', 'rb')
mono = wave.open('monofile.wav', 'wb')
mono.setparams(stereo.getparams())
mono.setnchannels(1)
mono.writeframes(mono_mix(stereo.readframes(stereo.getnframes())))
mono.close()
我從這個得到的是一個「噼噼啪啪」的來源的版本。 我嘗試了不同的組合(我可能誤解了整個排列順序),但目前還沒有運氣。
由於選擇單個信道,哪知pydub能夠做那。實際上,它看起來像是在使用我不知道的audioop模塊,所以我想我會檢查它的代碼並編寫自己的函數(我寧願避免使用pydub,因爲我會只需要這種情況)。 – musicamante