使用PyAudio防止ALSA不足

时间:2013-10-07 17:24:16

标签: python-3.x alsa pyaudio

我写了一个小程序,它记录麦克风的声音并通过网络发送并在那里播放。我正在使用PyAudio来完成这项任务。它工作得很好但是在两台计算机上我都从ALSA那里得到错误,发生了欠载。我搜索了很多关于它的内容,现在我知道甚至是一个不足的内容。但我仍然不知道如何解决这个问题。大多数时候声音很好。但如果发生不足,这听起来有点奇怪。我的代码中有什么我应该处理的吗?感觉我正在做一个简单的错误,我想念它。

我的系统:python:python3.3,操作系统:Linux Mint Debian Edition UP7,PyAudio v0.2.7

3 个答案:

答案 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)