3

オーディオ フィンガープリンティングを使用して、オーディオ ファイル (mp3、wav、wma、ogg など) からMusicBrainzデータベースからトラック情報を取得する方法を教えてください。MusicBrainz Sharp ライブラリを使用していますが、他のライブラリでも問題ありません。

libofa ライブラリを使用する必要があり、MusicBrainz Sharp を使用してオーディオ ファイルから puid を取得できないことがわかりましたが、C# で libofa を使用する方法がわかりません。

どこにも見つからないので、いくつかの例とコード スニペットを示してください。

前もって感謝します!

4

2 に答える 2

1

おそらくlibofaを使用してオーディオ ファイルのフィンガープリントを取得できますが、ファイルに使用可能なPUIDがない場合は行き詰まり、genpuid などを使用してオーディオ フィンガープリントを AmpliFIND に送信し、しばらく待つ必要があります。 PUIDを取得する日。

そうは言っても、私は約2年前に似たようなことを試みましたが、私の記憶が正しければ、IDv3タグを書き損ねたときにプロジェクトへの興味を失いました. ただし、ソース コードはBitbucketで入手できます。

私は基本的に を使用してlibofa をラップDllImportし、genpuidもラップして(つまり、出力 XML を読み取り)、フィンガープリントを読み取って、libofa から取得しなかった場合にフィンガープリントのためにファイルを送信できるようにしました。また、 MusicBrainz Sharpを使用して MusicBrainz から情報を読み取るコードもいくつか書きました。

少なくとも、当時はそれを計画していたと思います。:) これが問題の解決に役立つことを願っています。これに関する最新情報をぜひご覧ください。

編集:私は自分自身のためにバグレポート作成したことに気付きまし. したがって、libofa フィンガープリンティングが正しく機能しなかったため、フィンガープリントを実行して GUID を取得できるようにするためだけにgenpuid フィンガープリンティングを実装しなかったと思います。

于 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 に答える