PyAudio и препълване на буфера

Опитвам се да използвам 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()


person user1685095    schedule 04.06.2014    source източник


Отговори (1)


Вашият проблем звучи подобно на този, който имах при възпроизвеждане с помощта на блокиращия режим за pyaudio.

Моето възпроизвеждане също приключи преди продължителността на звука да е завършила. Подозирам, че доставях аудио по-бързо, отколкото pyaudio успя да го възпроизведе. Никога не успях да разреша проблема в режим на блокиране.

Начинът, по който реших проблема, беше да използвам обратно извикване, вместо да се опитвам да използвам режим на блокиране.

Пример за това как да направите това е Тук

person Jeremy Spykerman    schedule 26.11.2014