我用Pyaudio从我的麦克风中捕获音频并尝试使用opus编解码器对它进行编码/解码。我使用SvartalF制作的libopus绑定(https://github.com/svartalf/python-opus)。Python:PortAudio + Opus编码/解码
这里是我的代码:
import pyaudio
from opus import encoder, decoder
def streaming(p):
chunk = 960
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 48000
streamin = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
input_device_index = 7,
frames_per_buffer = chunk)
streamout = p.open(format = FORMAT,
channels = CHANNELS,
rate = 48000,
output = True,
output_device_index = p.get_default_input_device_info()["index"],
frames_per_buffer = chunk)
enc = encoder.Encoder(RATE,CHANNELS,'voip')
dec = decoder.Decoder(RATE,CHANNELS)
data = []
for i in xrange(100):
data.append(streamin.read(chunk*2))
streamout.write(''.join(data))
encdata = []
for x in data:
encdata.append(enc.encode(x,chunk))
print "DATA LENGTH :", len(''.join(data))
print "ENCDATA LENGTH :", len(''.join(encdata))
decdata = ''
for x in encdata:
decdata += dec.decode(x,chunk)
print "DECDATA LENGTH :", len(decdata)
streamout.write(decdata)
streamin.close()
streamout.close()
p = pyaudio.PyAudio()
streaming(p)
p.terminate()
我必须把chunk*2
而不是chunk
在data.append(streamin.read(chunk*2))
或DECDATA LENGTH == DATA LENGTH*2
,我不知道为什么。
输出:
DATA LENGTH : 384000
ENCDATA LENGTH : 12865
DECDATA LENGTH : 384000
没有编码/解码中,第一streamout.write(''.join(data))
完美。有了编码/解码,streamout.write(decdata)
有点不错,但有很多混杂的脆皮。
我在做什么错在这里?
你好!我现在没有时间去支持python-opus,但是你可以为它分配和贡献,所以我可以用一个固定版本来更新PyPI回购。 – SvartalF