我写了一个小程序,它记录麦克风的声音并通过网络发送并在那里播放。我正在使用PyAudio来完成这项任务。它工作得很好但是在两台计算机上我都从ALSA那里得到错误,发生了欠载。我搜索了很多关于它的内容,现在我知道甚至是一个不足的内容。但我仍然不知道如何解决这个问题。大多数时候声音很好。但如果发生不足,这听起来有点奇怪。我的代码中有什么我应该处理的吗?感觉我正在做一个简单的错误,我想念它。
我的系统:python:python3.3,操作系统:Linux Mint Debian Edition UP7,PyAudio v0.2.7
答案 0 :(得分:3)
您是否考虑过同步声音? 你没有提供代码,所以我的猜测是你需要在一个单独的线程中有一个定时器,它将执行如下所示的每个CHUNK_SIZE / RATE毫秒代码:
silence = chr(0)*self.chunk*self.channels*2
out_stream = ... # is the output stream opened in pyaudio
def play(data):
# if data has not arrived, play the silence
# yes, we will sacrifice a sound frame for output buffer consistency
if data == '':
data = silence
out_stream.write(data)
假设此代码将定期执行,这样我们将始终提供一些音频数据来输出音频流。
答案 1 :(得分:0)
如果需要,可以通过填充静音来防止欠载。 看起来像那样:
#...
data = s.recv(CHUNK * WIDTH) # Receive data from peer
stream.write(data) # Play sound
free = stream.get_write_available() # How much space is left in the buffer?
if free > CHUNK # Is there a lot of space in the buffer?
tofill = free - CHUNK
stream.write(SILENCE * tofill) # Fill it with silence
#...
答案 2 :(得分:0)
我的解决方案是缓冲录制声音的前 10 个数据包/帧。看下面的片段
BUFFER = 10
while len(queue) < BUFFER:
continue
while running:
recorded_frame = queue.pop(0)
audio.write(recorded_frame)