Вътре в MP3

данни

Веднъж трябваше да реша проста (както ми се стори тогава) задача - да разбера продължителността на mp3 файл в PHP скрипт. Чух за ID3 тагове и веднага си помислих, че информацията за продължителността се съхранява или в таговете, или в заглавките на mp3 файла. Повърхностните търсения в Интернет показаха, че за няколко минути няма да работи за решаване на този проблем. Тъй като по природа съм доста любопитен и времето не изтичаше, реших да не използвам инструменти на трети страни, а да разбера сам един от най-популярните формати.

Ако ви интересува какво има вътре - добре дошли в котката (трафик).

В тази статия няма да се спираме на извличането на ID3v2 тагове - това може да бъде извадено в отделна статия, тъй като там има различни нюанси. А също и върху фрагменти от заглавки, които практически не се използват в момента (например частта за акцентиране на заглавката на mp3-кадъра). Освен това не вземаме предвид структурата на самите аудио данни – тези, които чуваме от високоговорителите.

ID3 (от Identify a MP3) е форматът на метаданни, който най-често се използва в MP3 аудио файлове. ID3 подписът съдържа данни за името на песента, албума, името на изпълнителя и т.н., които се използват от мултимедийни плейъри и други програми, както и хардуерни плейъри, за показване на информация за файла и автоматично организиране на аудио колекцията.

Има две напълно различни версии на ID3 данни: ID3v1 и ID3v2.

байта

На всички бързо стана ясно, че 128 байта са много малко място за съхранение на такива данни. И затова с течение на времето се появи втората версия на данните и се използва успешно -ID3v2. За разлика от първата версия, маркерите v2 имат променливадължина и поставен в началото на файла, за да поддържа поточно предаване. (Форматът ID3v2.4 също ви позволява да съхранявате данни в края на файла). ID3v2 данните се състоят от заглавка и последващи ID3v2 рамки. Например в ID3v2.3 има над 70 типа рамки.

байта
  • маркерътвинаги е 'ID3'
  • В момента има триверсииID3v2.2, ID3v2.3 и ID3v2.4 V2.2 се счита за остаряла. v2.3 е най-популярната версия. v2.4 - набира популярност. Една разлика от v2.3 е, че позволява UTF-8 кодиране (не само UTF-16)
  • Знамена. В момента се използват само три (5,6,7) бита: bin: %abc00000 a 'unsynchronization' - използва се само с MPEG-2 и MPEG-2.5 формати. b „Разширен хедър“ – показва наличието на разширен хедър с „Експериментален индикатор“ – експериментален индикатор
  • Дължина. Особеността на определянето на дължината на данните ID3v2 е, че във всеки байт 7-ият бит не се използва и винаги е зададен на 0.
Разгледайте пример:

вътре

В този случай, заедно с ID3v2 заглавието (10 байта), ID3v2 данните заемат 1024 байта.

ID3v2 заглавката е последвана от действителните тагове. Подробен анализ на четенето на ID3v2 тагове, както беше споменато по-горе, реших да не включвам в тази статия.

Сега имаме информация за наличието и дължината на ID3 таговете и можем да започнем да анализираме mp3 рамката и да разберем къде се съхранява продължителността. И в същото време разбирайте всичко останало.

Целият mp3 файл се състои от кадри, които могат да бъдат извлечени само последователно. Рамката съдържа заглавие и аудио данни. Тъй като не си поставяме за цел да напишем фърмуер за магнетофон, ние се интересуваме от заглавката на рамката.

За негоповече (куп таблици и суха информация)

Размерът на заглавката е 4 байта.

Режими на компресиране на данни или какъв е битрейтът

Има 3 режима на компресиране на данни:

CBR(постоянен битрейт) – постоянен битрейт. Не се променя през цялата песен.

VBR(променлив битрейт) – променлив битрейт. С тази компресия битрейтът постоянно се променя по време на песента.

ABR(среден битрейт) – среден битрейт. Тази концепция се използва само при кодиране на файл. "Изходът" е файл с VBR.

Продължителност = Размер на аудиоданните/битрейт (в битове!) * 8

Например файлът е с размер 350670 байта. Има > Продължителност = 349518 / 96000 * 8 = 29,1265 = 29 секунди

Необходимо е да се обясни - как да се определи режимът на компресия. Всичко е просто. Ако файлът е компресиран с VBR, тогава се добавя VBR заглавка. По наличието му можем да разберем, че се използва променлив битрейт. Има два вида заглавки: Xing и VBRI. Xing се поставя с отместване от началото на първия mp3 кадър в позицията според таблицата:

Например: имаме > VBRI хедърът винаги се поставя на +32 байта отместване от началото на първия mp3 кадър.

Първите четири байта в двете заглавки съдържат маркера „Xing“ или „Info“ за Xing. И „VBRI“ за VBRI.

Ще говоря само за това, което ни интересува в момента. А именно броя на кадрите (Number of Frames). Този номер е с дължина 4 байта. Заглавката на Xing го съдържа на отместване +8 байта от началото на заглавката. Във VBRI, +14 байта от началото на заглавката.

Използвайки таблицата Sampler Per Frame, можем да получим продължителността на mp3 файл, кодиран с променлив битрейт.

данни

Продължителност = Брой кадри * Извадки на кадър / Честота на извадка

Например: от заглавката на VBRI получихме броя кадри 1118, проби на кадър = 1152. Честота на дискретизация = 44100. Продължителност = 1118 * 1152 / 44100 = 29,204 = 29 секунди. Това е всичко за днес. Ако е било полезно на някого -благодаря.

За тези, които искат веднага да се разровят във вътрешностите на mp3 - Ето php скрипта, който написах за себе си едновременно с тази статия и четири малки mp3 файла за тестване.