Soundtouch bpm iPhone - PullRequest
       23

Soundtouch bpm iPhone

0 голосов
/ 22 ноября 2011

Я пытаюсь интегрировать механизм для расчета ВРМ песни в библиотеке iPod (также на iphone). Выполняя поиск в Интернете, я обнаружил, что наиболее используемые и надежные библиотеки для этой цели - это soundtouch. У кого-нибудь есть опыт использования этой библиотеки? В вычислительном отношении можно заставить его работать на оборудовании iPhone?

1 Ответ

4 голосов
/ 16 января 2012

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

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

...