Определить, является ли файл файлом MP3?

Я пишу библиотеку С++ для декодирования и кодирования звука между разными форматами/кодеками. У меня есть процедура для быстрого определения формата перед загрузкой необходимой библиотеки кодеков.

Для файлов WAV можно просто найти значения ASCII «RIFF» и «WAVE» в начале файла. То же самое относится и к FLAC, мы можем просто прочитать первые 4 байта, которые будут «fLaC».

Но как я могу быстро определить, является ли файл MP3? Я не могу полагаться на расширение файла. Я также не могу попытаться декодировать первый кадр MP3, так как в начале файла могут быть дополнительные данные (например, ID3, обложка и т. д.).


person goocreations    schedule 06.07.2012    source источник


Ответы (1)


Определить, является ли файл MP3, сложнее, чем найти фиксированный шаблон в файле.

Some concepts

(См. http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header для подробностей)

  • Файл MP3 состоит из серии кадров, и каждый кадр имеет заголовок в начале.
  • Заголовок начинается с границы байта с 11-разрядного слова синхронизации, состоящего из единиц. Следовательно, синхрослово либо 0xFFE, либо 0XFFF.
  • Длина каждого кадра рассчитывается на основе параметров заголовка.

Algorithm to determine if a file is MP3 or not

  • Найдите слово синхронизации в файле (0xFFF или 0xFFE).
  • Разобрать параметры заголовка.
  • Определите длину кадра, используя параметры заголовка.
  • Перейти к следующему кадру, используя длину кадра.
  • Если вы найдете другое слово синхронизации после поиска, то файл в основном представляет собой файл MP3.
  • Чтобы быть уверенным, повторите процесс, чтобы найти N последовательных кадров MP3. N может быть увеличено для лучшей скорости попадания.
person Oak Bytes    schedule 06.07.2012