lucky_Luk Цитата: Объясните чайнику что из себя представляет кодек как таковой. По-моему это что-то вроде архиватора для музыки - файл ведь становится меньше. Только есть кодеки которые, архивируют как надо - когда распакованный файл полностью соответствует оригиналу (loseless). А есть другие - которые для уменьшения размера файла что-то где-то ему обрезают (lossy) - тогда распакованный файл оригиналу не соответствует.
Не совсем. Архив, как правило - это цельный массив, чтобы извлечь отдельный его фрагмент - требуется обработать алгоритмом распаковки его весь или как минимум значительную часть, содержащую достаточно информации для извлечения нужного фрагмента, причем зачастую при этом извлекается масса информации, которая нам не нужна. Тем более, для использования всех данных требуется восстановить весь исходный материал целиком, соответственно заняв под него место на диске.
Правда, скажем WinRAR одно время позволял т.н. мультимедиа-сжатие - не уверен, возможно имелось в виду потоковое сжатие, а может быть - алгоритм оптимизированный для сжатия мультимедийных данных.
Что касается мультимедиа, то здесь применяется потоковое сжатие, так чтобы данные можно было считывать и распаковывать последовательно или произвольно вне зависимости от остального массива. Во всех известных технологиях потокового мультимедиа еще на стадии оцифровки (кодирования звука или видео в стандартный несжатый формат, например PCM или RGB) используется принцип "кадров" (frames) - т.е. изображений или образцов звука (samples), снятых определенное число раз в секунду, т.е. с некоторой частотой, которая зависит от конкретного стандарта оцифровки. Например, РСМ (Pulse Code Modulation) в стандарте CDDA (Compact Disc Digital Audio, стандарт обычных звуковых компакт-дисков, соответсвует также аппаратным возможностям звуковых карт Creative Sound Blaster Pro и совместимых) используется частота сэмплов ("снимков" интенсивности звучания в разных полосах частот) 44100Гц, т.е. эти снимки делаются и воспроизводятся 44 тысячи 100 раз в секунду, для кодирования каждого образца используется одно слово (16 бит или условно - 2 байта), причем каждый образец записывается дважды - для левого и правого каналов стереозаписи, для записи в моно сэмплы будут идентичны. Перемножив эти значения - 44100 х 16 х 2 - получим 1411200 бит в секунду, или 1411 кбит/с, что и составляет поток данных для РСМ / CDDA. Для более современных аудиосистем используется HD Audio (High Definition Audio, высококачественное аудио) - до 192 кГц, 24 бит, до 8 каналов, перемножив получим уже 36,864,000 - т.е. 36 мегабит в секунду или 4.36 мегабайта в секунду, т.е. на час записи такого качества потребуется более 15 с половиной гигабайт дискового пространства, в то время как 82 минуты _несжатого_ CDDA умещаются на обычном 700-мегабайтном CD. Что ж, за все хорошее надо платить
В алгоритмах потокового сжатия, как правило, испольуется ряд уловок - например, первый кадр кодируется полностью и называется K(ey)-frame, а последующие (I(ntermediate)-frames, промежуточные кадры) содержит лишь информацию о различии в изображении между текущим кадром, ключевым и/или предыдущим (до следующего ключевого кадра, который вставляется или после превышения максимально допустимого числа промежуточных, или при изменении состава кадра более чем наполовину), при этом кадры разбиваются на макроблоки - 8х8, 16х16 пикселов, внутри них определяются "объекты" (цветовые области) и задаются векторы движения - для того чтобы впоследствии восстановить картинку согласно этой информации, а не сжимать все данные оригинала.
Кажется, что потери будут огромны? Тем не менее, человеческое зрение воспринимает результаты работы алгоритмов сжатия цифрового видео вполне толерантно, особенно если кодек качественный и его настройки грамотно подобраны. Алгоритмы сжатия видео без потерь - например, используемые популярным кодеком HuffYUV - достаточно малоэффективны, и позволяют сжать исходный материал чуть сильнее чем вдвое, в то время как лучшие безпотерьние аудиокодеки вплотную приближаются к возможностям архиваторов... это связано с особенностями представления оцифрованных данных разных типов и разной степенью их неоднородности.
При сжатии аудио с потерями, как правило - выбрасываются все данные, лежащие за пределами частотно-амплитудной кривой восприятия человеческого слуха (это замкнутая область, визуально близкая к овалу), плюс частично "сглаживаются" фрагменты звучания внутри этой области, в целях получения оптимального сжатия (в гибридных форматах действительна только первая часть). Опять же, только искушенный и тренированный слушатель может отличить сжатый с потерями звук от оригинала.
Теперь - к вопросу о том, как работают кодеки, плееры итп.
Кодеки, как таковые (CoDec = Coder + Decoder) - это динамически подключаемые библиотеки (DLL, Dynamic Link Library), содержащие набор функций для сжатия или восстановления данных в или из формата, в котором они хранятся на носителе, из или в формат для потокового воспроизведения (это говоря упрощенно, поскольку к кодекам также условно причисляются фильтры DirectShow - подробнее см. на предыдущей странице). Типичные функции библиотеки кодека -
EncodeFrame() или
DecodeFrame(), надеюсь - пояснять их значение не требуется.
Говоря опять же упрощенно, плеер через свой модуль чтения файлов или приема транслируемых потоков считывает или получает блок данных определенного размера, установленного в его настройках (кэширование итп) или определяемый характеристиками вещательного формата, при необходимости интерпретирует заголовок и определяет, какие модули необходимы для декодирования - для этого, например - используются идентификаторы видеопотока FourCC (четыре символа латинского алфавита и 10 арабских цифр - например, DIVX, DIV3, DX50, XVID, etc.) и HexID для аудиопотоков (из названия видно - шестнадцатиричное число, например 0х80, 0х4Е), дальше читает из реестра информацию об зарегистрированных для этих идентификаторов декодеров по умолчанию (или руководствуется собственной конфигурацией форматов и кодеков), вызывает необходимый модуль и передает ему данные для декодирования, считывает возврат и выводит через интерфейс пользователя.
То, что пропущено в этом объяснении ради упрощения - сплиттинг (разделение или "расплетение" потоков аудио и/или видеоданных внутри потока или файла контейнерного формата - такого как AVI, MKV, OGM, MP4, MOV, etc.). Для сплиттинга зачастую тоже используется специальный модуль, вызываемый перед кодеком.
Подробнее о контейнерных форматах см. на прошлой странице.
Добавлено: Упс, сорри - не на прошлу страницу, тебе вообще-то
сюда, с вопросами типа
Цитата: Объясните чайнику
Надеюсь, понятно что это не в обиду.
Да, а DirectShow-фильтры регятся так:
regsvr32 <filename>.aсм - для аудио;
regsvr32 <filename>.ax - для видео.