Запись звука с помощью Android NDK - PullRequest
2 голосов
/ 21 июля 2010

Я пытаюсь записать звук с помощью Android ndk. люди говорят, что я могу использовать "frameworks / base / media / libmedia / AudioRecord.cpp". но это в ядре. как я могу получить к нему доступ и использовать его?

Ответы [ 3 ]

8 голосов
/ 21 июля 2010

Библиотека C ++ libmedia не является частью общедоступного API.Некоторые люди используют его, но это крайне нежелательно, потому что он может сломаться на некоторых устройствах и / или в будущем выпуске Android.

Я разработал приложение для записи звука, и, поверьте мне, поддержка аудио очень противоречива для всех устройств, очень сложно , поэтому IMO с использованием libmedia напрямую - плохая идея.* Единственный способ захвата необработанного звука с помощью открытого API - это использование класса Java AudioRecord .Он предоставит вам данные PCM, которые вы затем сможете передать в оптимизированные для C. подпрограммы.

В качестве альтернативы, хотя это немного сложнее, вы можете написать оболочку C / C ++ вокруг класса Java AudioRecord, такможно создавать экземпляры Java-объектов и вызывать методы через JNI.

4 голосов
/ 12 января 2012

Может быть немного устаревшим, но:

  1. самый безопасный способ воспроизведения / записи звука в собственном коде - использование интерфейсов OpenSL ES. Тем не менее, он доступен только на Android 2.3+ и на данный момент работает через универсальный AudioFlinger API.

  2. более надежный и простой способ - использовать исходные коды платформы для получения заголовков AudioFlinger и некоторый универсальный libmedia.so, используемый для компоновки на этапе сборки. Зависящий от устройства libmedia.so должен быть предварительно загружен на этапе инициализации приложения, чтобы AudioFlinger работал нормально (обычно это делается автоматически). Обратите внимание, что некоторые поставщики пытаются изменить внутренние компоненты AudioFlinger (по неоднозначным причинам), поэтому вы можете столкнуться с некоторыми проблемами с памятью или поведением.

По моему опыту, AudioFlinger работал на всех (2.0+) устройствах, но иногда требовалось выделить больше памяти для объекта, чем предполагалось реализацией по умолчанию.

Наконец, OpenSL ES - это оболочка с динамически загружаемым C-интерфейсом, которая позволяет использовать его с любой конкретной реализацией AudioFlinger. Это довольно сложно для простого использования, и может иметь даже больше накладных расходов, чем использование Java AudioTrack / AudioRecord из-за внутренних потоков, буферизации и т. Д. Поэтому рассмотрите возможность использования Java или не очень безопасного нативного AudioFlinger, пока Google не реализует какой-либо высокопроизводительный аудиоинтерфейс (что пока сомнительно).

2 голосов
/ 28 февраля 2012

API OpenSL Es доступен из Android 2.3 на (API-уровень 9)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...