如何从音频文件中获取musicbrainz曲目信息

时间:2011-01-02 10:35:20

标签: c# audio fingerprinting audio-fingerprinting musicbrainz

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

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

请显示一些示例和代码段来帮助我,因为我无法在任何地方找到它们。

提前致谢!

2 个答案:

答案 0 :(得分:1)

问题是您可以使用libofa获取音频文件的指纹,但如果文件没有PUID可用,您将被卡住并将不得不使用类似{ {3}}将音频指纹提交至genpuid并等待一天以获得AmpliFIND

话虽这么说,我在两年前尝试过类似的东西,但是当我没有写下IDv3标签时,如果我没记错的话,对项目失去了兴趣。但是,源代码可用PUID

我基本上on Bitbucket使用DllImportwrapped libofa(即读取输出XML)以便能够读取指纹并提交指纹,如果我没有得到一个来自libofa。我还写了wrapped genpuid,使用some code从MusicBrainz读取信息。

嗯,至少那是我当时的计划,我想。 :)我希望这可以帮助您解决问题,我希望看到更新。

编辑:我刚刚注意到我为自己创建了一个MusicBrainz Sharp,这基本上说我仍然需要我bug report的实现,这可能就是我创建的原因{在SO中{3}}。所以我想我没有实现decoder只是为了能够做指纹/获取guid,因为我没有让this question正常工作。

答案 1 :(得分: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 "";
        }
    }