谁能告诉我如何使用音频指纹从音频文件(mp3、wav、wma、ogg 等)中从MusicBrainz数据库中获取曲目信息。我正在使用 MusicBrainz Sharp 库,但任何其他库都可以。
我已经看到你必须使用 libofa 库,你不能使用 MusicBrainz Sharp 从音频文件中获取 puid,但我不知道如何在 C# 中使用 libofa。
请展示一些示例和代码片段来帮助我,因为我在任何地方都找不到它们。
提前致谢!
谁能告诉我如何使用音频指纹从音频文件(mp3、wav、wma、ogg 等)中从MusicBrainz数据库中获取曲目信息。我正在使用 MusicBrainz Sharp 库,但任何其他库都可以。
我已经看到你必须使用 libofa 库,你不能使用 MusicBrainz Sharp 从音频文件中获取 puid,但我不知道如何在 C# 中使用 libofa。
请展示一些示例和代码片段来帮助我,因为我在任何地方都找不到它们。
提前致谢!
问题是您可能可以使用libofa获取音频文件的指纹,但如果文件没有可用的PUID,您将被卡住,必须使用 genpuid 之类的东西将音频指纹提交给AmpliFIND并等待一天得到一个PUID。
话虽如此,大约两年前我尝试过类似的事情,但是如果我没记错的话,当我没有编写 IDv3 标签时,我对这个项目失去了兴趣。但是,源代码可在 Bitbucket 上找到。
我基本上使用 a包装了 libofaDllImport
,还包装了 genpuid(即读取输出 XML),以便能够读取指纹并提交文件以进行指纹识别,如果我没有从 libofa 获得指纹。我还编写了一些代码,使用MusicBrainz Sharp从 MusicBrainz 读取信息。
好吧,我想,至少那是我当时的计划。:) 我希望这可以帮助你解决你的问题,我很想看到这方面的更新。
编辑:我刚刚注意到我为自己创建了一个错误报告,基本上说我仍然需要为我的解码器实现一个实现,这可能就是我在 SO 中创建这个问题的原因。所以我想我没有实现genpuid 指纹识别器只是为了能够做指纹/获取 guid,因为我没有让libofa 指纹识别器正常工作。
我做了上面建议的包装的 genpuid 方法。
private string GetPUID(string fileName)
{
Process p;
ProcessStartInfo si;
string outRow;
string puidReturned;
string gendPuidPath = @"C:\Program Files\genpuid\genpuid.exe";
string gendPuidKey = "your key here";
System.Text.RegularExpressions.Regex puidRex = new System.Text.RegularExpressions.Regex( @"puid: (\S+)" ); // sample: puid: 3c62e009-ec93-1c0f-e078-8829e885df67
System.Text.RegularExpressions.Match m;
if (File.Exists(gendPuidPath))
{
try
{
si = new ProcessStartInfo(gendPuidPath, gendPuidKey + " \"" + fileName + "\"");
si.RedirectStandardOutput = true;
si.UseShellExecute = false;
p = new Process();
p.StartInfo = si;
p.Start();
puidReturned = "";
while ((outRow = p.StandardOutput.ReadLine()) != null)
{
m = puidRex.Match(outRow);
if (m.Success)
puidReturned = m.Groups[1].Value;
Debug.WriteLine(outRow);
}
p.WaitForExit();
p.Close();
return puidReturned;
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
Debug.WriteLine(ex.StackTrace);
throw new Exception("Unexpexted Error obtaining PUID for file: " + fileName, ex);
}
}
else
{
Debug.WriteLine("genpuid.exe not found");
return "";
}
}