Я использую потребительскую модель производителя для потоковой передачи аудио через сокеты в PyAudio. У меня есть один процесс, получающий данные из сокетов, процесс, затем помещающий их в очередь, в то время как другой процесс получает данные из очереди и записывает их в поток. Пока это работает, я получаю недостаточное количество + отсечение во время отдельных частей потока. Мой код по сути как таковой
Process1
CHUNK = 1024
q = queue
data = s.recv(CHUNK)
#processes data
if q.qsize() < CHUNK * 2: #arbitrary value
q.put(data)
while q.qsize() > CHUNK:
time.sleep(5)
#I use this to allow the queue to be emptied
#by the stream and manage my memory somewhat.
Process2
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=CHANNELS, rate=RATE, frames_per_buffer=CHUNK, output=True)
while True:
if q.empty() is False:
stream.write(q.get(), exception_on_underflow=True)
Я сделал некоторую регистрацию, чтобы регистрировать данные до и после того, как показывается исключение недостаточного потока, и я замечаю, что недостаточное заполнение будет происходить только когда q> = CHUNK (например, 1025,1026) или при первоначальном заполнении потока до 1024, и stream.get_write_availble всегда был> 15000 из общего числа 16384. Я знаю, что потоку не хватает данных, но я не совсем понимаю, почему и как это возможно, когда очередь никогда не пуста (например, всегда есть данные для чтения в поток). Любая помощь приветствуется.