Альтернатива OpenSL ES на Android

Я создаю приложение для Android, где необходимо воспроизводить данные PCM в проигрывателе очереди как float. Насколько я вижу, это невозможно. В описании говорится:

SL_DATAFORMAT_PCM не позволяет приложению указывать представление данных в виде целого числа со знаком, целого числа без знака или числа с плавающей запятой. Реализация Android предполагает, что 8-битные данные представляют собой целое число без знака, а 16-битное — целое число со знаком. Кроме того, название поля samplePerSec является неправильным, так как фактическими единицами измерения являются миллигерцы. Ожидается, что эти проблемы будут решены в следующей версии OpenSL ES, в которой будет представлен новый расширенный формат данных PCM, который позволяет приложению явно указывать представление и исправляет имя поля. Поскольку это будет новый формат данных, а текущий формат данных PCM по-прежнему будет доступен (хотя он и устарел), он не должен требовать каких-либо немедленных изменений в вашем коде.

Есть ли шанс получить эту работу через openssl es (1.0.1) ИЛИ есть ли альтернатива openssl es для android ndk?


person andre    schedule 26.10.2012    source источник


Ответы (3)


Вы можете преобразовать форму волны с плавающей запятой в 16-битную со знаком и передать ее в OpenSL.

Так как вам нужен доступ к волновым данным, чтобы передать их в OpenSL, должно быть просто выполнить преобразование во время выполнения — без особых накладных расходов.

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

Вот как я это сделал. На самом деле я использую только один поток и микширую весь исходный код в программе.

person Pierre    schedule 20.02.2013
comment
Да, это то, что я сделал тогда. Но я подумал, что в opensl может быть вариант, который делает это для меня. - person andre; 20.02.2013

Вы можете использовать ffmpeg для выполнения такого преобразования. У него есть специальная библиотека вместе с набором API для этой цели, все они определены в libresample/avresample.h. Я не смог найти много информации или какого-либо руководства о том, как это сделать, но просмотра самого файла заголовка должно быть достаточно. Это довольно просто:

http://ffmpeg.org/doxygen/trunk/avresample_8h.html

Надеюсь, это поможет вам!

person Alexandre Bodi    schedule 07.04.2013

SND_PCM_FLOAT поддерживается в Android L и выше.

Тем не менее, все же может иметь смысл сделать преобразование самостоятельно. В настоящее время нет гарантии, что какое-либо конкретное устройство будет изначально поддерживать вывод с плавающей запятой. Даже на устройствах, чье аппаратное обеспечение поддерживает float, ядро ​​или Android HAL могут быть не настроены для использования этого преимущества. Так что в какой-то момент будет преобразование программного обеспечения. И если вы платите за преобразование в программном обеспечении, вы можете сделать это самостоятельно, чтобы выбрать свой собственный алгоритм коррекции диапазона и дизеринга.

person Ian Ni-Lewis    schedule 14.06.2016