Blog. Just Blog

Получение длительности MP3-файлов на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Получение длительности MP3-файлов на Ассемблере
Получение длительности MP3-файлов на Ассемблере

Вот и анонсированная ранее "другая история" про некорректное определение длительности MP3-файлов при использовании системных функций. При тестировании своих программ я нашел уже несколько таких файлов. Что интересно, на ошибочный результат размер файлов не влияет, это, как мне кажется, происходит из-за очень упрощенного расчета, который используется системой. Расчехляем Ассемблер, будем парсить внутреннюю структуру MP3 самостоятельно.

Сперва немного теории. Если упрощенно, то MP3-файл состоит из уже известных вам метаданных и, собственно, закодированных музыкальных данных. Музыкальные данные, в свою очередь, состоят из отдельных фреймов. Каждый фрейм может иметь различный битрейт или же битрейт может быть постоянный для всего файла. Формула для расчета длительности MP3-файла очень простая:

Длительность = Размер данных / Средний битрейт * 8
Осталось только узнать размер данных и битрейт. Для грубого подсчета размер данных можно принять как размер файла за вычетом размера метаданных в начале и в конце, если они там присутствуют. Теперь битрейт. Для этого надо разобрать 4-байтный заголовок самого первого аудиофрейма. Формат заголовка аудиофрейма хорошо описан здесь. Из битов заголовка в первую очередь извлекаем значение индексов версии MPEG и версии Layer, на основе этих значений в дальнейшем будем получать нужные значения. Например, битрейт можно посмотреть по следующей табличке, ориентируясь на значение индекса из заголовка.

Битрейт
ИндексMPEG 1MPEG 2, MPEG 2.5
Layer ILayer IILayer IIILayer ILayer II, III
0000не используется
0001323232328
00106448404816
00119656485624
010012864566432
010116080648040
011019296809648
01112241129611256
100025612811212864
100128816012814480
101032019216016096
1011352224192176112
1100384256224192128
1101416320256224144
1110448384320256160
1111не используется

Самым правильным способом вычисления длительности MP3-файла будет последовательный перебор всех фреймов. Для каждого фрейма получаем его битрейт и размер, параллельно подсчитывая общее количество фреймов. Размеры всех фреймов суммируем, тем самым получая размер аудиоданных, значения битрейта также суммируются, затем вычисляется среднее значение битрейта. Подставляем найденные значения в формулу и получаем длительность звучания в секундах.

Для определения размера аудиофрейма используется следующая формула:

Размер фрейма = ((Сэмплов на фрейм / 8 * Битрейт) / Частота) + Дополнение
Битрейт нам уже известен, частота и количество сэмплов на фрейм определяется по следующим табличкам на основании индексов версии MPEG и версии Layer:

Частота
ИндексMPEG 1MPEG 2MPEG 2.5
0044100 Hz22050 Hz11025 Hz
0148000 Hz24000 Hz12000 Hz
1032000 Hz16000 Hz8000 Hz
11не используется

Сэмплов на фрейм
ВерсияMPEG 1MPEG 2MPEG 2.5
Layer I384384384
Layer II115211521152
Layer III1152576576

Размер дополнения вычисляется по нескольким параметрам. Само его наличие определяется значением Padding bit из заголовка, а размер зависит от индекса версии Layer. Для Layer I дополнение будет равно 4 байтам, для всех остальных версий - 1 байт.

Определив размер аудиофрейма, переходим к следующему. Обязательно надо проверять корректность заголовка фрейма и правильно обрабатывать ситуацию, когда фактический размер последнего фрейма будет меньше расчетного. Такая ситуация вполне возможна и встречается на практике.

В приложении пример программ с исходными текстами, одна из которых определяет длительность MP3-файла, а вторая показывает информацию из заголовка первого аудиофрейма.

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

MP3.Duration.Demo.zip (316,090 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 800 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0075 сек.) / Память: 4.5 Mb
Наверх