From e9f9652be87235d17d29e5833773a626bc88a7f9 Mon Sep 17 00:00:00 2001 From: ElectronixTM Date: Sat, 9 Nov 2024 23:56:38 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=80=D0=B0=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BB=20MPEG=20=D0=B8=20M-JPEG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Глава 2. Виды данных, их кодирование, команды.md | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/Дополнительно/Глава 2. Виды данных, их кодирование, команды.md b/Дополнительно/Глава 2. Виды данных, их кодирование, команды.md index 9ffe54b..8c8a427 100644 --- a/Дополнительно/Глава 2. Виды данных, их кодирование, команды.md +++ b/Дополнительно/Глава 2. Виды данных, их кодирование, команды.md @@ -14,6 +14,7 @@ source: ### Форматы для хранения графических данных ### Краткая характеристика наиболее распространенных растровых форматов +## Всякие там алгоритмы сжатия ### Алгоритмы сжатия без потерь Неплохое видео: https://www.youtube.com/watch?v=CJFUN6BrkGE @@ -147,5 +148,45 @@ JPEG - формат хранения изображения с потерями. 5. После того, как мы писали этот ужас мы сжимаем его страшной помесью Хаффмана и RLE. Описывать я это дело пожалуй не буду, просто скажу, что таблицы для алгоритма Хаффмана построены заранее. В целом этот алгоритм позволяет сжимать изображения в десятки раз. (вплоть до 50-кратного уменьшения размера) - - \ No newline at end of file + +Повторим еще раз идейно наши шаги: + +```mermaid +graph TD; + convert(Перекодировать цвета, чтобы появился явный параметр яркости)-->resize(Выкинуть часть информации о цвете, которую глаз не заметит); + resize-->split(разбить изображения по каналам, а содержимое каналов поделить на группы по 8х8 для цветов и по 16х16 для яркости); + split-->DCT(Выявить какие узоры из числа заранее известных 64-х в каких пропорциях присутствуют в группах); + DCT-->clean(выкинуть все несущественные узоры); + clean-->compress(Оставшиеся коэффициенты матрицы компактно упаковать); + compress-->Готово!; +``` + +### MPEG + +*Сжимаем видео* + +Фактически базируется на JPEG и разделяет с ним идеи. Помимо них добавляется еще одна: + +- Между двумя отдельными кадрами видео изменения как правило малы + +Краеугольным камнем всего формата являются кадры двух типов: I - кадры, сжатые полноценно и независимо, и P - кадры, которые построены с ссылкой на предыдущий) + +В целом уже довольно сильное сжатие можно было бы достичь и этим, но мы пошли чуть дальше и ввели категорию B - кадры, которые ссылаются на следующий и предыдущий кадры. В реализациях классического MPEG алгоритма они вообще просто генерируются на основании двух ближайших кадров категорий I и P. Обычно являются неким "средним арифметическим" между этими двумя кадрами. на эту категорию ничего не ссылается + +Примерное кодирование выглядит так: нeзависимо кодируется кадр видео целиком. Обычно кодируются каждый пол секунды видео. Затем если мы говорим про частоту кадров в 24 кадра/секунду, то на равных промежутках вставляется еще 3 кадра категории P. Они кодируются, как и было сказано, со ссылкой на предыдущий кадр. А дальше добивается это дело B-кадрами. Судя по описанию методички их по факту даже нет в исходном видеоряде. Они просто строятся на основе двух соседних кадров^[Чем-то напоминает dlss если вы понимаете о чем я]. Обычно кодирование ведется группами по N кадров. Такие группы могут декодироваться независимо от других групп. Обычно размеры группы естественным образом определяются расстоянием между кадрами типа I. + +Говоря о самих изображениях, они состоят из макроблоков (размером 16х16 пикселей %%ничего не напоминает?)%%). Такие блоки имеют привычку смещаться и немного изменяться со временем. Вот их смещения обычно отслеживают и сжимают. Сжатие происходит очень сходно с JPEG + +#### Основные пути повышения степени сжатия + +- Улучшение сжатия I-кадров +- Улучшение подбора векторов смещения блоков (исходно - среднеквадратичное смещение%%Я тоже не в курсе, что за смещения векоторов. Такое чувство, что Молодяков тут не объясняет а напоминает%%) +- Если у вас еще остались тяжелые наркотики можете посравнивать коэффициентики в соседних блоках 8х8. Там адовы преобразования можно усреднить значения соседних блоков и добавить степени сжатия +- Если сжать кадры слишком сильно, то будут видны края блоков, но в целом можно алгоритмами убирать их на пост обработке и продолжать увеличивать сжатие +- Можно предварительно обработать видео, чтобы оно лучше подходило для сжатия (вырезать многие детали, которые все равно не заметны), вырезать разные шумы и "высокие частоты"^[Молодяков их так назвал. Что это в контексте изображения - ума не приложу] + +### Motion-JPEG + +Если видео короткое, или вам в целом все равно, что один видосик будет занимать у вас пол диска, то можно обойтись и Motion-JPEG (M-JPEG). Он заключается в основном в том, что все кадры будут независимо сжаты при помощи JPEG. + +Это помогает при монтаже видео и в целом JPEG обладает аппаратным ускорением^[То есть в процессоры вмонтированы устройства подобные тем, что мы на схемаче собираем, которые гоняют только операции над JPEG и ничем другим не занимаются. За счет того, что такие сопроцессоры не программируются а один раз собраны, скорость обработки получается очень быстрой] \ No newline at end of file