PyAudio和缓冲区溢出

时间:2014-06-04 12:47:31

标签: python portaudio buffer-overrun

我正在尝试使用pyaudio来播放

的流媒体音频

我正在获取一些数据,处理它然后将它们放到音频流中。

数据速率非常稳定,有一些抖动。

我可以在日志中看到数据速率是恒定的,并且处理是实时的。

Demodulation ended after 0.0877389907837 seconds
demodulation tooked  0.0463800430298 seconds
Data is coming with period -0.150208950043 seconds

所以我有0.150秒的音频,我已经在0.08秒处理了它。

然后在播放器程序日志中,我看到一开始一切正常。实际播放数据的时间几乎与它应该的时间相同(例如150毫秒)。然后在某些时候这个时间减少了,我看到这个缓冲区溢出错误。就像数据不会及时到达一样。但正如我在日志中看到的那样,数据处理仍然是实时的。所以我不知道为什么会这样。

这是我的多处理音频播放器代码。

class MultiprocessedAudioPlayer(object):

    def __init__(self, sampling_frequency, min_buffer_size=1, max_buffer_size=10, sample_width=2):
        self.p = PyAudio()
        self.stream = self.p.open(format=self.p.get_format_from_width(width=sample_width), rate=sampling_frequency,
                                  output=True, channels=1)
        self.sub = ZmqSubscriber(host='tcp://localhost', port='8888', on_receive_callback=self.on_frame_received)
        self.buffer = deque(maxlen=max_buffer_size)

    def on_frame_received(self, frame):
        self.play(blosc.unpack_array(frame[0]))

    def play(self, frame):
        print('started playing frame at {}'.format(datetime.now()))
        print('frame length is {}'.format(len(frame)))
        self.stream.write(frame, num_frames=len(frame))
        print('stopped playing frame at {}'.format(datetime.now()))

    def close(self):
        self.stream.stop_stream()
        self.stream.close()
        self.p.terminate()

1 个答案:

答案 0 :(得分:1)

您的问题听起来与我使用pyaudio阻止模式播放的问题类似。

我的播放也在音频持续时间可能完成之前完成。我怀疑我提供的音频比pyaudio能够播放的速度更快。我从未设法在阻止模式下解决问题。

我解决问题的方法是使用回调而不是尝试使用阻止模式。

如何执行此操作的示例是Here