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