Попытка понять ошибку PyAudio: [Errno -9981] Ввод переполнен

Я пытаюсь выполнить проект обработки звука с помощью PyAudio, но иногда получаю эту ошибку и не понимаю, почему.

Следующий код воспроизводит звук с микрофона моего ноутбука, затем делает паузу на 3 секунды, а затем продолжает. Этот код работает нормально, и во время паузы, если я хлопаю в ладоши, звук не воспроизводится после окончания паузы, что создает впечатление, что после заполнения буфера любой дополнительный звук теряется.

Но если я уменьшу CHUNK до небольшого числа, например 20, как только он приостановится на секунду, он выдаст ошибку

  File "C:\Anaconda3\lib\site-packages\pyaudio.py", line 608, in read
    return pa.read_stream(self._stream, num_frames, exception_on_overflow)
OSError: [Errno -9981] Input overflowed

Итак, если звук может быть потерян во время паузы из-за (я думаю) заполнения буфера без выдачи ошибки, почему возникает ошибка, когда я уменьшаю количество кадров в буфере?

Код:

import pyaudio
import time

# initialize stream parameters
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                frames_per_buffer=CHUNK)


x = 1
while True:
    data = stream.read(CHUNK)
    stream.write(data)

    x=x%100 + 1
    if x == 100:
        print(time.time())
        time.sleep(3)

РЕДАКТИРОВАТЬ. Я думаю, что исправил проблему, добавив этот аргумент в чтение:

data = stream.read(CHUNK, exception_on_overflow = False)

Однако мой вопрос остается в силе. Я не понимаю, почему ошибка возникает только при небольшом размере CHUNK, хотя кажется, что буфер заполняется в обоих случаях.


person pyjamas    schedule 13.02.2018    source источник
comment
Связано: stackoverflow.com/questions/10733903/pyaudio-input-overflowed - проверьте формат ввода (скорость и формат), и если это не так, код слишком медленный для обработки данных.   -  person Putnik    schedule 13.02.2021