我正在尝试使用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()
答案 0 :(得分:1)
您的问题听起来与我使用pyaudio阻止模式播放的问题类似。
我的播放也在音频持续时间可能完成之前完成。我怀疑我提供的音频比pyaudio能够播放的速度更快。我从未设法在阻止模式下解决问题。
我解决问题的方法是使用回调而不是尝试使用阻止模式。
如何执行此操作的示例是Here