2012-07-06 24 views
9

Estoy escribiendo una biblioteca C++ para decodificar y codificar audio entre diferentes formatos/códecs. Tengo una rutina para detectar rápidamente el formato antes de cargar la biblioteca de códec requerida.Detectar si el archivo es MP3

Para los archivos WAV, puede buscar los valores ASCII "RIFF" y "WAVE" al principio del archivo. Lo mismo se aplica a FLAC, simplemente podemos leer en los primeros 4 bytes, que serán "fLaC".

Pero, ¿cómo puedo detectar rápidamente si un archivo es MP3? No puedo confiar en la extensión de archivo. Tampoco puedo intentar decodificar el primer fotograma de MP3, ya que podría haber datos adicionales al comienzo del archivo (por ejemplo: ID3, imagen de portada, etc.).

Respuesta

19

La detección de si un archivo es un MP3 es más complicado que buscar un patrón fijo en el archivo.

Some concepts

(Ver http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header para más detalles)

  • archivo MP3 consiste en una serie de cuadros y cada cuadro tiene una cabecera al principio.
  • El encabezado comienza en un límite de bytes con una palabra de sincronización de 11 bits, que es todo 1s. Por lo tanto, la palabra de sincronización es 0xFFE o 0XFFF.
  • La longitud de cada cuadro se calcula en función de los parámetros del encabezado.

Algorithm to determine if a file is MP3 or not

  • búsqueda de la palabra de sincronización en el archivo (o 0xFFF 0xFFE).
  • Analice los parámetros del encabezado.
  • Determine la longitud del marco utilizando los parámetros del encabezado.
  • Busca el siguiente cuadro utilizando la longitud del cuadro.
  • Si encuentra otra palabra de sincronización después de buscar, entonces el archivo es principalmente un archivo MP3.
  • Para estar seguro, repita el proceso para encontrar N cuadros de MP3 consecutivos. N se puede aumentar para obtener una mejor tasa de acierto.
-3

Acabo de verificar la firma como en su prueba de onda y flac existente.
un archivo MP3 should have this in hex:
0x49, 0x44, 0x33
funciona para algunos de los archivos que tenía. No estoy seguro de si funciona en cualquier circunstancia, por lo que puede ser necesaria una solución más compleja como la respuesta de Oak Bytes.

+2

La secuencia de bytes que sugiere ('I'''''''') es parte del encabezado de una etiqueta de metadatos ID3 (v2) pero no todos los archivos MP3 tendrán etiquetas ID3v2 (y una etiqueta ID3v2.4 podría ser al final del archivo en lugar de al principio). – Deltics

Cuestiones relacionadas