2012-07-06 21 views
9

Sto scrivendo una libreria C++ per decodificare e codificare l'audio tra diversi formati/codec. Ho una routine per rilevare rapidamente il formato prima di caricare la libreria di codec richiesta.Rileva se il file è MP3

Per i file WAV è possibile cercare i valori ASCII "RIFF" e "WAVE" all'inizio del file. Lo stesso vale per FLAC, possiamo semplicemente leggere i primi 4 byte, che saranno "fLaC".

Ma come posso rilevare rapidamente se un file è MP3? Non posso fare affidamento sull'estensione del file. Inoltre, non posso provare a decodificare il primo frame MP3, poiché potrebbero esserci ulteriori dati all'inizio del file (ad es. ID3, immagine di copertina, ecc.).

risposta

19

Rilevare se un file è un MP3 è più complicato della ricerca di uno schema fisso nel file.

Some concepts

(Vedi http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header per i dettagli)

  • di file MP3 consiste in una serie di fotogrammi e ogni fotogramma ha un colpo di testa all'inizio.
  • L'intestazione inizia a un limite di byte con una parola di sincronizzazione a 11 bit, che è tutto 1s. Quindi la parola di sincronizzazione è 0xFFE o 0XFFF.
  • La lunghezza di ciascun frame viene calcolata in base ai parametri dell'intestazione.

Algorithm to determine if a file is MP3 or not

  • Cercare lo syncword nel file (o 0xFFF 0xFFE).
  • Analizzare i parametri dell'intestazione.
  • Determinare la lunghezza della trama utilizzando i parametri dell'intestazione.
  • Cercare il fotogramma successivo utilizzando la lunghezza del fotogramma.
  • Se dopo aver cercato un'altra parola chiave di ricerca, il file è principalmente un file MP3.
  • Per sicurezza, ripetere la procedura per trovare N frame MP3 consecutivi. N può essere aumentato per un migliore tasso di successo.
-3

Ho appena controllato la firma come nel vostro test wave e flac esistente.
un file MP3 should have this in hex:
0x49, 0x44, 0x33
Si lavora per alcuni dei file che ho avuto. Non sono sicuro che funzioni in tutte le circostanze, quindi potrebbe essere necessaria una soluzione più complessa come la risposta di Oak Bytes.

+2

La sequenza di byte suggerita ('I'' D' '3') fa parte dell'intestazione per un tag di metadati ID3 (v2) ma non tutti i file MP3 avranno tag ID3v2 (e un tag ID3v2.4 potrebbe essere alla fine del file piuttosto che all'inizio). – Deltics