9

はい、これはこの質問の正確な複製ですが、回答として与えられ受け入れられたリンクは私には機能しません。明らかなパターンなしで、誤った値を返しています(2分mp3は1'30としてリストされ、3分は2'20としてリストされます)。

だからここに再びあります:C#を使用してMP3の長さを取得するにはどうすればよいですか?

また

MP3Headerクラスで何が間違っていますか:

MP3Header mp3hdr = new MP3Header();
bool boolIsMP3 = mp3hdr.ReadMP3Information("1.mp3");
if(boolIsMP3)
  Response.Write(mp3hdr.intLength);
4

7 に答える 7

12

どうやらこのクラスはfileSize/bitRateを使用して期間を計算します。これは固定ビットレートでのみ機能し、MP3には可変ビットレートがあると思います...

編集:TagLibシャープを見てください、それはあなたに期間を与えることができます

于 2009-07-31T18:26:24.983 に答える
4

「間違っている」MP3の長さをどのように確認しましたか?ヘッダー情報が間違っている可能性があることによく気づきました。たとえば、この問題が発生した特定のバージョンのLAMEがありました。

ファイルのプロパティをWindowsエクスプローラーに表示すると、何が表示されますか?

于 2009-07-31T18:26:09.587 に答える
3

mp3デコーダーライブラリをラップして、.net開発者が利用できるようにしました。あなたはここでそれを見つけることができます:

http://sourceforge.net/projects/mpg123net/

mp3ファイルをPCMに変換し、ID3タグを読み取るためのサンプルが含まれています。

mp3ファイルの長さを読み取るために使用できると思います。最悪の場合は、すべてのフレームを読み取り、期間を計算することです-VBRファイル。

mp3持続時間を正確に決定するには、すべてのフレームを読み取り、それらの合計持続時間から持続時間を計算する必要があります。人々がmp3ファイルの中にさまざまな「メタデータ」を入れる場合がたくさんあるので、ビットレートとファイルサイズから見積もると、あなたは間違っていると推測するでしょう。

于 2010-08-24T19:46:53.483 に答える
0

スレッドの2番目の投稿が役立つ場合があります:http ://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/c72033c2-c392-4e0e-9993-1f8991acb2fd

于 2009-07-31T18:30:29.280 に答える
0

これを行うには、外部アプリケーションを使用することを検討します。Soxを試してみて、soxi(exeなし)を使用して実行されたプログラムのバージョンを実行し、その出力を解析してみてください。あなたのオプションを考えると、この機能があなたがしていることの核心でない限り、mp3ファイルのすべての奇妙さを解決するために時間を費やした他の誰かを信頼する方が良いと思います。幸運を!

于 2009-07-31T18:42:33.953 に答える
0

VBRファイルの長さをまったく見積もることができません。その中のすべてのmp3フレームは異なるビットレートを持つ可能性があるため、ファイルの任意の部分を読み取ることから、ファイルの他の部分でのデータの密度を知ることはできません。VBR mp3の正確な長さを決定する唯一の方法は、全体をデコードするか、(方法を知っている場合は)フレームのすべてのヘッダーを1つずつ読み取り、デコードされたDURATIONを収集することです。

後で使用する方法は、使用するCPUが保存する必要のある貴重なリソースである場合にのみ使用します。それ以外の場合は、ファイル全体をデコードすると、期間が決まります。

あなたはmpg123の私のポートを使って仕事をすることができます:http ://sourceforge.net/projects/mpg123net/

詳細:多くのmp3ファイルにはid3タグとして「もの」が追加されており、すべてのファイルを調べないと、期間の計算でそのタグを誤って使用する可能性があります。

于 2012-06-20T22:26:19.173 に答える
0

soxサウンド処理ライブラリを使用したC#のソリューションがあります。

public static double GetAudioDuration(string soxPath, string audioPath)
{
    double duration = 0;
    var startInfo = new ProcessStartInfo(soxPath,
        string.Format("\"{0}\" -n stat", audioPath));
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.RedirectStandardError = true;
    startInfo.RedirectStandardOutput = true;
    var process = Process.Start(startInfo);
    process.WaitForExit();

    string str;
    using (var outputThread = process.StandardError)
        str = outputThread.ReadToEnd();

    if (string.IsNullOrEmpty(str))
        using (var outputThread = process.StandardOutput)
            str = outputThread.ReadToEnd();

    try
    {
        string[] lines = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        string lengthLine = lines.First(line => line.Contains("Length (seconds)"));
        duration = double.Parse(lengthLine.Split(':')[1]);
    }
    catch (Exception ex)
    {
    }

    return duration;
}
于 2013-03-09T19:41:24.017 に答える