2012-07-06 25 views
9

Piszę bibliotekę C++ do dekodowania i kodowania dźwięku pomiędzy różnymi formatami/kodekami. Mam procedurę pozwalającą szybko wykryć format przed załadowaniem wymaganej biblioteki kodeków.Wykryj, czy plik jest MP3

Dla WAV pliki można jeden prosty wygląd Wartości ASCII „RIFF” i „fali” na początku pliku. To samo dotyczy FLAC, możemy po prostu przeczytać w pierwszych 4 bajtach, które będą "fLaC".

Ale jak mogę szybko wykryć, czy plik jest MP3? Nie mogę polegać na rozszerzeniu pliku. Nie mogę również próbować dekodować pierwszej ramki MP3, ponieważ na początku pliku mogą istnieć dodatkowe dane (np. ID3, obraz okładki itp.).

Odpowiedz

19

Wykrywanie jeśli plik jest MP3 jest bardziej skomplikowana niż szukając stałego wzorca w pliku.

Some concepts

(Zobacz http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header dla szczegółów)

  • plik MP3 składa się z szeregu klatek i każda klatka ma nagłówek na początku.
  • Nagłówek rozpoczyna się na granicy bajtowej z 11-bitowym słowem synchronizacji, które jest wszystkie 1s. Stąd słowo synchronizacji to 0xFFE lub 0XFFF.
  • Długość każdej klatki jest obliczana na podstawie parametrów nagłówka.

Algorithm to determine if a file is MP3 or not

  • Szukaj w Słowo Synchronizacyjne w pliku (0xFFF lub 0xFFE).
  • Analiza parametrów nagłówka.
  • Ustal długość ramki za pomocą parametrów nagłówka.
  • Przejść do następnej klatki używając długości ramki.
  • Po znalezieniu innego syncword, plik jest w większości plikiem MP3.
  • Dla pewności, powtórz proces, aby znaleźć N kolejnych ramek MP3. N można zwiększyć, aby uzyskać lepsze trafienie.
-3

Właśnie sprawdzam podpis tak, jak w twoim obecnym teście fali i flacu.
plik MP3 should have this in hex:
0x49, 0x44, 0x33
To działa dla niektórych plików miałem. Nie jestem pewien, czy działa we wszystkich okolicznościach, więc może być wymagane bardziej złożone rozwiązanie, takie jak odpowiedź Oak Bytes.

+2

Sekwencja bajt proponujesz ('' d' I' '3') jest częścią nagłówka dla ID3 (v2) metadane tag ale nie wszystkie pliki MP3 będą mieć tagów ID3v2 (oraz tag ID3v2.4 mógłby być na końcu pliku, a nie na początku). – Deltics

Powiązane problemy