ВНИМАНИЕ: OpenSL ES устарел . Разработчикам следует использовать библиотеку Oboe с открытым исходным кодом, доступную на GitHub . Гобой — это оболочка C++, предоставляющая API, очень похожий на AAudio . Гобой вызывает AAudio, когда AAudio доступен, и возвращается к OpenSL ES, если AAudio недоступен.
В этом разделе представлена информация, необходимая для начала использования API OpenSL ES.
Добавьте OpenSL ES в свое приложение
Вы можете вызвать OpenSL ES из кода C и C++. Чтобы добавить базовый набор функций OpenSL ES в ваше приложение, включите заголовочный файл OpenSLES.h
:
#include <SLES/OpenSLES.h>
Чтобы добавить расширения OpenSL ES Android , включите заголовочный файл OpenSLES_Android.h
:
#include <SLES/OpenSLES_Android.h>
При включении файла заголовка OpenSLES_Android.h
автоматически включаются следующие заголовки:
#include <SLES/OpenSLES_AndroidConfiguration.h> #include <SLES/OpenSLES_AndroidMetadata.h>
Примечание. Эти заголовки не являются обязательными, но показаны для помощи в изучении API.
Сборка и отладка
Вы можете включить OpenSL ES в свою сборку, указав его в файле Android.mk
, который служит одним из make-файлов системы сборки NDK. Добавьте следующую строку в Android.mk
:
LOCAL_LDLIBS += -lOpenSLES
Для надежной отладки мы рекомендуем вам изучить значение SLresult
, возвращаемое большинством API OpenSL ES. Для отладки можно использовать утверждения или более продвинутую логику обработки ошибок; ни один из них не предлагает существенных преимуществ при работе с OpenSL ES, хотя тот или иной вариант может оказаться более подходящим для данного варианта использования.
В наших примерах мы используем утверждения, поскольку они помогают отловить нереалистичные условия, указывающие на ошибку кодирования. Мы использовали явную обработку ошибок для других условий, которые с большей вероятностью могут возникнуть в рабочей среде.
Многие ошибки API приводят к появлению записи в журнале в дополнение к ненулевому коду результата. Такие записи журнала могут предоставить дополнительную информацию, которая особенно полезна для относительно сложных API, таких как Engine::CreateAudioPlayer
.
Вы можете просмотреть журнал либо из командной строки, либо из Android Studio. Чтобы просмотреть журнал из командной строки, введите следующее:
$ adb logcat
Чтобы просмотреть журнал Android Studio, выберите «Просмотр» > «Инструменты Windows» > Logcat . Дополнительные сведения см. в разделе Запись и просмотр журналов с помощью Logcat .
Пример кода
Мы рекомендуем использовать поддерживаемый и протестированный пример кода, который можно использовать в качестве модели для вашего собственного кода, который находится в папках audio-echo и own-audio репозитория android-ndk GitHub.
Внимание: Спецификация OpenSL ES 1.0.1 содержит примеры кода в приложениях (более подробную информацию см. в реестре Khronos OpenSL ES ). Однако в примерах в Приложении B: Пример кода и Приложении C: Пример кода варианта использования используются функции, которые не поддерживаются Android. Некоторые примеры также содержат опечатки или используют API, которые могут измениться. Действуйте с осторожностью, обращаясь к ним; хотя этот код может быть полезен для понимания полного стандарта OpenSL ES, его не следует использовать с Android как есть.
Аудиоконтент
Ниже приведены некоторые из множества способов упаковки аудиоконтента для вашего приложения:
- Ресурсы . Поместив аудиофайлы в папку
res/raw/
, к ним можно будет легко получить доступ с помощью связанных API-интерфейсов дляResources
. Однако прямого доступа к ресурсам нет, поэтому вам придется написать код на языке программирования Java, чтобы скопировать их перед использованием. - Активы : если поместить аудиофайлы в папку
assets/
, они будут напрямую доступны API-интерфейсам управления активами Android. Дополнительную информацию об этих API см. в файлах заголовковandroid/asset_manager.h
иandroid/asset_manager_jni.h
. Пример кода, расположенный в репозитории android-ndk GitHub, использует эти собственные API-интерфейсы менеджера активов в сочетании с локатором данных дескриптора файла Android. - Сеть : вы можете использовать локатор данных URI для воспроизведения аудиоконтента непосредственно из сети. Однако обязательно прочтите Безопасность и разрешения .
- Локальная файловая система : локатор данных URI поддерживает схему
file:
для локальных файлов при условии, что файлы доступны приложению. Обратите внимание, что система безопасности Android ограничивает доступ к файлам с помощью механизмов идентификатора пользователя и группы идентификатора Linux. - Записано : ваше приложение может записывать аудиоданные со входа микрофона, сохранять этот контент, а затем воспроизводить его позже. В примере кода этот метод используется для клипа воспроизведения .
- Скомпилировано и встроено в ссылку : вы можете связать свой аудиоконтент непосредственно с общей библиотекой, а затем воспроизвести его с помощью аудиоплеера с локатором данных очереди буфера. Это наиболее подходит для коротких клипов в формате PCM. В примере кода этот метод используется для клипов Hello и Android . Данные PCM были преобразованы в шестнадцатеричные строки с помощью инструмента
bin2c
(не прилагается). - Синтез в реальном времени . Ваше приложение может синтезировать данные PCM «на лету», а затем воспроизводить их с помощью аудиоплеера с локатором данных очереди буфера. Это относительно продвинутый метод, и детали синтеза звука выходят за рамки этой статьи.
Примечание. Поиск или создание полезного аудиоконтента для вашего приложения выходит за рамки этой статьи. Чтобы найти дополнительную информацию, вы можете использовать поисковые запросы в Интернете, такие как интерактивное аудио , игровое аудио , звуковой дизайн и аудиопрограммы .
Внимание: вы обязаны убедиться, что вам разрешено по закону воспроизводить или записывать контент. При записи контента могут возникнуть соображения конфиденциальности.
Примеры кода
Эти примеры приложений доступны на нашей странице GitHub:
- audio-echo создает двусторонний цикл ввода-вывода.
- Native-audio — простой аудиорекордер/плеер.
Реализация OpenSL ES в Android NDK отличается от эталонной спецификации OpenSL ES 1.0.1 во многих отношениях. Эти различия являются важной причиной того, что пример кода, скопированный непосредственно из эталонной спецификации OpenSL ES, может не работать в вашем приложении для Android.
Дополнительные сведения о различиях между эталонной спецификацией и реализацией Android см. в разделе OpenSL ES для Android .