2009-07-31 30 views
8

Ja, das ist ein exaktes Duplikat von this question, aber der angegebene Link und die angenommene Antwort funktionieren nicht für mich. Es gibt falsche Werte zurück (ein 2 Minuten mp3 wird als 1'30, 3 Minuten als 2'20 aufgelistet) ohne offensichtliches Muster.So erhalten Sie die Länge einer MP3 in C#

Also hier ist es wieder: wie bekomme ich die Länge einer MP3 mit C#?

oder

Was soll ich mit dem MP3Header class falsch zu machen:

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

Art der doppelten Frage; Ich habe versucht, das hier zu beantworten: http://stackoverflow.com/questions/383164/how-to-retrieve-duration-of-mp3-in-net/13269914#13269914 –

Antwort

10

Offenbar berechnet diese Klasse die Dauer mit FileSize/BitRate. Dies kann nur für konstante Bitrate arbeiten, und ich nehme an, Ihre MP3 Variable Bitrate hat ...

EDIT: einen Blick auf TagLib Sharp haben, kann es Ihnen geben die Dauer

+0

Es sieht aus wie konstante Bitrate (siehe meinen Kommentar zu Jons Antwort). Wie könnte ich das testen? – marcgg

+0

über Ihre Bearbeitung: Taglib kann die Dauer bekommen? Das wäre großartig, ich werde das jetzt überprüfen – marcgg

+0

Es gibt nur 0 zurück ... Ich nehme an, dass die Dateien, die mir gegeben wurden, seltsam kodiert sind, was all das erklären würde. Ich denke, ich werde nur einen Weg finden – marcgg

4

Wie haben Sie die Längen der MP3s ermittelt, die "falsch" sind? Ich habe oft festgestellt, dass die Header-Informationen falsch sein können: Es gab zum Beispiel eine bestimmte Version von LAME, die dieses Problem hatte.

Wenn Sie die Eigenschaften der Datei in Windows Explorer nach oben bringen, was zeigt das?

+0

Ein Beispiel: MPEG Layer 3 Audio, Dauer 1: 29, Bitrate: 128kbps, Tonfrequenz: 44kHz. Die Funktion findet etwa 1:12 für die Dauer. Ich habe keine Kontrolle über die Art von MP3, die auf das System hochgeladen wird, also muss es funktionieren, egal welche Kodierung/Bitrate/was auch immer. – marcgg

+0

Nach dem Testen mit Taglib denke ich, dass die mp3s, die mir gegeben wurden, ein bisschen durcheinander sind oder anders kodiert sind ... Ich werde mich einfach darum kümmern (siehe meine anderen Kommentare zu Jon's und Thomas 'Antworten) – marcgg

+4

@marcgg: Persönlich denke ich, Sie sollten Thomas 'Antwort akzeptieren, da sie im Allgemeinen nützlich ist. –

0

Ich würde in Betracht ziehen, eine externe Anwendung zu verwenden, um dies zu tun. Versuchen Sie, Sox auszuprobieren, und führen Sie einfach die Version des Programms aus, das mit soxi (no exe) ausgeführt wird, und versuchen Sie, diese Ausgabe zu analysieren. Angesichts Ihrer Möglichkeiten, denke ich, dass es besser ist, wenn Sie jemandem vertrauen, der sich die Zeit genommen hat, all die Unheimlichkeit in MP3-Dateien auszuarbeiten, es sei denn, diese Funktionalität ist der Kern dessen, was Sie tun. Viel Glück!

+0

Sox klingt wie Overkill für das, was ich versuche zu tun, meinst du nicht? – marcgg

+0

Ja, aber wenn es jedes Mal funktioniert und du kannst mit dem Leben weitermachen, ist es das nicht wert? – Jon

+0

true :) Ich denke, ich werde nur einen Weg finden. All das soll an einen Flash-Player gesendet werden, aber ich weiß, wie die Dauer im Flash erreicht wird, damit ich es einfach herausfinden kann, sobald die Datei gesendet wurde. Danke für den anwser Gedanken! – marcgg

3

Ich wickelte MP3-Decoder-Bibliothek und machte es für. NET-Entwickler. Sie können es hier finden:

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

Enthalten sind die Proben mp3-Datei in PCM zu konvertieren und ID3-Tags zu lesen.

Ich denke, dass Sie es verwenden können, um MP3-Datei Dauer zu lesen. Der schlimmste Fall ist, dass Sie alle Frames lesen und die Dauer berechnen - VBR-Datei.

Um genau mp3 Dauer zu bestimmen, Sie HABEN alle Frames lesen und Dauer von ihrer summierten Dauer zu berechnen. Es gibt viele Fälle, in denen Menschen verschiedene "Metadaten" in MP3-Dateien einfügen. Wenn Sie also die Bitrate und die Dateigröße schätzen, werden Sie falsch raten.

0

Länge der VBR-Datei kann nicht geschätzt werden. Jeder mp3-Rahmen in diesem kann unterschiedliche Bitraten haben. Wenn Sie also einen Teil der Datei lesen, können Sie nicht wissen, welche Dichte die Daten in irgendeinem anderen Teil der Datei haben. Nur um die EXACT-Länge von VBR mp3 zu bestimmen, müssen Sie DECODE im Ganzen dekodieren ODER (wenn Sie wissen, wie) alle Header der Einzelbilder einzeln lesen und ihre dekodierte DURATION sammeln.

Sie werden die spätere Methode nur verwenden, wenn die von Ihnen verwendete CPU eine wertvolle Ressource ist, die Sie speichern müssen. Ansonsten dekodiere die ganze Datei und du hast die Dauer.

Sie meinen Hafen von mpg123 können den Job zu erledigen: http://sourceforge.net/projects/mpg123net/

Mehr: viele MP3-Dateien „Zeug“ haben ihm hinzugefügt, als ID3-Tags, und wenn Sie gehen nicht durch die ganze Datei Sie könnten dieses Tag fälschlicherweise in der Dauerberechnung verwenden.

0

Dort ist meine Lösung für C# mit sox Sound-Processing-Bibliothek.

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; 
} 
Verwandte Themen