MP3

Mar. 9th, 2011 05:41 pm
thedeemon: (Default)
[personal profile] thedeemon
Многие знают (или догадываются), что поток MP3 состоит из последовательности пакетов (фреймов), каждый из которых кодирует ровно 1152 сэмпла исходного звука. Каждый пакет состоит из заголовка (4 байта) и пожатых данных. Длина пакета может быть весьма разнообразной, но она нигде не хранится. Она вычисляется по данным из заголовка. Чтобы ее узнать, надо всего лишь: взять из заголовка два бита, описывающие версию формата, два бита, описывающие частоту сигнала, четыре бита, описывающие битрейт, и один бит, описывающий паддинг. Затем под двум битам частоты взять ее значение из таблички, но если версия 2, то частоту разделить на 2, а если версия 0, то частоту разделить на 4. Затем если версия 3, то взять битрейт из одной таблички (используя те 4 бита заголовка в качестве индекса), а если версия не 3, то из другой таблички. Потом, если версия 3, то взять число 144, а если не 3, то взять 72, умножить на битрейт, разделить на частоту и прибавить паддинг (0 или 1). Повторять для каждого пакета, ибо в случае VBR пакеты в потоке разной длины. Получается, что при фиксированных частоте и битрейте энкодер должен вписаться ровно в заданный размер с точностью до двух байтов, а если не вписывается, то жать сильнее и лишнее место забивать мусором. Зато длину не передаем, большая экономия! :) Вот такой замечательный формат, не зря же за его использование лицензионных отчислений просят.

Date: 2011-03-09 10:48 am (UTC)
From: [identity profile] yantayga.livejournal.com
Какой то редкостный изврат с вычислением длины...

Date: 2011-03-09 10:48 am (UTC)
From: [identity profile] vp.livejournal.com
Трындец какой :)

Date: 2011-03-09 11:01 am (UTC)
From: [identity profile] blacklion.livejournal.com
Это всё зато тривиально реализуется в железе. И именно железу был изначально важно строгое попадание в размер фрейма — там было очень малоп амяти.

Date: 2011-03-09 11:11 am (UTC)
From: [identity profile] psilogic.livejournal.com
Хе-хе... нашел у себя кусок кода, который это делает :))

А OGG - тоже извратный. В MP3 хотя бы понятно, как seek делать.

Date: 2011-03-09 11:17 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Я тоже недавно это делал, только пакеты извлекались из получаемого по сети AVI файла. Даже работает.

Date: 2011-03-09 02:24 pm (UTC)
From: [identity profile] nivanych.livejournal.com
Черви ликуют! Хороший формат, да!

Date: 2011-03-09 05:27 pm (UTC)
From: [identity profile] udpn.livejournal.com
Проекции Футамуры, няяя :)

А чо оно не даёт проигрывать до того, как закончится загрузка видео?

ps Хорошее качество, фпс низковат.

Date: 2011-03-09 06:07 pm (UTC)
From: [identity profile] sealcon.livejournal.com
Ого. Знал, что изврат, но не догадывался, что настолько.

Date: 2011-03-09 06:45 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
>не даёт проигрывать

Это был баг. Играло столько, сколько загружено звука (пока не пришел сигнал, что больше звука не будет), что на файлах без звука приводило к неигранию вообще до полной загрузки. Поправил.

FPS - с таким записано само видео. Кодек/плеер может и в несколько раз больший выдавать.

Date: 2011-03-09 07:10 pm (UTC)
From: [identity profile] udpn.livejournal.com
Няяя, хочу опенсорс ;)

Date: 2011-03-09 07:17 pm (UTC)
From: [identity profile] udpn.livejournal.com
Ого, какие люди тут обитают :)

Пользуясь случаем хотел бы передать отдельное спасибо за "Аналогии лгут" и "Экзамены Икена".

Date: 2011-03-09 07:23 pm (UTC)
From: [identity profile] psilogic.livejournal.com
и вам спасибо на добром слове :)

Date: 2011-03-09 11:45 pm (UTC)
From: [identity profile] soonts.livejournal.com
>Зато длину не передаем, большая экономия
Порядка 0.2%: если это поток от которого нет начала а слушаем с середины (судя по тому что из 32 бит заголовка аж 11 всегда заполнены шоб можно было искать фреймы в потоке, это было одним из дизайн-приоритетов), инфу о битрейте+каналах всё равно необходимо иметь в каждом фрейме.

В общем не разделяю твоего скептицизма.
Нормальный формат вполне.
Если посмотришь например как кодируются SMS-ки в сетях GSM (BTW, а GSM кодек для голоса - это вообще пиздец), на microsoft binary xml, или на FAT32 - намного более унылой неочевидной хрени довольно много. Это никак не мешает этим технологиям использоваться чуть менее чем везде.

Причины следующие:
1. Доступность для понимания - обычно на последнем месте в приоритетах (за исключением разработчиков дидактических материалов, конечно). Производительность, надёжность, безопасность - во-первых, время разработки имеющимися в штате людьми - во-вторых, простота на последнем месте.
2. Раньше железки были принципиально менее произвидительными.
3. Почти все распространённые стандарты придуманы в крупных коммерческих компаниях, где достаточно ровно одной их реализации, и только потом они стали открытыми.

Date: 2011-03-09 11:55 pm (UTC)
From: [identity profile] soonts.livejournal.com
4. Backward compatibility: когда чо-то только придумали, невозможно предсказать, чем это станет потом. Например щас посмотрел blizzard retrospective — когда кто-то из разработчиков сказал "однажды у WoW будет миллион подписчивов", над ним посмеялись, щас их 12 миллионов.

Date: 2011-03-10 04:23 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Я с тобой согласен. Пост просто был ответом на этот.

Date: 2011-03-10 04:28 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Этот плеер и vfw кодек (в режиме декодирования) совершенно бесплатны, а исходники доступны всем сильно желающим (готовым заплатить за лицензию :) ).

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 30th, 2026 09:19 am
Powered by Dreamwidth Studios