Получение длительности MP3-файлов на Ассемблере
Получение длительности MP3-файлов на Ассемблере
Вот и анонсированная ранее "другая история" про некорректное определение длительности MP3-файлов при использовании системных функций. При тестировании своих программ я нашел уже несколько таких файлов. Что интересно, на ошибочный результат размер файлов не влияет, это, как мне кажется, происходит из-за очень упрощенного расчета, который используется системой. Расчехляем Ассемблер, будем парсить внутреннюю структуру MP3 самостоятельно.
Сперва немного теории. Если упрощенно, то MP3-файл состоит из уже известных вам метаданных и, собственно, закодированных музыкальных данных. Музыкальные данные, в свою очередь, состоят из отдельных фреймов. Каждый фрейм может иметь различный битрейт или же битрейт может быть постоянный для всего файла. Формула для расчета длительности MP3-файла очень простая:
Длительность = Размер данных / Средний битрейт * 8
Осталось только узнать размер данных и битрейт. Для грубого подсчета размер данных можно принять как размер файла за вычетом размера метаданных в начале и в конце, если они там присутствуют. Теперь битрейт. Для этого надо разобрать 4-байтный заголовок самого первого аудиофрейма. Формат заголовка аудиофрейма хорошо описан здесь. Из битов заголовка в первую очередь извлекаем значение индексов версии MPEG и версии Layer, на основе этих значений в дальнейшем будем получать нужные значения. Например, битрейт можно посмотреть по следующей табличке, ориентируясь на значение индекса из заголовка.
Битрейт | |||||
---|---|---|---|---|---|
Индекс | MPEG 1 | MPEG 2, MPEG 2.5 | |||
Layer I | Layer II | Layer III | Layer I | Layer II, III | |
0000 | не используется | ||||
0001 | 32 | 32 | 32 | 32 | 8 |
0010 | 64 | 48 | 40 | 48 | 16 |
0011 | 96 | 56 | 48 | 56 | 24 |
0100 | 128 | 64 | 56 | 64 | 32 |
0101 | 160 | 80 | 64 | 80 | 40 |
0110 | 192 | 96 | 80 | 96 | 48 |
0111 | 224 | 112 | 96 | 112 | 56 |
1000 | 256 | 128 | 112 | 128 | 64 |
1001 | 288 | 160 | 128 | 144 | 80 |
1010 | 320 | 192 | 160 | 160 | 96 |
1011 | 352 | 224 | 192 | 176 | 112 |
1100 | 384 | 256 | 224 | 192 | 128 |
1101 | 416 | 320 | 256 | 224 | 144 |
1110 | 448 | 384 | 320 | 256 | 160 |
1111 | не используется |
Самым правильным способом вычисления длительности MP3-файла будет последовательный перебор всех фреймов. Для каждого фрейма получаем его битрейт и размер, параллельно подсчитывая общее количество фреймов. Размеры всех фреймов суммируем, тем самым получая размер аудиоданных, значения битрейта также суммируются, затем вычисляется среднее значение битрейта. Подставляем найденные значения в формулу и получаем длительность звучания в секундах.
Для определения размера аудиофрейма используется следующая формула:
Размер фрейма = ((Сэмплов на фрейм / 8 * Битрейт) / Частота) + Дополнение
Битрейт нам уже известен, частота и количество сэмплов на фрейм определяется по следующим табличкам на основании индексов версии MPEG и версии Layer:
Частота | |||
---|---|---|---|
Индекс | MPEG 1 | MPEG 2 | MPEG 2.5 |
00 | 44100 Hz | 22050 Hz | 11025 Hz |
01 | 48000 Hz | 24000 Hz | 12000 Hz |
10 | 32000 Hz | 16000 Hz | 8000 Hz |
11 | не используется |
Сэмплов на фрейм | |||
---|---|---|---|
Версия | MPEG 1 | MPEG 2 | MPEG 2.5 |
Layer I | 384 | 384 | 384 |
Layer II | 1152 | 1152 | 1152 |
Layer III | 1152 | 576 | 576 |
Размер дополнения вычисляется по нескольким параметрам. Само его наличие определяется значением Padding bit из заголовка, а размер зависит от индекса версии Layer. Для Layer I дополнение будет равно 4 байтам, для всех остальных версий - 1 байт.
Определив размер аудиофрейма, переходим к следующему. Обязательно надо проверять корректность заголовка фрейма и правильно обрабатывать ситуацию, когда фактический размер последнего фрейма будет меньше расчетного. Такая ситуация вполне возможна и встречается на практике.
В приложении пример программ с исходными текстами, одна из которых определяет длительность MP3-файла, а вторая показывает информацию из заголовка первого аудиофрейма.
Просмотров: 800 | Комментариев: 0
Метки: Assembler, мультимедиа
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария