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

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

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

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

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

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


person Ridoy Farhad    schedule 12.02.2018    source источник
comment
Я думаю, что эта ссылка включает в себя каждый ответ, связанный с Audio_Processing, будь то предварительная обработка или постобработка: Android_Audio_Processing_Using_WebRTC. Вы также можете посетить эту ссылку: stackoverflow.com/a/58546599/10413749   -  person Muhammad Usman    schedule 07.04.2020


Ответы (1)


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

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

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

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

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

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

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

person alexm    schedule 15.02.2018
comment
Спасибо за отличную запись @alexm Если я хочу инвертировать звук, записанный микрофоном, как мне это сделать? Что еще более важно, что мне нужно сделать с буфером, чтобы добиться этого... Я предполагаю, что мне нужно изменить значения буфера в обратном вызове аудиоплеера. Я уже пробовал отрицать значения в буфере, однако это не сработало, звук просто воспроизводится так же, как если бы я не изменил значения. - person Ridoy Farhad; 15.02.2018