3

谁能告诉我如何使用音频指纹从音频文件(mp3、wav、wma、ogg 等)中从MusicBrainz数据库中获取曲目信息。我正在使用 MusicBrainz Sharp 库,但任何其他库都可以。

我已经看到你必须使用 libofa 库,你不能使用 MusicBrainz Sharp 从音频文件中获取 puid,但我不知道如何在 C# 中使用 libofa。

请展示一些示例和代码片段来帮助我,因为我在任何地方都找不到它们。

提前致谢!

4

2 回答 2

1

问题是您可能可以使用libofa获取音频文件的指纹,但如果文件没有可用的PUID,您将被卡住,必须使用 genpuid 之类的东西音频指纹提交给AmpliFIND并等待一天得到一个PUID

话虽如此,大约两年前我尝试过类似的事情,但是如果我没记错的话,当我没有编写 IDv3 标签时,我对这个项目失去了兴趣。但是,源代码可在 Bitbucket 上找到。

我基本上使用 a包装了 libofaDllImport,还包装了 genpuid(即读取输出 XML),以便能够读取指纹并提交文件以进行指纹识别,如果我没有从 libofa 获得指纹。我还编写了一些代码,使用MusicBrainz Sharp从 MusicBrainz 读取信息。

好吧,我想,至少那是我当时的计划。:) 我希望这可以帮助你解决你的问题,我很想看到这方面的更新。

编辑:我刚刚注意到我为自己创建了一个错误报告,基本上说我仍然需要为我的解码器实现一个实现,这可能就是我在 SO 中创建这个问题的原因。所以我想我没有实现genpuid 指纹识别器只是为了能够做指纹/获取 guid,因为我没有让libofa 指纹识别器正常工作。

于 2011-01-02T13:51:20.990 回答
0

我做了上面建议的包装的 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 "";
        }
    }
于 2011-07-22T04:04:38.113 回答