2012-07-06 20 views
9

Ich schreibe eine C++ - Bibliothek für die Decodierung und Codierung von Audio zwischen verschiedenen Formaten/Codecs. Ich habe eine Routine, um das Format vor dem Laden der erforderlichen Codec-Bibliothek schnell zu erkennen.Erkennen, ob Datei MP3 ist

Für WAV-Dateien kann man am Anfang der Datei einfach nach den ASCII-Werten "RIFF" und "WAVE" suchen. Das gleiche gilt für FLAC, wir können einfach die ersten 4 Bytes einlesen, die "fLaC" sein werden.

Aber wie kann ich schnell erkennen, wenn eine Datei MP3 ist? Ich kann mich nicht auf die Dateierweiterung verlassen. Ich kann auch nicht versuchen, den ersten MP3-Frame zu dekodieren, da am Anfang der Datei eventuell weitere Daten liegen (zB: ID3, Titelbild, etc).

Antwort

19

Das Erkennen, ob eine Datei eine MP3 ist, ist komplizierter als die Suche nach einem festen Muster in der Datei.

Some concepts

(Siehe http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header für Details)

  • MP3-Datei besteht aus einer Reihe von Rahmen und jeder Rahmen hat am Anfang einen Header.
  • Header beginnt an einer Byte-Grenze mit einem 11-Bit-Sync-Wort, das alle 1s ist. Daher ist das Sync-Wort entweder 0xFFE oder 0XFFF.
  • Die Länge jedes Frames wird basierend auf den Header-Parametern berechnet.

Algorithm to determine if a file is MP3 or not

  • Suche nach dem Synchronisationswort in der Datei (0xFFF oder 0xFFE).
  • Parsen Sie die Header-Parameter.
  • Bestimmen Sie die Rahmenlänge mithilfe der Header-Parameter.
  • Suchen Sie mit der Rahmenlänge zum nächsten Rahmen.
  • Wenn Sie nach dem Suchen ein anderes Syncword finden, ist die Datei meistens eine MP3-Datei.
  • Um sicher zu sein, wiederholen Sie den Vorgang, um N aufeinanderfolgende MP3-Frames zu finden. N kann für eine bessere Trefferquote erhöht werden.
-3

Ich überprüfe einfach die Signatur wie in Ihrem bestehenden Wave und Flac-Test.
eine MP3-Datei should have this in hex:
0x49, 0x44, 0x33
Es funktioniert für einige der Dateien, die ich hatte. Ich bin nicht sicher, ob es unter allen Umständen funktioniert, so dass eine komplexere Lösung wie die Antwort von Oak Bytes erforderlich sein kann.

+2

Die vorgeschlagene Byte-Sequenz ('I'' D' '3') ist Teil der Kopfzeile für ein ID3 (v2) -Metadaten-Tag, aber nicht alle MP3-Dateien haben ID3v2-Tags (und ein ID3v2.4-Tag könnte sein am Ende der Datei statt am Anfang). – Deltics