Недавно я успешно использовал код из класса BPMDetect библиотеки soundtouch . Сначала скомпилировал его на C ++ , позже перевел код на C # , а в последнее время я использую код C ++ на Android приложение через JNI. Я не очень знаком с разработкой в iOS , но я почти уверен, что это возможно, что вы пытаетесь сделать.
Из исходного кода soundtouch следует использовать только следующие файлы:
C ++ файлы
- BPMDetect.cpp
- FIFOSampleBuffer.cpp
- PeakFinder.cpp
Заголовочные файлы
- BPMDetect.h
- FIFOSampleBuffer.h
- FIFOSamplePipe.h
- PeakFinder.h
- STTypes.h
По крайней мере, это единственные, которые мне пришлось использовать, чтобы заставить его работать.
Класс BPMDetect получает необработанные сэмплы с помощью метода inputSamples () , он способен вычислять значение bpm, даже если весь файл еще не загружен в его буфер. Я обнаружил, что эти промежуточные значения отличаются от тех, которые получены после загрузки всего файла, что является более точным, по моему опыту.
Надеюсь, это поможет.
EDIT:
Это довольно сложный процесс для объяснения в комментарии, поэтому я собираюсь отредактировать ответ.
Суть в том, что вам нужно ваше приложение для Android, чтобы использовать нативный код. Для этого вам нужно скомпилировать перечисленные выше файлы из библиотеки soundtouch с помощью набора инструментов Android NDK .
Это оставит вас с собственным кодом, который сможет обрабатывать необработанные звуковые данные, но вам все равно нужно получать данные из звукового файла, что, я думаю, можно сделать несколькими способами. Для этого я использовал библиотеку FMOD для Android , вот хороший пример для этого: FMOD для Android .
Предположим, вы объявили такой метод в своем коде C:
void Java_your_package_YourClassName_cPlay(JNIEnv *env, jobject thiz)
{
sound->play();
}
В приложении Android вы используете свои собственные методы следующим образом:
public class Sound {
// Native method declaration
private native void cPlay();
public void play()
{
cPlay();
}
}
Чтобы иметь более дружественный API для работы, вы можете создать обертки вокруг этих вызовов функций.
Я поместил нативный код C, который я использовал, в суть здесь .
Надеюсь, это поможет.