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, который я использовал здесь.

Надеюсь это поможет.

Другие вопросы по тегам