我正在尝试集成一种机制来计算 iPod 库中歌曲的 BPM(也在 iphone 上)。在网上搜索我发现最常用和最可靠的库是soundtouch。有人对这个库有经验吗?是否有可能让它在 iPhone 硬件上运行?
1 回答
我最近成功地使用了soundtouch库的BPMDetect类中的代码。最初在C++上编译它,后来将代码翻译成C#,最近我一直在通过 JNI在Android应用程序上使用C++代码。我对iOS中的开发并不十分熟悉,但我几乎可以肯定你正在尝试做的事情是可能的。
您应该使用soundtouch源代码中的唯一文件如下:
C++ 文件
- BPMDetect.cpp
- FIFOSampleBuffer.cpp
- 峰查找器.cpp
头文件
- BPMDetect.h
- FIFOSampleBuffer.h
- FIFOSamplePipe.h
- 峰值查找器.h
- soundtouch_config.h
- STTypes.h
至少这些是我必须用来让它工作的唯一的。
BPMDetect类通过其inputSamples ()方法接收原始样本,即使整个文件尚未加载到其缓冲区中,它也能够计算 bpm 值。我发现这些中间值与加载整个文件后获得的值不同,根据我的经验,这更准确。
希望这可以帮助。
编辑:
在评论中解释这是一种复杂的过程,所以我将编辑答案。
它的要点是您需要您的 android 应用程序来使用本机代码。为此,您需要使用Android NDK工具集从 soundtouch 库编译上面列出的文件。
这将为您留下能够处理原始声音数据的本机代码,但您仍然需要从声音文件中获取数据,我认为您可以通过多种方式进行操作。我这样做的方式是使用 Android 的FMOD 库,这是一个很好的例子:FMOD for 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 代码放在一个要点中。
希望这可以帮助。