Информация об изменениях

Сообщение Re: pet project with video codec от 09.02.2025 14:54

Изменено 09.02.2025 19:22 Videoman

Re: pet project with video codec
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста идею для

S>pet проекта что бы получить опыт с кодеками H.264/AVC, HEVC, and AV1.

По моему, если ты хочешь разобраться как конкретно устроены кодеки, самое действенное будет попробовать реализовать кодек самому.
Примерный план:

— Разберись почему кодеки работают в пространстве YUV. Чем отличаются 4:4:4 от 4:2:2 и от 4:2:0. Сделай быстрое преобразование туда сюда, пойми где теряется скорость, подумай как это соптимизиовать. Прореди цветовые плоскости в 2 раза, в 4 раза, в 16 раз. Посмотри как это отражается на кадре. Например был такой формат YUV9, где тратилось 9 бит на точку (8 — яркость и всего 1 бит на цвет).

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

— Intra-frame`ы (кадры без ссылки на соседние), для тебя просто картинка. Сначала из сжимали подобно JPEG, используя DCT. Изучи как устроено. Попробуй реализовать. Сейчас в них также используется дифференциальное кодирование, но уже не по отношению к соседнему, кадру, а относительно специально подобранной таблицы шаблонов. Т.е. по таблице вместо макроблока (квадратика) ищется наиболее подходящий шаблон, из них составляется опорный кадр, а разница уже кодируется известными методами.

— Inter-frame`ы (вектора перемещения со ссылками на соседние кадры). Попробуй реализовать поиск макроблоков в соседнем кадре, посмотри как быстро у тебя это получится. Почитай, посмотри какая разница после восстановления и вычета разница у тебя будет, как сильно она будет сжиматься и т.д.

— изучи что такое CBR, VBR, ABR. Подумай как бы ты такое реализовал, какие сложности. Почитай, посмотри как это устроено в современных кордеках.

— посмотри алгоритмы для кодирования энтропии без потеть: кодирования Хафмана, арифметическое кодирования.

— посмотри как устроены пакеты, заголовки, префиксы пакетов, Golomb-codes (коды переменной длины). Реализуй дамперы, читалки/записывалки.

— Почитай как были устроены старые кодеки:
MPEG (h.261) — грубо просто JPEG для I-кадров. Макроблоки фиксированной длины 8х8, поиск векторов движения в P,B кадрах тоже строго для блоков 8x8.
MPEG2 (h.262) — просто развитие MPEG, но с расчетом на телевидение. Расширенная поддержка цветовых пространств, разрешения и чересстрочной развертки, плюс всякие сетевые дела типа M2TS для вещания.
MPEG4 (h.264) — инрафреймы кодируются по таблице, макроблоки разного размера (типа ищем 32х32 — плохо получилось, 16х16, 8x8 и т.д.), и т.д.

Даже если ты копнешь не глубоко и не сможешь до конца понять, проверить все идеи, поверь, у тебя останется хорошая база и будет неплохое понимание, что бы двигаться дальше уже в конкретном направлении.
Re: pet project with video codec
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста идею для

S>pet проекта что бы получить опыт с кодеками H.264/AVC, HEVC, and AV1.

По моему, если ты хочешь разобраться как конкретно устроены кодеки, самое действенное будет попробовать реализовать кодек самому.
Примерный план:

— Разберись почему кодеки работают в пространстве YUV. Чем отличаются 4:4:4 от 4:2:2 и от 4:2:0. Сделай быстрое преобразование туда сюда, пойми где теряется скорость, подумай как это соптимизиовать. Прореди цветовые плоскости в 2 раза, в 4 раза, в 16 раз. Посмотри как это отражается на кадре. Например был такой формат YUV9, где тратилось 9 бит на точку (8 — яркость и всего 1 бит на цвет).

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

— Intra-frame`ы (кадры без ссылки на соседние), для тебя просто картинка. Сначала из сжимали подобно JPEG, используя DCT. Изучи как устроено. Попробуй реализовать. Сейчас в них также используется дифференциальное кодирование, но уже не по отношению к соседнему, кадру, а относительно специально подобранной таблицы шаблонов. Т.е. по таблице вместо макроблока (квадратика) ищется наиболее подходящий шаблон, из них составляется опорный кадр, а разница уже кодируется известными методами.

— Inter-frame`ы (вектора перемещения со ссылками на соседние кадры). Попробуй реализовать поиск макроблоков в соседнем кадре, посмотри как быстро у тебя это получится. Почитай, посмотри какая разница после восстановления и вычета разница у тебя будет, как сильно она будет сжиматься и т.д.

— изучи что такое CBR, VBR, ABR. Подумай как бы ты такое реализовал, какие сложности. Почитай, посмотри как это устроено в современных кордеках.

— посмотри алгоритмы для кодирования энтропии без потеть: кодирования Хафмана, арифметическое кодирования.

— посмотри как устроены пакеты, заголовки, префиксы пакетов, Golomb-codes (коды переменной длины). Реализуй дамперы, читалки/записывалки.

— Почитай как были устроены старые кодеки:
MPEG (h.261) — грубо просто JPEG для I-кадров. Макроблоки фиксированной длины 16х16, поиск векторов движения в P,B кадрах тоже строго для блоков 8x8.
MPEG2 (h.262) — просто развитие MPEG, но с расчетом на телевидение. Расширенная поддержка цветовых пространств, разрешения и чересстрочной развертки, плюс всякие сетевые дела типа M2TS для вещания.
MPEG4 (h.264) — инрафреймы кодируются по таблице, макроблоки разного размера (типа ищем 16х16 — плохо получилось, 8х8, 4x4 и т.д.), и т.д.

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