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

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

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

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

Ответ 1

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

Some concepts

(Подробнее см. Http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header)

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

Algorithm to determine if a file is MP3 or not

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

Ответ 2

Я просто проверяю подпись, как в вашем существующем тесте волны и flac.
Файл mp3 должен иметь это в шестнадцатеричном формате:
0x49, 0x44, 0x33
Он работает для некоторых файлов, которые у меня были. Я не уверен, что он работает при любых обстоятельствах, поэтому может потребоваться более сложное решение, такое как Oak Bytes.