Какой фреймворк я должен использовать для воспроизведения аудиофайлов (WAV, MP3, AIFF) в iOS с низкой задержкой?
iOS имеет различные звуковые платформы от верхнего уровня, который позволяет просто воспроизводить указанный файл, до нижнего уровня, который позволяет вам получать необработанные данные PCM и все, что между ними. Для нашего приложения нам просто нужно воспроизвести внешние файлы (WAV, AIFF, MP3), но мы должны сделать это в ответ на нажатие кнопки, и нам нужно, чтобы эта задержка была как можно меньше. (Это для очередей в живых постановках.)
Теперь AVAudioPlayer и другие приложения работают с простыми файловыми ресурсами (через их URL), но его задержка при фактическом запуске звука слишком велика. Если размер файла превышает пять минут, задержка запуска звука может превышать секунду, что делает его практически бесполезным для синхронизации живого выступления.
Теперь я знаю, что такие вещи, как openAL, могут быть использованы для воспроизведения с очень низкой задержкой, но тогда вы по уши в аудио буферах, аудиоисточниках, слушателях и т. Д.
Тем не менее, кто-нибудь знает какие-либо фреймворки, которые работают на более высоком уровне (например, играют 'MyBeddingTrack.mp3') с очень низкой задержкой? Предварительная буферизация в порядке. Просто курок должен быть быстрым.
Бонус, если мы можем сделать такие вещи, как установить начальную и конечную точки воспроизведения в файле, или изменить громкость или даже выполнить приглушение и т. Д.
7 ответов
Следующий вопрос SO содержит рабочий код, который воспроизводит файл с использованием Audio Units, в частности AudioFilePlayer. Хотя вопрос гласит, что он не работает, он работал из коробки для меня - только добавить AUGraphStart(_graph)
в конце.
Свойство ScheduledFilePrime в AudioFilePlayer указывает, сколько файлов нужно загрузить перед началом воспроизведения. Вы можете поиграть с этим.
Но, как отмечают другие, аудиоустройства имеют крутую кривую обучения.
Несмотря на то, что Audio Queue Framework относительно проста в использовании... он упаковывает много тяжелой работы DSP за кулисами (то есть, если вы поставляете его с VBR/ сжатым звуком... он автоматически конвертирует его в PCM перед воспроизведением на динамике... он также непрозрачно решает множество проблем с потоками для конечного пользователя).. что является хорошей новостью для тех, кто делает легкие приложения не в реальном времени.
Вы упомянули, что вам это нужно для постановки в очередь в прямом эфире. Я не уверен, означает ли это, что ваше приложение работает в режиме реального времени... потому что если оно есть..., то Audio Queue будет бороться за удовлетворение ваших потребностей. Хорошая статья об этом написана Россом Бенчиной. Дело в том, что вы не можете позволить сторонним фреймворкам или библиотекам делать что-либо, что может быть потенциально дорогостоящим за кулисами, такое как блокировка потоков, блокировка или удаление блокировок и т. Д. И т. Д., Это просто слишком дорого и рискованно для разработки аудио приложений реального времени.,
Вот тут-то и появляется фреймворк Audio Unit. Аудио-очереди на самом деле построены поверх фреймворка Audio Unit (он автоматизирует большую часть своей работы)... но Audio Units приближают вас к металлу настолько, насколько это возможно в iOS. Он настолько отзывчив, насколько вы хотите, и может легко сделать приложение в реальном времени. Аудиоустройство имеет огромную кривую обучения, хотя. Вокруг него есть некоторые обертки с открытым исходным кодом, которые упрощают его (см. Новокаин).
Если бы я был вами... я бы хотя бы пролистал Learning Core Audio... это книга для любого разработчика ядра и аудио iOS... он подробно рассказывает об аудио-очередях, аудиоустройствах и т. Д. И имеет отличные примеры кода..
Исходя из собственного опыта... Я работал над аудио-приложением в реальном времени, которое имело некоторые интенсивные требования к аудио... Я нашел платформу Audio Queue и подумал, что это слишком хорошо, чтобы быть правдой... Мое приложение работало, когда я его прототипировал с небольшими ограничениями... но он просто задохнулся от стресс-тестирования... именно тогда мне пришлось погрузиться глубоко в аудиоустройства и изменить архитектуру и т. д. и т. д. (это было не красиво). Мой совет: работайте с аудио-очередью, по крайней мере, как введение в Аудиоустройства.. придерживайтесь этого, если это соответствует вашим потребностям, но тогда не бойтесь использовать Аудиоустройства, если выясняется, что Аудио-очередь больше не отвечает требованиям вашего приложения,
Самая низкая задержка, которую вы можете получить, это с Audio Units, RemoteIO.
Блок удаленного ввода / вывода
Модуль удаленного ввода / вывода (подтип kAudioUnitSubType_RemoteIO) подключается к оборудованию устройства для ввода, вывода или одновременного ввода и вывода. Используйте его для одновременного ввода и вывода с воспроизведением, записью или с низкой задержкой, когда эхоподавление не требуется.
Взгляните на эти уроки:
http://atastypixel.com/blog/using-remoteio-audio-unit/
http://atastypixel.com/blog/playing-audio-in-time-using-remote-io/
Вам нужна система звукового каркаса системы. Звуковая система системы создана для таких вещей, как использование звуков интерфейса или быстрых, отзывчивых звуков. Посмотрите здесь.
AVAudioPlayer
имеет prepareToPlay
метод для предварительной загрузки его аудио буферов. Это может значительно ускорить время отклика.
Я бы использовал Audio Queue framework. https://developer.apple.com/library/mac/ipad/#documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/Introduction/Introduction.html
Я столкнулся с той же проблемой, что и вы, но через некоторое время я нашел отличную основу. В настоящее время я использую звуковую среду ObjectAL kstenerud. Он основан на OpenAL и хорошо документирован. Вы можете воспроизводить фоновую музыку и звуковые эффекты с несколькими слоями.
Вот проект на github https://github.com/kstenerud/ObjectAL-for-iPhone Вот сайт http://kstenerud.github.com/ObjectAL-for-iPhone/index.html