2013-12-10 3 views
0

При использовании pygame воспроизведения звука, я замечаю высокую латентность (> 100 мс):аудио с низкой задержкой с Python

import pygame 

pygame.init() 
pygame.mixer.init() 
sounda = pygame.mixer.Sound("test.wav") 

def callback() 
    sounda.play() 

# callback is called by another function, but I could measure a high latency (> 100ms) 

Является pygame причиной задержки? В более общем плане, есть воспроизведение с низкой задержкой воспроизведения возможно с Python?

Пример приложения: воспроизведение некоторых WAV-файлов при поступлении MIDI-сообщений с MIDI-клавиатуры. (Я хочу кодировать очень простой базовый музыкальный сэмплер). Конечно, латентность будет сильно зависеть от аудиоинтерфейса (ASIO или не ASIO и т. Д.), Но теперь я хочу проанализировать, возможно ли с помощью Python возможность дополнительной дополнительной латентности, и если да, то какие модули являются предпочтительными для этой цели.

+1

Да, это возможно. Но StackOverflow не является хорошим ресурсом для запроса рекомендаций для инструментов и библиотек. Подробнее см. В справке/faq. – abarnert

+1

Между тем на странице Python есть страница на [PythonInMusic] (https://wiki.python.org/moin/PythonInMusic). Не знаю, насколько это актуально или полно, но есть определенные ссылки на живые проекты, которые по-разному связывают различные библиотеки родного звука, и вы должны начать с вас и показать, что можно сделать. – abarnert

+0

Да @abarnert, я полностью изменил свой вопрос, чтобы задать точный вопрос (с воспроизводимым примером) по конкретной проблеме, связанной с некоторой реализацией. Я надеюсь, что «закрыть» можно будет избежать, особенно когда я вижу похожие темы здесь: http://stackoverflow.com/questions/1448630/low-latency-audio-api-for-android?rq=1 – Basj

ответ

5

Является ли pygame причиной задержки?

Наверное, нет.

Pygame - это всего лишь обертка вокруг SDL. В некоторых областях - как этот - это очень тонкая обертка.

Но SDL-или, скорее, SDL_mixer -может легко быть проблемой.

Итак, вам, вероятно, нужно немного узнать о SDL, чтобы использовать pygame для звука, выходящего за рамки обычных требований к игровому стилю. Audio with SDL - хороший обзор, хотя кажется немного устаревшим.


Первое, что нужно учитывать, это то, что вы используете. Например, во многих системах Linux ALSA не может делать звук с низкой задержкой, что означает, что все, что вы пишете, что в конечном итоге ведет переговоры с ALSA, тоже не может этого сделать. И если ваша система настроена на использование esd или какого-то другого звукового демона, если это возможно, и при необходимости отпасть, вы, очевидно, этого не хотите. Итак, если что-то вроде этого - ваша проблема, вам нужно будет настроить SDL_mixer для использования другого драйвера.


Предполагая, что водитель может справиться с этим, это, безусловно, можно сделать с низкой задержкой звук с pygame.mixer/SDL_mixer. Но это может не сработать.

Первое, что вам нужно сделать, это выбрать размер меньшего буфера, чем значение по умолчанию.

Также обратите внимание, что SDL_mixer автоматически перекодирует ваши звуки за спину, если они не совпадают с частотой дискретизации/etc. в качестве цели, которая не только добавляет немного латентности для работы ЦП, но и означает, что размер буфера не имеет ничего общего с тем, который, по вашему мнению, вы используете ...

Альтернативой этому является пройдите pygame.mixer/SDL_mixer, сделайте смешение самостоятельно, и перейдите к pygame.sound/SDL_sound. Это все равно будет иметь одинаковые проблемы с драйверами, но все, что вызвано SDL_mixer (например, перекодировка), уходит.

Если вы не можете получить pygame/SDL, чтобы делать то, что хотите (например, потому что единственные драйверы, которые он поддерживает в вашей системе, все сосут), вам придется использовать другую библиотеку. PythonInMusic На вики есть сотни ссылок, и вы также можете искать PyPI.Однако вы можете начать с другой стороны - найти библиотеку аудио C, которую вы хотите использовать, а затем искать для нее привязки Python. Например, pyAudio - относительно тонкая оболочка вокруг PortAudio, поэтому она сказывается, если переносимость, конфигурируемость и производительность PortAudio соответствуют вашим потребностям, а его API подходит для вашего дизайна, но это отстой.


Другое место может пойти не так, как в вашем коде.

Это, очевидно, не проблема в вашем случае, потому что все, что вы делаете, дает pygame.mixer предварительно сделанный звук. Но если вы решите, что вам нужно, скажем, предварительно преобразовать звуки и буферы подачи в pygame.sound, вы можете столкнуться с проблемой, что Python работает медленно и медленно работает при арифметике.

«slow» Я имею в виду порядка микросекунд. Цикл один раз на 20 мс буфер не является проблемой. Возможно, что однократное замерзание будет повторяться. Если вы делаете какую-либо обработку, вам следует использовать NumPy или выделенную аудио-библиотеку для выполнения работы grunt, а не для чистого Python.

Смежные вопросы