Опитвам се да използвам 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 ms например). След това в някакъв момент това време намалява и виждам грешки при препълване на буфера. Както би било, ако данните не пристигат навреме. Но както виждам в регистрационните файлове, обработката на данни все още е в реално време. Така че не знам защо се случва това.
Това е моят код за многопроцесорен аудио плейър.
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()