4

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

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

4

3 回答 3

4

你考虑过同步声音吗?您没有提供代码,所以我的猜测是您需要在单独的线程中有一个计时器,它将执行每个 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) 

假设这段代码会定期执行,这样我们总是会提供一些音频数据来输出音频流。

于 2013-12-17T22:22:26.743 回答
2

如果需要,可以通过填充静音来防止欠载。看起来像这样:

#...
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
#...
于 2014-01-16T20:53:24.630 回答
0

我的解决方案是缓冲录制声音的前 10 个数据包/帧。看下面的片段

BUFFER = 10
while len(queue) < BUFFER:
    continue

while running:
    recorded_frame = queue.pop(0)
    audio.write(recorded_frame)
于 2021-05-31T09:34:18.627 回答