opensl audio output что это
Android NDK: работа с OpenSL ES
День добрый, Хабражители.
Я ранее писал про OpenAL. Позже товарищ zagayevskiy написал хорошую статью по OpenSL ES. В одной из наших игр, дабы не переписывать весь код по работе со звуком, мы не стали переписывать всё на OpenSL ES (при порте на Android). В игре использовалось не так много звуков, поэтому проблем с OpenAL не было. А вот в последней игре у нас использовалось много звуков (специфика игры обязывает), вот тут-то мы и столкнулись с большой проблемой (задержки при воспроизведении — меньшая из них). Было решено переписать всё на OpenSL ES. Для этого я написал парочку враперов, про которые уже рассказывал. Решил поделиться этим и на хабре, может кому-то пригодится.
Краткое описание OpenSL ES
Примечание: хотя оно и основано на OpenSL ES, это API не является полной реализацией любого профиля из OpenSL ES 1.0.1.
Либа, как вы могли догадаться, написана на чистом C. По-сему полноценного ООП там нет. Используются специальные структуры (назовём их псевдообъектно-ориентированными структуры (: ), которые представляют собой обычные структуры языка C, содержащие указатели на функции, получающие первым аргументом указатели на саму структуру. Что-то вроде this в С++, но явно. В OpenSL ES два вида таких структур:
Аудио контент
Немного про мои обёртки
Я вообще поклонник ООП, поэтому стараюсь как-то сгруппировать определённый функционал Си-методов и обернуть своими классами, чтобы в дальнейшем было удобно работать. По аналогии с тем, как я это делал для OpenAL, появились классы:
Принцип работы с объектами
Инициализация библиотеки (контекста)
Остаётся получить и инициализировать объект OutputMix для работы с динамиками с помощью метода CreateOutputMix :
Помимо инициализации основных объектов в конструкторе моего врапера OSLContext происходит инициализация всех необходимых плееров. Максимально возможно число плееров ограничено. Рекомендую создавать не более 20.
Работа со звуками
По сути, можно разделить на две категории типы звуков: чистые (не сжатые данные) PCM, которые содержатся в WAV и сжатые форматы (mp3, ogg и т.п.). Mp3 и ogg можно декодировать и получить всё те же несжатые звуковые данные PCM. Для работы с PCM используем BufferPlayer. Для сжатых форматов AssetPlayer, так как декодирование файлов будет довольно затратно. Если взять mp3, то аппаратно его декодировать на старых телефонах не получится, а с помощью сторонних софтверных решений декодирование займёт не один десяток секунд, что, согласитесь, не приемлемо. К тому же, слишком много весить будут такие PCM данные.
Проигрывание PCM
Про чтение самого WAV писать снова не буду, можно посмотреть про это в статье про OpenAL. В этой же статье расскажу как с помощью полученных PCM данных создать BufferPlayer.
Помимо интерфейса для громкости есть ещё два других интерфейса:
Добавление звука в очередь при выборе плеера и установки звука на него:
Проигрывание сжатых форматов
В WAV все звуки хранить не вариант. И не потому что что сами файлы много места занимают (хотя и это тоже), просто когда вы их в память загрузите, то просто не хватит оперативки для этого (:
Приведу полностью метод по инициализации, пояснения в комментариях.
Заключение
OpenSL ES достаточно прост в изучении. Да и возможностей у него не мало (к примеру можно записывать аудио). Жаль только, что с кроссплатформенностью проблемы. OpenAL кроссплатформенный, но на Android ведёт себя не очень. Есть у OpenSL пара минусов, странное поведение callback’ов, не все возможности спецификации поддерживаются и т.д. Но в целом, простота реализации и стабильная работы покрывают эти минусы.
Русские Блоги
Эта статья в основном знакомит с простым использованием двух компонентов, которые могут воспроизводить аудио (PCM) на Android-AudioTrack / OpenSL ES.
Для аудиофайла (например, файла MP3), как использовать FFmpeg для декодирования для получения PCM, в предыдущей статье есть соответствующие инструкции:
https://blog.csdn.net/myvest/article/details/89254452。
Тогда как воспроизвести данные PCM, собранные микрофоном или после декодирования? Сначала данные PCM обычно повторно дискретизируются, то есть преобразуются в указанный формат. Для повторной выборки обратитесь к: https://blog.csdn.net/myvest/article/details/89442000
Наконец, войдите в тему этой статьи и расскажите о простом использовании AudioTrack / OpenSL ES.
1 Введение в AudioTrack
1.1 Введение в использование и API
В качестве примера возьмем api на стороне java (собственный уровень в основном такой же), метод использования аудиодорожки следующий:
1. Создайте:
AudioTrack имеет два режима загрузки данных (MODE_STREAM и MODE_STATIC), соответствующие режиму загрузки данных и типу аудиопотока, соответствующие двум совершенно различным сценариям использования.
2) int sampleRateInHz: частота дискретизации
3) int channelConfig: макет, соответствующий аудиоканалу, например AudioFormat.CHANNEL_OUT_STEREO для стерео.
4) int audioFormat: аудиоформат
5) int bufferSizeInBytes: размер буфера
Размер буфера можно получить с помощью функции getMinBufferSize, передав частоту дискретизации, компоновку канала и аудиоформат следующим образом:
6) int mode: режим загрузки данных (MODE_STREAM и MODE_STATIC), два режима соответствуют двум различным сценариям использования
3. Внедрение данных:
Параметры относительно простые, данные, смещение, размер
1.2 Пример использования AudioTrack
пример стороны Java
2 Введение в OpenSL ES
Хотя это голос C, в нем используется объектно-ориентированный подход. При разработке мы используем объекты и интерфейсы для разработки.
2.1 Объект и интерфейс
То есть каждый объект предоставляет некоторые из самых основных операций: Realize, Resume, GetState, Destroy и т. Д., Но объект нельзя использовать напрямую, и указанный интерфейс (например, интерфейс воспроизведения проигрывателя) должен быть получен через его функцию GetInterface с идентификационным номером. ), а затем получить доступ к функции функции через интерфейс.
Все объекты должны быть инициализированы вызовом Realize после создания, а Destroy должен быть вызван для уничтожения при освобождении.
2.2 Метод воспроизведения звука OpenSL ES
Ниже подробно объясняется каждая часть
2.2.1 Engine
Основной объект OpenSL ES, в основном, обеспечивает следующие две функции:
(1) Управляйте жизненным циклом Audio Engine.
(2) Предоставьте интерфейс управления: SLEngineItf, который можно использовать для создания всех других объектов.
Шаги по использованию:
1. Создайте движок
2. После создания движка его можно проходить SL_IID_ENGINE Получите интерфейс управления:
3. Затем через интерфейс управления iengine вы можете продолжить создание других необходимых объектов.
2.2.2 AudioPlayer
Объект воспроизведения аудио, в нем необходимо указать вход (DataSource) и выход (DataSink)
Datasource представляет информацию об источнике ввода, то есть о том, откуда берутся данные и каковы параметры входных данных;
DataSink представляет выходную информацию, то есть, где данные выводятся и какие параметры выводятся.
Среди них pLocator в основном имеет следующие типы:
Другими словами, источник ввода / вывода может быть либо URL-адресом, либо устройством, либо буферной очередью и т. Д.
Затем нам нужно создать ввод и вывод перед созданием объекта AudioPlayer.Мы используем буферную очередь для ввода и используем outputMix для вывода на звуковое устройство по умолчанию для вывода.
Шаги по использованию:
1. Источник ввода
2. Источник вывода
объект outputMix должен передать CreateOutputMix Интерфейс создан и называется Realize инициализация
3. Создайте AudioPlayer и инициализируйте
Объект AudioPlayer должен передать CreateAudioPlayer Интерфейс создан и называется Realize инициализация
4. Установите функцию обратного вызова входной очереди.Функция обратного вызова будет вызываться изнутри, когда данных недостаточно. Тогда начни играть.
необходимо пройти SL_IID_ANDROIDSIMPLEBUFFERQUEUE Получите интерфейс очереди и RegisterCallback Установите функцию обратного вызова.
необходимо пройти SL_IID_PLAY Получите интерфейс воспроизведения, установите его в состояние воспроизведения и вызовите Enqueue Поместите в очередь фрейм с пустыми данными.
Следует отметить, что данные в очереди не воспроизводятся немедленно, поэтому эти данные не могут быть немедленно освобождены, иначе это приведет к потере кадров.
5. После игры нужно позвонить Destroy Отпустите каждый объект.
Android NDK: OpenSL ES
Здравствуйте, уважемые хабражители!
Недавно, читая хабр, я увидел статью об Android NDK и OpenAL. А в комментариях был задан вопрос о OpenSL ES. Тогда у меня и родилась мысль написать статью об этой библиотеке. Я занимался этой темой, когда мне понадобилось добавить звуки и музыку в игру под Android, написанную на C++, под NDK. Статья не претендует на полноту, здесь будут лишь основы.
1. Краткое описание структур
Проще говоря, объекты нужны для выделения ресурсов и получения интерфейсов, а интерфейсы обеспечивают доступ к возможностям объектов. Один объект может иметь несколько интерфейсов. В зависимости от устройства, некоторые интерфейсы могут быть недоступны. Однако, я с этим не сталкивался.
2. Инициализация механизма библиотеки и создание объекта для работы с динамиками
Чтобы подключить OpenSL ES в Android NDK, достаточно добавить в секцию LOCAL_LDLIBS файла Android.mk флаг lOpenSLES:
Используемые заголовочные файлы:
Для начала работы с OpenSL ES необходимо инициализировать объект механизма OpenSL ES(SLObjectItf) с помощью вызова slCreateEngine, указав, что для работы с ним будет использоваться интерфейс SL_IID_ENGINE. Это нужно для того, чтобы иметь возможность создавать другие объекты. Объект, полученный с помощью такого вызова, становится центральным объектом для доступа к OpenSL ES API. Далее объект необходимо реализовать, используя псевдометод Realize, который является аналогом конструктора в С++. Первым параметром Realize указывается сам реализуемый объект(аналог this), а вторым — флаг async, указывающий будет ли объект асинхронным.
Текущая реализация Android NDK дает возможность создать только один механизм библиотеки и до 32 объектов вообще. Тем не менее, любая операция создания объекта может закончиться неудачей (например, из-за недостатка системных ресурсов).
SLOutputMixItf – это объект, представляющий устройство вывода звука(динамик, наушники). Спецификация OpenSL ES предусматривает возможность получения списка доступных устройств ввода/вывода, но реализация Android NDK недостаточно полна и не поддерживает ни получение перечня устройств, ни выбор желаемого (официально для этого предназначен интерфейс SLAudioIODeviceCapabilitiesItf).
3. Проигрывание PCM(wav)
Вот и все, простейший проигрыватель wav готов.
Следует обратить внимание, что в пику спецификации, Android NDK не поддерживает буферизованный вывод музыки в отличных от PCM форматах.
4. Проигрывание MP3, OGG
Далее вновь заполняем SLDataSource и SLDataSink. И создаем аудиоплеер.
В теории, механизм зацикливания должен быть удобен для установки фоновой музыки в игре. На практике между концом композиции и ее началом проходит 0.5-1.0 секунд (время на слух, на разных девайсах плавает). Я поборол это, сделав в фоновой музыке несколько плавных затуханий в середине и конце. Т.о. разрыв незаметен.
По спецификации, на интерфейс SLPlayItf можно навесить различные callback’и. В Android NDK фича не поддерживается (метод возвращает SL_RESULT_SUCCESS, но callback’и не отрабатывают).
Для остановки или паузы плеера можно воспользоваться методом SetPlayState интерфейса SLPlayItf со значениями SL_PLAYSTATE_STOPPED или SL_PLAYSTATE_PAUSED соответственно. Узнать состояние плеера позволяет метод GetPlayState, возвращающий те же значения.
5. Заключение
OpenSL ES API достаточно богато, и кроме воспроизведения звука, позволяет записывать его. Здесь я не буду касаться записи звука, скажу лишь, что она есть и работает достаточно хорошо. Для получения данных используется очередь буферов. Данные приходят в формате PCM.
Библиотеку сложно использовать в кроссплатформенной разработке, т.к. многие фичи реализованы специализированными для Android методами. Тем не менее, она показалась мне достаточно удобной.
В минусах видится вольная реализация, не поддерживаются многие вещи из спецификации. Кроме того, это API не быстрее, чем API, доступные в Android SDK.
OpenSL ES
Opens SL ES, Open Sound Library for Embedded Systems (открытая звуковая библиотека для встраиваемых систем) — бесплатный кроссплатформенный интерфейс программирования приложений (API) с поддержкой аппаратного ускорения, работающий с языком программирования C и рассчитанный на 2D/3D звук. Предоставляет доступ к таким возможностям, как 3D-позиционирование, воспроизведение MIDI. Интерфейс ориентирован на разработчиков мобильной и игровой индустрии, позволяя легко портировать приложения на различные платформы.
Обзор
OpenSL ES включает пять основных возможностей:
Возможности воспроизведения и записи, а также базовые функции MIDI предоставляются совместно с OpenMAX AL.
Устройство
OpenSL ES использует объектно-ориентированное программирование для предоставления разработчикам доступа к функционалу аудио. Объектная модель является общей с OpenMAX AL, разработчик устройства может принимать решение о реализации одного или обоих интерфейсов. Совместно два API предоставляют доступ к большому набору функций мультимедийного движка устройства.
Задачей создания OpenSL ES было предоставление разработчику приложения доступа к продвинутым возможностям работы со звука, таким как 3D-позиционирование, воспроизведение MIDI при сохранении простоты портирования приложения на другие платформы. Инетрфейс разработан главным образом для мобильной и игровой индустрии.
Профили
Во избежание фрагментации OpenSL ES имеет три профиля:
Каждый профиль создан для соответствующих нужд, с определенным набором функционала. Поставщик моет выбирать совместимость только с одним или с любой комбинацией профилей.
Приложение может отправить интерфейсу запрос, чтобы определить, какая именно профили поддерживаются в данной конкретной реализации. Разработчики приложений впоследствии могут проектировать свои программы либо для работы только с общими элементами профилей, либо адаптировать их под доступную функциональность конечного устройства и его внутренних профилей. Разработчики также могут указывать как минимальные, так и оптимальные требования профилей.
Разработка
Владельцем OpenSL ES является некоммерческий технологический консорциум Khronos Group. Нынешним председателем группы разработки OpenSL ES является Эрик Нореке.
Версии спецификации
Реализации
Информация от спонсора
Азбука полимеров: полимерное сырье для легкой и тяжелой промышленности. Здесь вы можете недорого заказать сырье полипропилен бален, являющееся экологически чистым, допускаемое к контакту с пищевыми продуктами.
Кейс дилетанта
Обзоры смартфонов, прошивок, гаджетов. Просто, понятно и объективно.
Ярлыки
воскресенье, 15 мая 2016 г.
PowerAmp v3 alpha-703 Настраиваем на качественный звук
Недавно вышла обновленная версия Poweramp v.3 build 803/805, новую версию этой статьи можно прочесть перейдя по ссылке:
https://casediletanta.blogspot.com/2018/10/poweramp-v3-803.html
До проведения настроек, подключаем наушники и устанавливаем громкость на минимум. Аналогично с отключенными наушниками. Осторожность не помешает.
Я продемонстрирую настройки оптимальные для смартфонов Sony Xperia Z2/Z3/Z3 Compact и аналогичных им. Я даю пояснения почему выбираются те или иные настройки, поэтому если у Вас другой смартфон, вы сможете принять решение какие настройки нужно сделать в вашем случае.
Делаем свайп от левого края дисплея и нажимаем Settings (настройки/параметры).
С помощью шестеренки можно убрать ненужные вам пункты бокового меню.
Почему именно SoX? Опять-таки ресэмплер хорошо знаком по Foobar2000 для ПК, проверенный временем, обладает высоким качеством. Мы настраиваем плеер на максимальное качество звука, поэтому в данном случае предполагается, что вы готовы пожертвовать энергопотреблением ради качества. Ну а «медленность» ресэмплера не играет роли при условии, что у Вас современный смартфон не старше 3 лет.
Мы установим значение None (Нет, без дизеринга), поскольку чипсет Z2 умеет играть музыку в формате 24bit 96kHz и PowerAmp поддерживает эту функцию.
Разберем выводы звука по пунктам:
Почему же в случае с Z2 плеер выставил частоту дискретизации 48kHz, хотя параметры стандартного компакт-диска 16 bit 44.1 kHz? Да потому, что Android подбирает ту частоту, которая кратна базовой (т.е. родной) для железа и соответственно, для аудио-драйверов.
Поэтому, косвенно мы понимаем, что Z2 будет лучше всего играть музыку с частотой дискретизации 48kHz и кратной ей. Какой? Умножим х2, получаем. правильно! максимальные для железа смартфона 96kHz.
Сразу включаем No Equ/Tone если не используем эквалайзер.
Sample Rate (частота дискретизации).
В случае с распространенными файлами высокого разрешения получаем преобразования:
48-44,1 либо 96-44,1 либо 192-44,1. И после этого на стороне аудиодрайвера обратно до 48 или 96kHz.
Как настроить плеер если базовая частота кратная 44.1? (Не относится к Xperia Z2 и Z3.)
Тогда если поддерживается Hi-Res Output выставляем там 44,1. OpenSL ES Output должен автоматически настроиться на вывод 16bit/44.1 kHz.
Посмотреть какие преобразования происходят со звуком в плеере можно на экране воспроизведения музыки сделав свайп справа и нажав на значок с буквой i в кружке.