Я пытаюсь открыть стереопоток и преобразовать его в моно, используя модуль wave в питоне. До сих пор мне удавалось записать один (левый или правый) канал из 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()
То, что я получаю от этого, является "потрескавшейся" версией источника. Я пробовал разные комбинации (возможно, я неправильно понял всю эту вещь), но пока безуспешно.