Определить, является ли файл файлом 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.