Ferris: Länge einer mp3 durch Dateigröße berechnen

`n Abend!

Wie der Titel bereits verrät, möchte ich die Länge einer mp3 anhand seiner Dateigröße berechnen.

Dazu fehlen mir aber ein paar Informationen über den Aufbau einer mp3.
Vielleicht hat jemand Erfahrung damit und kann mir helfen.

Ich denke im groben sollte es so funktionieren:

* header subtrahieren
* id3-Tags subtrahieren.
* die Bitrate der mp3 ermitteln
* die Kanäle der mp3 ermitteln

Dateigröße - "id3Tag" = Sounddaten

(Sounddaten / Kanäle) / Bitrate = Zeit in Sekunden.

Liege ich mit meinem Ansatz richtig?
Hat der header einer mp3 immer dieselbe Größe?
Ist für den id3-Tag eine feste Größe reserviert?
Mir geht es darum, wirklich nur die reinen Sounddaten zu berrechnen und daraus die Länge der mp3.

Danke

  1. @@Ferris:

    nuqneH

    Ich denke im groben sollte es so funktionieren:

    Nicht wirklich. mp3 ist ein kompromiertes Format. Wieviel komprimiert wurde, hängt vom Ausgangssignal ab. (Ist dieses ein reines Sinussignal ist die Kompression viel höher als bei weißem Rauschen.)

    Aus der Dateigröße auf die Länge zu schließen, ist unmöglich. Du kannst sie bestenfalls grob abschätzen, indem du die mittlere Kompressionsrate eines für deinen Anwendungsfall repräsentativen Tonsignals verwendest.

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
    1. Aus der Dateigröße auf die Länge zu schließen, ist unmöglich. Du kannst sie bestenfalls grob abschätzen, indem du die mittlere Kompressionsrate eines für deinen Anwendungsfall repräsentativen Tonsignals verwendest.

      Die Lösung scheidet leider aus weil ich die Datei dafür vorher vollständig laden muss.

      Ich habe gerade nochmal Google benutzt um meinen Ansatz zu überprüfen und bin dabei darauf gestoßen.

      Dort wird gesagt

      "Jetzt brauchst Du noch dne Kompressionsgrad, also "kb/sekunde" (der ist je nach "Layer" unterschiedlich), mit dem kannst Du dann die Dauer berechnen."

      Steht der Kompressionsgrad also vielleicht sogar in der mp3?
      Was sind diese Layer?

      Ich lese gerade etwas Wiki über den Aufbau einer mp3.
      Das ist für mich aber gerade Neuland und ich schau noch nicht so ganz dahinter.

      1. Hi,

        Steht der Kompressionsgrad also vielleicht sogar in der mp3?

        Der Begriff „Kompressionsgrad“ ist in diesem Zusammenhang Unfug.

        Am gebräuchlichsten heutzutage dürften MP3s mit variabler Bitrate (VBR) sein. Damit kann jeder Frame eine andere Bitrate haben.
        Wenn also im Header/den ID3-Tags keine Information über die Gesamtlänge steht - und das muss sie m.W. nicht - dann kannst du nur jeden Frame einzeln untersuchen, um aus dessen Bitrate und der Samplingrate der Gesamtdatei auf die Länge in Millisekunden zu schließen, und das ganze aufaddieren. Dabei gibt's dann aber auch wieder einige Fallstricke zu beachten, bspw. Sachen wie das “bit reservoir”, wo ein nicht komplett gefüllter Frame schon Audiodaten für den Folgeframe aufnimmt, und ähnliche Späße.

        Hinzu kommt noch, das längst nicht jede MP3-Datei, die so im Netz rumschwirrt, auch gemäß der Spezifikation aufgebaut ist. Wenn du also auch MP3s aus „dubiosen“ Quellen (sprich: bspw. von Nutzern irgendwo hochgeladene) einbeziehen willst, dann wirst du auch noch einiges ins Fehler-Handling investieren müssen.
        (Die Leute machen mit ihren MP3s eine Menge Murks, „zusammenkopieren“ mehrere Dateien zu einer, so dass auch mittendrin ID3-Tags stehen, etc. pp.)

        Meint Tipp: Suche dir irgendeine Lib, die das ganze für dich macht.
        Um das selber zu realisieren, wirst du dich weitaus intensiver mit der Spezifikation auseinandersetzen müssen, als du dir bislang erträumt hast.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Bounjoun ChrisB,

          (Die Leute machen mit ihren MP3s eine Menge Murks, „zusammenkopieren“ mehrere Dateien zu einer, so dass auch mittendrin ID3-Tags stehen, etc. pp.)

          Mit einem normalen Texteditor konnte ich mittendrin normalen Text hineinschreiben. Wenn's nicht allzu lang war, hat man bei der Wiedergabe nichts gemerkt.

          Ob Terroristen sich dieser Methoden bedient haben? ;)

          Adiou.

          --
          Ich bin eigentlich ganz anders, aber ich komme so selten dazu. - Ödön von Horwáth
          1. Bounjoun Jean-Max,

            Ob Terroristen sich dieser Methoden bedient haben? ;)

            Oder der Informant von Wikileaks (Informationen auf einer Lady-Gaga-CD)...

            Adiou.

            --
            Ich bin eigentlich ganz anders, aber ich komme so selten dazu. - Ödön von Horwáth
  2. Lieber Ferris,

    ich weiß ja nicht, auf welcher Plattform mit welcher Programmiersprache Du arbeiten willst, aber ich benutze für meine MP3-Manipulationen folgendes PHP-Script: Source Rally PHP Community: PHP MP3 Class

    Da PHP von der Syntax her mit C verwandt ist, könnte es ja sein, dass Du die Funktionsweise in eine andere Sprache adaptieren kannst.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. ich weiß ja nicht, auf welcher Plattform mit welcher Programmiersprache Du arbeiten willst, aber ich benutze für meine MP3-Manipulationen folgendes PHP-Script: Source Rally PHP Community: PHP MP3 Class

      Das könnte ein Ansatz sein.
      Ich versuche einen Flash-mp3-Player in ActionScript3 zu schreiben.
      Es wäre aber kein Problem, neben der mp3 gleichzeitig z.B. eine PHP-Datei anzusteuern die mir die entsprechenden Daten liefert, anstatt es mit AS3 zu versuchen.

      Schön wäre es, wenn das dann auch noch domain-übergreifend funktioniert...
      Das ist dann aber wahrscheinlich wieder eine andere Geschichte.

      Danke für diesen Hinweis!

      @ChrisB:
      hättest du ein Beispiel für so eine "vermurkste" mp3?
      Es ist immer schön wenn man etwas "kaputtes" zum Testen der stabilität seiner Programme hat.

      1. Ich versuche einen Flash-mp3-Player in ActionScript3 zu schreiben.

        Ich will dir nicht zu nahe treten, ich habe auch schon ne Menge Unsinn gemacht, aber:
        Warum?
        1. Es gibt bereits sehr sehr gute Audio-Player auf Flash-Basis, _gerade_ für MP3. Ich glaube die Welt hat keinen Bedarf an einem weiteren (obwohl ich ein Freund der Software-Vielfalt bin!)
        2. Ich halte Flash-Audioplayer eh für Vergangenheit. Das HTML-audio-Element erscheint mir effizienter, (oft) flexibler und vor allem aber sicherer als Flash.

        Wenn du natürlich nur üben willst, ausprobieren, was du leisten kannst etc. dann nur zu, aber wenn du beabsichtigst das Ding in den Markt zu bringen, dann würde ich dir abraten wollen.

        --
        sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
          1. Ich halte Flash-Audioplayer eh für Vergangenheit. Das HTML-audio-Element erscheint mir effizienter, (oft) flexibler und vor allem aber sicherer als Flash.

          Flash-Player sind aber flexibler. Wieso meinst du, Flash sei unsicherer?

          Wenn du natürlich nur üben willst, ausprobieren, was du leisten kannst etc. dann nur zu, aber wenn du beabsichtigst das Ding in den Markt zu bringen, dann würde ich dir abraten wollen.

          Ja, es geht mir eher ums probieren. Am Ende werde ich ihn sicher ein paar Leuten vorstellen, ich möchte ihn aber nicht "verkaufen" o.ä.
          Andererseits könnte man fast immer damit argumentieren, dass es "schon genug" gibt. Das Internet ist nunmal voll von Codeschnipseln, Frameworks und anderen Lösungen für so ziemlich jedes Software-Problem.

  3. Hallo,

    Wie der Titel bereits verrät, möchte ich die Länge einer mp3 anhand seiner Dateigröße berechnen.

    das ist nur möglich, wenn
     a) die mp3-Datei mit einer bekannten *konstanten* Bitrate erstellt wurde
    oder
     b) die Bitrate variabel, aber der Mittelwert exakt bekannt ist (unwahrscheinlich)

    * header subtrahieren

    Das mp3-Format hat keinen Datei-Header. Es fügt einfach mp3-Datenblöcke (Frames) aneinander. Jeder Frame hat aber seinen eigenen 4 Byte langen Header. So kann auch jeder Frame seine individuelle Bitrate haben (VBR).
    Das bedeutet aber auch, dass du durch die ganze Datei laufen und jeden Frame betrchten musst.

    Jeder Frame enthält per definitionem 1152 Samples, seine Dauer lässt sich damit also schon berechnen, wenn man die Sampling Rate (meistens 44.1kHz) kennt:

    1152 / 44100 = 26.1 ms

    Über die Bitrate lässt sich das dann auch in eine Frame-Länge in Byte umrechnen. Angenommen, wir haben ein Frame mit 192k:

    192000/8 * 1152 / 44100 = 626.9

    Da die Zahl der Bytes nicht ganzzahlig ist, werden Frames mit 626 und 627 Bytes gemischt, um im Mittel den errechneten Wert zu erhalten. Ein 627 Byte langer Frame ist dann durch ein gesetztes Padding-Bit im Header markiert.

    * id3-Tags subtrahieren.

    Das dürfte das Schwierigste sein, wenn man nicht sowieso die mp3-Frames durchgeht. Man könnte natürlich sagen, die Größe der ID3-Tags ist klein im Verhältnis zu den Nutzdaten, und sie einfach ignorieren. Der Unterschied (Fehler) wird in vielen Fällen im Bereich <1% liegen.

    * die Bitrate der mp3 ermitteln

    Siehe oben, das musst du pro Frame tun.

    * die Kanäle der mp3 ermitteln

    Nicht nötig, steckt in den obigen Betrachtungen schon mit drin. Ein Stereo-mp3 mit 192k verwendet einfach 96k pro Kanal.

    Liege ich mit meinem Ansatz richtig?

    Nein. Um die Spieldauer eines mp3-Stücks zu bestimmen, hast du in der Praxis keine andere Chance, als die mp3-Datenblöcke zu parsen.

    Hat der header einer mp3 immer dieselbe Größe?

    Der Frame-Header ja, der Datei-Header auch - nämlich Null.

    Ist für den id3-Tag eine feste Größe reserviert?

    Ja, ID3v1 hat eine feste Länge (den genauen Wert finde ich auf die Schnelle nicht), ID3v2 kann aber (fast) beliebig groß werden.

    So long,
     Martin

    --
    Programmierer (m), seltener auch P~in (w):
    Irdische, i.a. humanoide Lebensform, die in einem komplizierten biochemischen Prozess Kaffee, Cola und Pizza in maschinenlesbaren Programmcode umwandelt.
    P~ bilden gelegentlich mit ihresgleichen kleine Gruppen, sogenannte Communities, sind aber ansonsten meist scheue Einzelgänger.
    P~ sind vorwiegend nachtaktiv und ohne technische Hilfsmittel nur eingeschränkt lebensfähig.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(