android — OpenSL es — управление очередью аудиобуфера

Я очень новичок в открытии. В настоящее время я экспериментирую с функциями записи и воспроизведения открытий для Android. Прямо сейчас у меня есть функция записи, которая хранит данные в очереди буфера. Затем я могу воспроизвести очередь буфера. Кто-нибудь сможет объяснить, как я могу правильно манипулировать данными в очереди буфера? поэтому воспроизведение звучит иначе, чем запись.

Моя текущая конфигурация:

sampleFormat.pcmFormat_ = static_cast<uint16_t>(engine.bitsPerSample_);
//the buffer
uint8_t *buf_;

Есть ли какой-либо тип преобразования или декодирования мне нужно сделать с данными в буфере, прежде чем манипулировать им?

Я был бы очень признателен за помощь.

1

Решение

У вас широкий вопрос, и я могу рассказать вам, как вы должны его использовать и как вы можете манипулировать аудиоданными, полученными при записи.

1) После того, как вы правильно настроили свой движок OpenSL_ES, рекордер и проигрыватель (много примеров), вы дали OpenSL_ES буфер для чтения данных pcm с микрофона, а также буфер для чтения данных, которые вы хотели бы предоставить для приемника Воспроизведение, а также 2 функции обратного вызова, которые будут вызываться после завершения, после завершения процесса чтения данных (через некоторое время в соответствии с вашими настройками, такими как частота дискретизации, размер буфера и т. д.), вызывается обратный вызов записи из потока созданный OpenSL_ES, который в зависимости от устройства и конфигурации может быть высокоприоритетным потоком, обычно называемым ускоренным режимом (поэтому вы работаете не с вашим потоком в обратном вызове, а с потоком OpenSL_ES и должны быть осторожны, чтобы не выполнять там операции блокировки) , Теперь, если вы хотите воспроизвести аудио как можно быстрее, обработайте ваш аудиосигнал изнутри обратного вызова, если время отклика не слишком важно для вас, вы можете использовать обратный вызов в качестве сигнала для вашего потока, чтобы начать чтение аудио процесса Данные в буфере, как вы хотите. В обоих случаях для воспроизведения аудио необходимо поставить в очередь данные (обработанные или необработанные) для процесса воспроизведения (воспроизведение также вызывает обратный вызов проигрывателя по окончании).

2) Теперь, если вы хотите обработать звук, вам нужно применить фильтры, есть много видов фильтров аудиосигналов, которые можно применять, вы должны искать динамические фильтры в случае воспроизведения в реальном времени. (некоторые фильтры требуют много данных для начала обработки и могут работать плохо в режиме реального времени, некоторые другие оптимизированы для использования небольших порций данных и динамической адаптации вывода). Таким образом, вам нужно будет создать цепочку фильтров в определенном порядке, чтобы получить то, что вы хотите. Аудио мир огромен, вам нужно много читать, чтобы начать понимать обработку звука. Производительность звука — другая вещь, и она напрямую зависит от вашего устройства (жесткого, мягкого).

3) Обработка данных в буфере, который вы получаете, зависит от вашего процессора. Например, endianess, некоторые процессоры могут работать с прямым или младшим порядковым номером, и вы получите данные в формате с прямым порядком байтов. Сжатия нет, поэтому данные pcm готовы к обработке. (если вы хотите создать из него wav-файл, вам нужно всего лишь добавить волновой заголовок и добавить данные pcm в блок данных заголовка, если вам нужен другой формат, например mp3, вам также необходимо обработать данные с помощью алгоритма сжатия в соответствии с в нужный формат и добавьте эти данные в соответствующий заголовок)

Также для воспроизведения данных через OpenSL_ES вам нужны несжатые аудиоданные, поэтому вы не можете воспроизводить mp3 напрямую, вам нужно сначала распаковать его в данные pcm.

Это основное функционирование OpenSL_ES, надеюсь, оно ответит на ваш вопрос. Если что-то неясно, дайте мне знать.

PS: Android заявляет, что теперь с новой библиотекой AAudio проще управлять аудио, что обещает выполнить те же задачи, что и OpenSL_ES, с одной третью его сложности (могут быть некоторые проблемы с задержкой, некоторые люди сталкивались, но я уверен, что они исправляются, как вы читать)

0

Другие решения

Других решений пока нет …