缓冲区溢出错误是因为您的frames_per_buffer和读取块大小可能太小。
尝试为它们设置更大的值,即 512,2048, 4096, 8192 等
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 2
for CHUNK1 in [512,2048,4096,8192,16384]:
for CHUNK2 in [512,2048,4096,8192,16384]:
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK1)
try:
print CHUNK1,CHUNK2
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK2)
except:
print "Boohoo"
stream.stop_stream()
stream.close()
Update
好吧,我想我明白了。如果您在下次读取之前等待太久,pyaudio 库将引发溢出错误。
byte_string = ''.join(data)
nums = array.array('h', byte_string)
for elt in nums[1::2]:
left.put(elt)
for elt in nums[0::2]:
right.put(elt)
这在这里进行了大量非常缓慢的处理。尤其是两个for
python 中的循环。让处理过程获取它可以处理的一整块单流数据,而不是一次处理一个 int。
import numpy as np
...
n=np.fromstring(data,np.uint16)
left.put(n[1::2])
right.put(n[0::2])
我什至不想想象for
循环会导致延迟,但即使是相对地使用之间的微小性能改进array
and np.array
值得注意的是:
a=array.array('h',s)
n=np.array(a)
In [26]: %timeit n[1::2]
1000000 loops, best of 3: 669 ns per loop
In [27]: %timeit n[1::2].copy()
1000 loops, best of 3: 725 us per loop
In [28]: %timeit a[1::2]
1000 loops, best of 3: 1.91 ms per loop