В операционной системе, существует декодер и кодер, декодер, читает формат сжатия видео, а кодер кодирует видео в этот формат.
Существует 2 основных варианта технологий сжатия, это mpeg и h.26Х
В конце 80х когда люди начали переходить с магнитных лент, на цифровые носители, в 1988 году, был разработан первый алгоритм, DCT , это по сути передача только разницы, между изображениями, представь что отрисовка 10 кадров в видео, где ты снимаешь свою комнату идёт так, допустим твоя камера это 2х2 пикселя, и все они имеют ванильный цвет, когда ты не двигаешь камеру, они остаются одного цвета, значит можно записать в память их например как не в+в+в+в (в-ванильный) а как 4в , ведь 1 символ это 1 байт, а так мы экономим сразу 2 вместо 4 байтов которые бы потратили отрисовав всё полностью, а так мы подразумеваем что их четыре, но не записывая эту информацию как есть, а более просто.И такой принцип можно перенести на камеру которая снимает в 144p например , там таких пикселей очень много, что помогает сэкономить, без этого твоё видео на 2 минуты займет гигабайта 4 например)
Однако прорыв случился гораздо позже в 1993 году пустили в мир mpeg-1 , это и есть mp4 только он уже называется mpeg 4 part 14 , и таких part существует 40 штук, просто удачные концепции выжили.
mpeg ввел, концепцию кадровой разницы.
Вот их настоящая суть:
* I-кадр.
* Это опорный/полный кадр. Он хранит всю картинку целиком, как отдельный JPEG. Пишутся каждую секунду.
*
* P-кадр. Он хранит не всю картинку, а только разницу между собой и предыдущим I- или P-кадром. Если сцена меняется медленно, он весит копейки.
*
* B-кадр.
* Он смотрит назад на предыдущий кадр и вперед на следующий. Он хранит разницу усредненно между ними. Они самые маленькие по весу, но без I и P кадров их не расшифровать.
*
А таккже появились gop группы это возможность, читая запись типа I P B B P B B I кадров, перемещаться в видео на I кадры. Чтобы ты могла перематывать видео.
Однако, с появялением кодеков или форматов сжатия, как угодно, появились и контейнеры, например тот же mp4 это одноврепенно само видео и контейнер.
Контейнер нужен для того, чтобы синхронизировать потоки видео и аудио, представь что ты снимаешь видео и говоришь в микрофон одновременно. По сути там пишется два разных потока, если бы не существовало контейнеров, ты бы не смогла четко разговаривать, звук отставал бы или спешил. А так, ты можешь не переживать об этом.
Контейнеры таккже включают в себя субтитры и например старые dvd даже небольшое экранное меню ,где ты могла выбрать фильм.
В общем контейнер заранее объединяет звук с видео, чтобы все работало правильно.
Их ты можешь встретить несколько .avi .mkv .mp4 внутри каждого хранится свой кодек-h.260,mpeg1,mpeg4 и так далее.
Сейчас самый новый стандарт это h.266(2020) , правда для его раскапаковки то есть декодирования, потребуется мощная видеокарта, а если её нет, и она встроенная, то мощный процессор.
Видеокарты бывают двух типов, как твоя, это полноценный движок который сам все умеет обрабатывать очень быстро ведь все чипы близко между собой на плате.
И есть встроенная видеокарта, по сути она берет немного оперативной памяти и использует её чтобы показать картинку. Но дискретная использует свою память, а встроенная обращается к памяти компьютера, это задержки.
Там производительность измеряется в флопсах, это количество сложений вычитаний разных чисел, они считают вот такую формулу.
FLOPS = (Количество ядер) × (Тактовая частота) × (Количество операций за такт)
• CPU (процессор): 8 ядер × 3.5 ГГц × 8 операций/такт = ~224 GFLOPS.
* GPU (видеокарта): 3840 ядер × 1.5 ГГц × 2 операции/такт = ~11 520 GFLOPS = 11.5 TFLOPS.
Гигафлопс- 1 миллиард операций в секунду.
Таккже есть, варианты flops.
FP32 float (32 бита) Высокая Игры, научные расчеты
FP16 half-float (16 бит) Средняя Нейросети, AI-ускорение
INT8 целые числа (8 бит) Низкая AI-вывод, сжатие
TF32 гибрид 32/19 бит Средняя NVIDIA Tensor Core
Видеокарты стараются выбирать низкую точность то есть int8 , чтобы иметь больше гигафлопс.
Однако если ты хочешь перекодировать видео в другой формат или в тот же самый, например, то к сожалению видео ухудшается всегда даже если записывать все данные, при перекодировании заново, в те же блоки.
Потому что есть такой термин квантование. В математике, люди были настолько ленивы, что привыкли округлять, если у тебя число 0.5 или выше 1, в сторону больше, а если ниже то наоборот.
Ниже будет представлено вычисление😅
Каждый int имеет свой масштаб, это обусловлено тем, так решили разработчики.
Масштаб это по сути то насколько точно можно смещать указатель , просто представь что ты меняешь яркость и можешь не на 25% менять, а более точно, на 10% например из 100%
1. INT8 (масштаб 2):
* 123.456 × 2 = 246.912 > округляем до 247.
* Делим на коэффициент квантования (например, 10): 247 ÷ 10 = 24.7 → 25.
* При декодировании: 25 × 10 = 250. ( это нужно чтоб число было целое)
* Потеряли 123.456 × 2 = 246.912 — 250 = -3.088
2. INT16 (масштаб 256):
* 123.456 × 256 = 31 604.736 > округляем до 31 605.
* Делим на коэффициент квантования (10): 31 605 ÷ 10 = 3 160.5 > 3 161.
* При декодировании: 3 161 × 10 = 31 610.
* Делим обратно на 256: 31 610 ÷ 256 = 123.476.
* Потеряли 123.456 — 123.476 = -0.02(почти нет ошибки).
Таким образом, совершается сжатие видеоизображения.