Android самый быстрый способ декодировать данные MP3 в PCM
В моем приложении мне нужно декодировать mp3-файл в буфер PCM. это много данных, поэтому я уменьшаю частоту до 22050 Гц, когда читаю и декодирую.
на данный момент я использую javazoom jlayer decoder http://www.javazoom.net/javalayer/javalayer.html
он работает, но медленно, 30 секунд, чтобы декодировать 3-минутную песню в режиме запуска, стареет в режиме отладки. на моей машине с Windows, используя libmpg, я могу сделать это примерно за 1 секунду.
Есть ли способ, который кто-то знает наверняка, быстрее? я не хочу тратить время на реализацию другого метода, если он не значительно быстрее. Благодарю.
Кстати, в моем приложении мне нужно все это загрузить в буфер PCM в памяти, поэтому меня не интересуют вещи, которые просто воспроизводят mp3-файлы.
2 ответа
JLayer - это преобразование оригинального кода Fraunhoffer mp3 C. К сожалению, человек, который его преобразовал, разбросал по всему коду широкий диапазон ненужных буферных копий, потому что он, вероятно, не очень хорошо понимал, что происходит (не проблема, такие вещи случаются). Тем не менее, в результате получается очень медленный mp3-декодер. В конце концов мы начали удалять все ненужные буферные копии и добавили точный поиск в источник JLayer. Репозиторий и демонстрацию того, как его использовать, можно найти по адресу http://bpmdj.yellowcouch.org/credits.html, раздел JLayer1.0.1. Результат примерно в 2,5 раза быстрее оригинала.
Это момент, когда вы идете Native в Android!
-используйте NDK и найдите быструю библиотеку c / C++ (они примерно в 20 раз быстрее, чем jlayer, например, 9min sogn за 18 секунд)
Есть несколько библиотек, которые могут быть полезны:
www underbit.com/products/mad/
www oracle.com/technetwork/java/javase/download-137625.html (не уверен, что этот поддерживает MP3toPCM)
lame.sourceforge.net/about.php (у этого есть Android-проект с открытым исходным кодом на github, который, я надеюсь, будет очень полезен для вас! https://github.com/intervigilium/liblame)