PyAudio и переполнение буфера

Я пытаюсь использовать 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()


person user1685095    schedule 04.06.2014    source источник


Ответы (1)


Ваша проблема похожа на ту, которую я воспроизвел, используя режим блокировки для pyaudio.

Мое воспроизведение также закончилось до того, как продолжительность звука могла бы закончиться. Я подозреваю, что подавал звук быстрее, чем pyaudio мог его воспроизвести. Мне так и не удалось решить проблему в режиме блокировки.

Я решил проблему, используя обратный вызов вместо того, чтобы пытаться использовать режим блокировки.

Пример того, как это сделать, приведен здесь< /а>

person Jeremy Spykerman    schedule 26.11.2014