Является ли 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.
Да, это возможно. Но StackOverflow не является хорошим ресурсом для запроса рекомендаций для инструментов и библиотек. Подробнее см. В справке/faq. – abarnert
Между тем на странице Python есть страница на [PythonInMusic] (https://wiki.python.org/moin/PythonInMusic). Не знаю, насколько это актуально или полно, но есть определенные ссылки на живые проекты, которые по-разному связывают различные библиотеки родного звука, и вы должны начать с вас и показать, что можно сделать. – abarnert
Да @abarnert, я полностью изменил свой вопрос, чтобы задать точный вопрос (с воспроизводимым примером) по конкретной проблеме, связанной с некоторой реализацией. Я надеюсь, что «закрыть» можно будет избежать, особенно когда я вижу похожие темы здесь: http://stackoverflow.com/questions/1448630/low-latency-audio-api-for-android?rq=1 – Basj