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