2009-07-31 8 views
8

はい、これはthis questionの正確な複製ですが、リンクは回答として受け入れられ、私にとってはうまく機能しません。間違った値が返されています(2分のmp3は1'30、3分は2'20)、明白なパターンはありません。CでのMP3の長さを取得する方法

ここでももう一度:C#を使用してMP3の長さを取得するにはどうすればよいですか?

または

私はMP3Header classと間違って何をやっている:

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

重複質問の種類。私はここで答えようとしました:http://stackoverflow.com/questions/383164/how-to-retrieve-duration-of-mp3-in-net/13269914#13269914 –

答えて

10

明らかに、このクラスは、fileSize/bitRateを使用して継続時間を計算します。 ...これは、一定のビットレートのために働くことができる、と私はあなたのMP3は、可変ビットレートを持っていると仮定し

EDIT:TagLib Sharpを見て、それはあなたのスレッドで第2のポストはあなたを助けるかもしれない期間

+0

一定のビットレートのようです(Jonの答えに対する私のコメントを参照)。どのように私はこれをテストできますか? – marcgg

+0

あなたの編集について:taglibは期間を取得できますか?それは素晴らしいだろう、私はこれを今すぐチェックします – marcgg

+0

それは0を返すだけです...私は与えられたファイルが奇妙にエンコードされていると思います。私はちょうどその周りに道を見つけるだろうと思う – marcgg

4

あなたが「間違った」されているMP3ファイルの長さを確認していますどのように?私はヘッダー情報が間違っている可能性があることをよく見いだしました。例えば、この問題を抱えた特定のバージョンのLAMEがありました。

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

+0

例:MPEG Layer 3 Audio、Duration 1: 29、ビットレート:128kbps、音声レート:44kHz。この関数は、持続時間のために1:12のようなものを見つけます。私は、システムにアップロードされるMP3の種類を制御することはできないので、エンコード/ビットレート/何に関係なく動作する必要があります。 – marcgg

+0

taglibでテストした後、私は与えられたmp3がちょっと混乱しているか、または別の方法でエンコードされていると思います...私はちょうどこれを回避していきます(JonとThomasの回答に関する他のコメントを参照) – marcgg

+4

@marcgg:個人的には、トーマスの答えを受け入れるべきだと思います。 –

0

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

+0

soxは私がやろうとしていることに対して過度の気がしますね。 – marcgg

+0

ええ、それは毎回動作し、あなたは人生で移動することができますそれの価値がないのですか? – Jon

+0

真実:私はちょうど方法を見つけるだろうと思う。すべてこれはフラッシュプレーヤーに送信することですが、私はフラッシュで時間を取得する方法を知っているので、私はちょうどファイルが送信されたらそれを把握することができます。 anwserの考えをありがとう! – marcgg

3

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

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

はPCMにmp3ファイルを変換し、ID3タグを読み取るためのサンプルです。

私はあなたがmp3ファイルの長さを読むために使用することができると思います。最悪の場合は、すべてのフレームを読み取り、継続時間(VBRファイル)を計算することです。

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

0

VBRファイルの長さはまったく推定できません。その中のすべてのmp3フレームは、異なるビットレートを持つ可能性があるので、ファイルのどの部分を読み込んでも、ファイルの他の部分でどの程度の密度のデータがあるかわからない。 VBR mp3の完全な長さを決定する唯一の方法は、それを全体的にデコードすることです(または、あなたが知っていれば)フレームのすべてのヘッダーを1つずつ読み込み、デコードされたDURATIONを収集します。

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

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

詳細:多くのmp3ファイルはID3タグとして、それに追加「もの」を持っている、とあなたは、すべてのファイルを通過していない場合あなたは誤って期間計算にそのタグを使用することができます。

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; 
} 
関連する問題