我用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