Soundtouch bpm iPhone
Я пытаюсь интегрировать механизм для расчета ВРМ песни в библиотеке iPod (также на iphone). Выполняя поиск в Интернете, я обнаружил, что наиболее используемые и надежные библиотеки для этой цели - это soundtouch. У кого-нибудь есть опыт работы с этой библиотекой? Можно ли в вычислительном отношении заставить его работать на оборудовании iPhone?
1 ответ
Недавно я успешно использовал код из класса BPMDetect библиотеки soundtouch. Первоначально скомпилировал его на C++, позже перевел код на C#, а в последнее время я использую код C++ в приложении для Android через JNI. Я не очень знаком с разработкой для iOS, но я почти уверен, что это возможно, что вы пытаетесь сделать.
Единственными файлами, которые вы должны использовать из исходного кода soundtouch, являются следующие:
Файлы C++
- BPMDetect.cpp
- FIFOSampleBuffer.cpp
- PeakFinder.cpp
Заголовочные файлы
- BPMDetect.h
- FIFOSampleBuffer.h
- FIFOSamplePipe.h
- PeakFinder.h
- soundtouch_config.h
- STTypes.h
По крайней мере, это единственные, которые мне пришлось использовать, чтобы заставить его работать.
Класс BPMDetect получает необработанные сэмплы с помощью метода inputSamples(), он способен вычислять значение bpm, даже если весь файл еще не загружен в его буфер. Я обнаружил, что эти промежуточные значения отличаются от тех, которые получены после загрузки всего файла, что является более точным, по моему опыту.
Надеюсь это поможет.
РЕДАКТИРОВАТЬ:
Это довольно сложный процесс, чтобы объяснить в комментарии, поэтому я собираюсь редактировать ответ.
Суть в том, что вам нужно ваше приложение для 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, который я использовал здесь.
Надеюсь это поможет.