MP3 MPEG Frames - So ermittelt man die Spielzeit

MP3 MPEG Frames - So ermittelt man die Spielzei 4.2857142857143 von 5 mit 7 Stimmen
| Sick^

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Werbung
Wer die Spielzeit, die Bitrate oder die Samplerate einer MP3 auslesen möchte, kommt nicht drum herum die MPEG Frames zu analysieren. Die MPEG Frames enthalten den wahren Inhalt, die Audiodaten (Samples), einer MP3 Datei. Aus ihnen werden die Töne erzeugt die man hört.

Die ominösen MPEG Frames

Sie beinhalten wichtige Informationen wie die Bit- und Samplerate der MP3 Datei.
Nur mit diesen Informationen können wir am Ende die Spielzeit einer MP3 Datei berechnen.
Näheres zu der Struktur findet ihr auf mpgedit.org.
Wir werden, wie in meinem Artikel über die ID3 Tags, die gleiche sample.mp3 benutzen.

MPEG Frames bestehen wie die ID3 Tags aus einem Header und einem Body Teil.
Im Header finden wir die für uns relevanten Informationen und im Body befinden sich die Samples, welche uns aber hier nicht interessieren.
Das erste MPEG Frame finden wir ab dem Offset 9244 (ID3 Tags Länge + 10 bytes für den ID3 Header).
Ein MPEG Frame Header besteht aus 4 bytes und ist folgender maßen aufgebaut:
FF FB 90 C4 = 11111111 11111011 10010000 11000100

Quellcode: 'MPEG Frame Header'

  1. 11111111 111 11 bits Sync bits. Haben diese Bits nicht den Wert 1, sind wir an einer falschen Position.
  2. 11 2 bits MPEG Version. Siehe link oben
  3. 01 2 bits Layer
  4. 1 1 bit 1 Wenn geschützt. Dann folgt dem Header eine 4 byte lange CRC Prüfsumme
  5. 1001 4 bits Bitrate index. Siehe link oben
  6. 00 2 bits Samplerate index. Siehe link oben
  7. 0 1 bit Padding zwischen den Frames (Layer)
  8. 0 1 bit Privat flag. Wird kaum benutzt
  9. 11 2 bits Channel
  10. 00 2 bits Erweiterung. Siehe link oben
  11. 0 1 bit Kopierschutz
  12. 1 1 bit Original
  13. 00 2 bits Schwerpunkt
Alles anzeigen

Analysieren des Frames

Wie man an diesem Frame eventuell erkennen kann, beinhalten die MPEG Frames nicht direkt die Bit- und Samplerate.
Zumindest scheint eine Bitrate von 9 (1001 binär) kbit/s nicht sehr realistisch.
Das liegt daran das die MPEG Frames nur die Indizes enthalten welche auf vordefinierte Tabellen passen.
Die Tabellen dafür findet ihr im obigen Link.
Um an die wirkliche Bit- und Samplerate zu kommen benötigen wir die MPEG Version und den Layer.
Dieses Frame benutzt die MPEG Version 1 und den Layer 3.
Achtung auch hier sind die Werte nur Indizes für vordefinierte Tabellen.
Mit Hilfe unserer MPEG Version 1, dem Layer 3 und dem Index der Bitrate 1001(binär) = 9(dezimal) gucken wir in eine Bitrate Tabelle und finden unsere Bitrate von 128 Kilobit / Sekunde.
Die Samplerate finden wir, mit der MPEG Version 1 und dem Index der Samplerate 0, in der Samplerate Tabelle, welche uns einen Wert von 44100 Hz aufzeigt.
Die Länge eines MPEG Frames können wir mit diesen Werten und folgenden Formeln berechnen:

Quellcode

  1. Wenn Layer 1
  2. frameLength = (12 * bitRate / sampleRate + padding) * 4;
  3. Wenn Layer 2 oder 3
  4. frameLength = 144 * bitRate / sampleRate + padding;

MPEG Frames hin oder her... ich brauche die Spielzeit!

Nun haben wir die Anzahl der Bytes eines MPEG Frames inclusive der 4 Bytes des Headers.
Jetzt müssen wir die Header jedes Frames auslesen und Durchschnittswerte bilden.
Den Body könnt ihr einfach überspringen wenn ihr am Ende des Headers (4 bytes) seid newPosition = currentPosition + frameLength - 4.
Wenn wir den Durchschnitt der Bit- und Samplerate aus allen MPEG Frames haben, sind wir in der Lage die Spielzeit einer MP3 Datei zu berechnen.
Wir ermitteln die Datengröße der MPEG Frames in dem wir von der Dateigröße 51488(dezimal) die Größe des ID3 Blocks 9234 + 10(dezimal) abziehen.
Nun ermitteln wir den Bytes pro Sekunde Wert, indem wir die Bitrate 128 kbit/s mit 1000 multiplizieren, kommen wir von den Kilobits zu Bits.
Diesen Wert dividieren wir noch mit 8 um die Bytes zu erhalten und haben nun einen Wert von 16000 byte/s.
Jetzt wird die Datengröße 42244(dezimal) durch 16000(dezimal) Bytes pro Sekunde geteilt und wir haben einen Wert von 2.6 Sekunden.

Hier nochmal die Rechnung:

Quellcode

  1. dataSize = fileSize - (id3Size + 10);
  2. bytesPerSecond = (bitrate * 1000) / 8;
  3. seconds = dataSize / bytesPerSecond;


Jetzt haben wir die Spielzeit, Bitrate und Samplerate aus den MPEG Frames gelesen.
Diese können wir nun Anzeigen oder mit ihnen z.B. in einem Audio Player arbeiten.
Werbung
    • Euphi -

      Sehr nice! Sowas würde ich mir für den Coding-Bereich wünschen. Vielleicht auch konkrete Projekte.

      • Sick^ -

        In wie fern für den Coding Bereich? Das hier ist auch Coding^^ Wobei mir grade auffällt das die Kategorien weg sind 8|

    • Paragrimm -

      Schöner Artikel, ist sehr informativ und interessant, danke dafür. Ich hoffe, es kommen auch weiterhin so gute Artikel :)!

      • Sick^ -

        Garantiert :) Der nächste ist schon in Arbeit. Er handelt davon wie man mit PHP eine Waveform einer Audiodatei generiert.