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