M3D-Format

Aus PyroNeo Wiki
Zur Navigation springenZur Suche springen

Das Audiomodul wäre zwar in der Lage, MP3-Dateien auch ohne Konvertierung abzuspielen, dies bringt jedoch das Problem mit sich, dass bei einer abrupten Änderung der Showzeit (z.B. ein Fortsetzen der Show an einer anderen Stelle nach einer Pause) die exakte Position für die Fortsetzung der Musik innerhalb der Datei nicht angesprungen werden könnte. Daher kann mit dem Audiomodul nur das M3D-Format, eine um zusätzliche Informationen ergänzte MP3-Datei, abgespielt werden. Dieses Format behebt die angesprochene Schwäche des MP3-Formats und erlaubt ein sehr schnelles, wahlfreies Springen innerhalb der Musik auf ca. 50 Millisekunden genau. Eine M3D-Datei kann aus einer MP3-Datei mittels eines Umwandlungstools erzeugt werden.

Technischer Hintergrund

Aufbau einer MP3-Datei

Eine MP3-Datei besteht aus sogenannten Frames. Jeder Frame enthält Audioinformationen einer bestimmten Länge, beim MPEG 1, Layer 3-Format sind das je nach Sampling-Rate 24 oder 26,1 Millisekunden. Jeder Frame ist (mehr oder weniger) ohne die vorherigen Frames der Datei abspielbar, so dass ein Wiedereinsetzen innerhalb der Datei innerhalb von +/- ca. 25 Millisekunden kein Problem darstellt. Ein größeres Problem ist es, die korrekte Position innerhalb der Datei aufzufinden. MP3-Frames enthalten leider keine absolute Information darüber, an welcher zeitlichen Position innerhalb der Datei sie abgespielt werden müssen. Die Tatsache, dass jeder Frame - je nach Bitrate bei VBR - unterschiedlich lang sein kann, erschwert das Auffinden der korrekten Abspielposition innerhalb der Datei zusätzlich.

Um die korrekte Position zu finden, müsste die Datei letztendlich also von vorne beginnend durchsucht werden. Jeder Frame müsste gelesen und analysiert werden, um die Abspielzeit des jeweils nächsten Frames korrekt ermitteln zu können. Dies würde einem "schnellen Vorspulen" innerhalb der Datei gleichkommen und bei einer maximalen Datenrate für das Lesen der MP3-Dateien bei z.B. einer 15-minütigen MP3 mit 128 kBit/Sekunde ca. 36 Sekunden dauern - und das nur für einen einzigen Sprung! Für ein Feuerwerk wäre eine Sprungdauer von unter einer Sekunde vielleicht gerade noch akzeptabel - 36 Sekunden machen diese Methode jedoch absolut unmöglich.

M3D-Format

Damit das Audiomodul die Informationen über einen Sprung auch nicht vor der Show in der oben genannten Zeit aus den Dateiinformationen auslesen und sich merken muss, wird genau diese Information über die Position der einzelnen Frames innerhalb der Datei im M3D-Format vor die eigentlichen Musikdaten geschrieben. Den MP3-Daten wird also ein aus den Musikdaten berechneter "Bootstrap-Bereich" hinzugefügt, der es ermöglicht jeden Frame innerhalb von unter einer Millisekunde aufzufinden.

Format einer M3D-Datei

Alle Angaben innerhalb der Datei sind in Big Endian notiert.


Header

Vor den eigentlichen Positionsinformationen befindet sich ein Header, der Informationen über die Samplingrate der Audiodaten und ihren eigentlichen Beginn innerhalb der M3D-Datei angibt:

Feld Länge Beschreibung
ID 4 Byte Konstant "MP3D"
MP3-Offset 4 Byte Offset der MP3-Daten (Position in Bytes, Zählweise von Null beginnend)
Sampling-Rate 2 Byte Samplingrate der MP3-Daten in Samples/Sekunde (44100 oder 48000)
Frame-Anzahl 4 Byte Absolute Länge der Datei in Frames
(Reserviert) 2 Byte Dieses Feld wird z.Zt. nicht benutzt. Bitte für Kompatibilität mit späteren Versionen mit Nullbytes füllen.
Gesamt 16 Byte

Datenbereich

Für jeden Frame der MP3-Datei folgt nun seine Position innerhalb der MP3-Datei (also relativ zum Beginn der originalen Audio-Informationen), als 32 Bit-Wert (ebenfalls Big Endian) kodiert. Über diese Information kann jeder Frame anschließend direkt und genau angesprungen werden.

Audio-Daten (originale MP3)

Anschließend wird die originale MP3 1:1 angehängt. Die Byte-Position innerhalb der Datei muss dem Eintrag im Feld MP3-Offset entsprechen (Zählweise ab Null).