Skip to content
/ fpcalc Public

Fpcalc of Chromaprint using MediaCodec for Android platform.

License

Notifications You must be signed in to change notification settings

cy745/fpcalc

Repository files navigation

Chromaprint fpcalc using MediaCodec for Android platform

简介

针对Android平台的一个基于Chromaprint的音频指纹计算库,可计算音频指纹用于判断音频是否“相同”,可用音频指纹调用 Acoustid 的API查询 MusicBrainz 库中所存有的与该音频相似的数据的相关信息。

本仓库的核心代码基于Chromaprint的fpcalc.cpp。与原始实现不同,使用Android NDK提供的MediaCodec来替代FFMpegAvCodec进行音频解码。降低了动态库的大小。同时针对Android平台,提供了使用FileDescriptor读取文件的方法,以便更好地集成到Android应用中。

功能与特性

  • 使用MediaCodec替代FFMpegAvCodec进行音频解码,降低动态库大小。
  • 提供使用FileDescriptor读取文件的方法,方便Android应用集成。

参考与引用

如何使用

// 导入jitpack源
maven(url = "https://jitpack.io")

// 所需使用的project中引入library 
implementation("com.github.cy745:fpcalc:<version>")
// 配置传入fpcalc的参数,fd为文件的FileDescriptor
val params: FpcalcParams = FpcalcParams(
  targetFd = fd    // Int
)

// 或者传入文件路径
val params: FpcalcParams = FpcalcParams(
  targetFilePath = filePath    // String
)

// 调用Fpcalc
val result: FpcalcResult = Fpcalc.calc(params)

// 输入的FpcalcParams定义如下
data class FpcalcParams(
    val targetFd: Int = -1,
    val targetFilePath: String? = null,
    val gMaxDuration: Int = 120,    // in second
    val gRaw: Boolean = false,
    val gSigned: Boolean = false,
    val gAlgorithm: Int = 2,
)

// 输出的FpcalcResult定义如下
class FpcalcResult {
    var fingerprint: String? = null
    var rawFingerprint: String? = null
    var errorMessage: String? = null
    var sourceDurationMs: Long = 0
    var sourceSampleRate: Int = 0
    var sourceChannels: Int = 0
    var sourceLength: Int = 0
}

参与开发

构建项目

# 拉取项目,注意要拉取子项目
git clone --recursive https://github.com/cy745/fpcalc

# 若只拉取了父项目,没加--recursive参数的话,进入项目目录后执行下面的命令即可
git submodule update --init --recursive

后续任务

  • ✅ 解决各种闪退问题
  • ✅ 完善API,降低Android平台使用的难度
  • 🔘 完全剔除对libavutils的依赖(目前还有resample部分依赖libavutils用于缓冲区的创建)
  • ......

贡献与反馈

欢迎任何形式的贡献和反馈。如果你在使用过程中遇到问题,或者有任何建议,请随时提交issue或pull request。