MP3 MPEG Frames - So ermittelt man die Spielzeit


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

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:

Code
  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:

Code
  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.

    Teilen

    Kommentare