Prüfen, wie lang eine MP3-Datei ist

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Infinity.

    Prüfen, wie lang eine MP3-Datei ist

    Hi,

    ich möchte prüfen, wie lange eine MP3-Datei ist. Dabei möchte ich keine Dll-Datei verwenden, sondern das ganze direkt aus der Datei auslesen.
    Bei MP4/M4A-Dateien gibt es beispielsweise eine bestimmte Stelle in der Datei, die man einfach auslesen kann und dann kann man mithilfe eines 2ten Wertes (dem TimeScale-Wert) die Länge der Datei berechnen. Wo kann ich diese Werte in einer MP3-Datei finden?
    MP3 Dateien haben doch auch Header Informationen.
    Dort steht meineswissens auf jedenfall die Bitrate, Version usw.

    Mithilfe der Bytes/Seconds und der Dateigröße und dem Header abgezogen bekommt man sicher auch die Länge des Liedes raus..

    Cheers Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Grundsätzlich ist das mit Header schon richtig. Ich persönlich habe für meine FrameKlasse diese Seite verwendet: datavoyage.com/mpgscript/mpeghdr.htm (beinhaltet keine Sideinformation welche auch nicht benötigt wird). Doch das Problem ist was ist wenn es VBR encodiert ist und das 2. Problem das du hast ist, dass du erst zusätzlich auch noch den header des id3v2-headers auslesen musst (also nicht alles nur den header welcher die größe beinhaltet). Außerdem auch nicht vergessen hinten optional die 128 bytes wegschneiden bei id3v1.

    Zu der Calculation ansich war ich mir mit dieser Bitrate selbst nie ganz so sicher, denn komischwer weise kommt der windows explorer auf andere Werte als ich...
    Ich habe dann aber alles überprüft und konnte keinen Fehler finden. So habe ich einen alternativen weg genommen und zwar folgenden:
    Ich errechne erst die gesammte Anzahl der Samples (Frame für Frame einlesen --> man muss so oder so den header auslesen macht von dem her nicht viel mehr arbeit) und dividiere dies durch die SampleRate.
    Mag vll. recht umständlich sein (bei mir war das damals so oder so nötig). Jedoch wenn jemand eine Ahnung hat wieso ich auf unterschiedliche Werte bei der Bitrate komme (und nicht nur ich) dann kann er sich gerne melden :)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Danke erst mal für die Antworten, werde sehen, was ich damit anfangen kann. Alle Frames auslesen wollte ich eigentlich vermeiden und ich glaube auch nicht, dass Player oder der Explorer das so machen.

    @Mono: Was genau meinst du mit HeaderInfos? Den ID3v2-Header? Der kann zwar evtl. ein Tag mit der Länge enthalten, aber eine Datei muss das ja nicht zwangsweise beinhalten.

    @SystemUnknow: Deine Lösung funktioniert über die WinAPI, was sicher nicht schlecht ist, aber nicht meine bevorzugte Lösung ist, denn ich möchte das ganze selbst schreiben. Außerdem kommt noch hinzu, dass die WinAPI bei MP3-Dateien mit ID3v2.4-Tags nicht funktioniert.

    EDIT: Ich habe es jetzt geschafft, zumindest schon einmal bei CBR die Dauer auszulesen, indem ich aus dem erstem Frame die Bitrate ausgelesen habe. Für Files mit VBR habe ich gerade noch folgendes gefunden:

    Some files are encoded with variable bitrate mode (VBR). To estimate the duration of those files, you have to know the average bitrate of the whole file. It often differs a lot from the bitrate of the first frame, because the lowest bitrate available is used for silence in music titles (especially at the beginning). To get this average bitrate, you must go through all the frames in the file and calculate it, by summarizing the bitrates of each frame and dividing it through the number of frames. Because this isn't a good practice (very slow), there exists additional VBR headers within the data section of the first frame (after the frame header). They contain the total number of frames in the file from which you can calculate the duration in seconds with the following formula:

    VB.NET-Quellcode

    1. Duration = Number of Frames * Samples Per Frame / Sampling Rate



    Ich werde es morgen mal ausprobieren.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Infinity“ ()