Chromaprint是一个用于计算 AcoustID 的开源软件库音频文件的音频指纹。
我正在尝试从 iOS 上的本地文件生成此音频指纹。
该库可以在 Windows、Linux 和 OS X 上构建,它创建一个动态库以及一个独立程序 (fpcalc),该程序接受音频文件、解码音频并将其传递给 chromaprint 库以计算指纹。由于以下原因,它在 iOS 上实际上不起作用:
我在实际为 iOS 构建库时遇到了一些麻烦(CMake 讨厌我),但我觉得上述问题更相关,因为即使编译了库,它也不会仅仅解决盒子。
我试图避免这是一个“为我编写代码”的问题,但我基本上坚持为 iOS 生成色度指纹的每个方面。
我认为,我的目标是在 iOS 上重新创建 fpcalc 程序的功能 - 解码音频文件(存储在设备上的任何音频类型)并将其传递给 chromaprint 库以生成指纹。
我找到了 this question关于 iOS 上的声学指纹识别,但它与 chromaprint/AcoustID 无关,答案也没什么帮助。 Echoprint Codegen 很有趣,但我需要一个 chromaprint 指纹。
最佳答案
我做到了!我真的做到了!免责声明:这有效,但我不知道我在做什么。肯定有更好的方法来做到这一点。
构建问题:一开始,CMake 没有任何效果。我发现并使用了 this toolchain file来自 ios-cmake 项目,大多数事情都有效。正如他们的 wiki 上所述,您必须使用源代码中的最新版本文件,而不是下载部分。 CMake 提示 Boost,Xcode 提示 Boost,但这两个问题在许多小时后神奇地自行修复。
构建 fpcalc 功能(指纹生成)是一个棘手的部分,因为它使用 ffmpeg,而我还没有准备好尝试在 iOS 上使用我的应用构建它。还好苹果的Audio File Services (AudioToolbox 的一部分)具有相同类型的低级音频功能。
我开始查看 this code从 NSData 播放 MP3 文件。 Audio Queue Services Programming Guide还有关于打开和读取音频文件及其属性的非常有用的信息。但是,使用 mp3 文件(或任何压缩格式)时,您从数据中读取的帧不是 chromaprint 所需的原始 PCM 数据。
幸运的是,this sample project来自 Apple 的将音频文件转换为另一种格式。尽管在我的应用程序中编译该项目需要一些技巧(很多奇怪的 C++/Objective-C 混合),但这正是我所需要的——它包含一个 DoConvertFile 方法。
基本上,我的最终代码使用了这两种方法。首先,它使用 DoConvertFile 将任何输入文件转换为线性 PCM 格式,然后使用 AudioFileOpenURL 和 AudioFileReadPackets 读取转换文件的内容。 AudioFileGetProperty 为我们提供了需要传递给 chromaprint_new 的值。然后,我们会收到相同的逐帧音频数据,这些数据可以传递给 chromaprint_feed,一旦您到达文件末尾,就是这样! chromaprint_finish 和 chromaprint_get_fingerprint 完美运行。删除转换后的文件,然后用指纹做任何你想做的事。
这就是您在 iOS 应用程序中实现 AcoustID 的方式!我的解释现在看起来有点简单,但这确实花了几个小时。 :'(
关于c++ - 在 iOS 中生成 AcoustID/Chromaprint 声学指纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26032379/
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我想从rubyrake脚本运行一个可执行文件,比如foo.exe我希望将foo.exe的STDOUT和STDERR输出直接写入我正在运行rake任务的控制台.当进程完成时,我想将退出代码捕获到一个变量中。我如何实现这一目标?我一直在玩backticks、process.spawn、system但我无法获得我想要的所有行为,只有部分更新:我在Windows上,在标准命令提示符下,而不是cygwin 最佳答案 system获取您想要的STDOUT行为。它还返回true作为零退出代码,这可能很有用。$?填充了有关最后一次system调
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“