한양과학기술고등학교

에듀테크 프로젝트 대시보드

비디오 압축 원리

📼 압축 없이 저장한다면?

동영상은 초당 수십 장의 정지 이미지(프레임)를 이어붙인 것입니다. 압축을 전혀 하지 않으면 Full HD(1920×1080), 30fps, 픽셀당 RGB 3바이트 기준으로 계산했을 때 아래처럼 어마어마한 용량이 필요합니다. 실제 유튜브 1080p 스트리밍은 이보다 약 180배 작은 비트레이트로 재생됩니다 — 그 비밀이 바로 I-frame / P-frame / B-frame 구조입니다.

해상도
1920×1080
프레임레이트
30 fps
무압축 1프레임
≈ 5.93 MB
무압축 초당 용량
≈ 178 MB/s
실제 1080p 스트리밍
≈ 1 MB/s
🎞️ GOP(Group of Pictures)와 프레임 타입
I-frame (Intra)

다른 프레임을 참조하지 않고 이미지 전체를 독립적으로 인코딩합니다. JPEG처럼 DCT + 양자화를 씁니다(관련: /dct). 용량이 크지만 어디서든 디코딩을 시작할 수 있는 기준점입니다.

P-frame (Predictive)

이전 프레임을 참조해, 움직인 위치(모션 벡터)와 픽셀 차이(잔차)만 저장합니다. 대부분의 배경은 그대로이므로 용량이 I-frame의 수 % 수준으로 작습니다.

B-frame (Bidirectional)

이전 과 이후 프레임을 동시에 참조해 예측합니다. 압축률이 가장 높지만, 디코딩 순서가 재생 순서와 달라지는 대가가 있습니다.

예시 GOP(8프레임, IPPPPPPP 구조) · 프레임별 상대 인코딩 크기 참고용 그래프

🔍 블록 매칭으로 모션 벡터 찾기 — 직접 해보기

아래 데모는 실제 코덱이 쓰는 완전 탐색 블록 매칭(Exhaustive Block Matching)을 축소 재현합니다. 원(객체)이 프레임마다 오른쪽으로 움직이면, 인코더는 현재 프레임의 블록과 가장 비슷한 영역을 이전 프레임의 탐색 범위(±32px) 안에서 찾아 SAD(절대 차이 합)가 가장 작은 위치를 모션 벡터로 선택합니다. 이동 거리 슬라이더를 탐색 범위보다 크게 올려보면 매칭이 실패하는 것도 확인할 수 있습니다.

프레임 간 이동 거리 36px
프레임 0 / 7 · I-frame

이전 프레임(참조) — 초록 화살표 = 찾은 모션 벡터

현재 프레임 — 파란 사각형 = 인코딩할 매크로블록

찾은 모션 벡터
—
모션 보정 SAD
—
모션 추정 없이(제로벡터) SAD
—
판정
—
I-frame (원본 픽셀)
6,912 B
P-frame (제로벡터 차분)
—
P-frame (모션 보정)
—
누적: I-frame만 8장 계속 쓸 경우 대비, 지금까지의 GOP(I+P) 인코딩은 — 절약됨
📊 프레임 타입 요약
타입참조 프레임압축률디코딩 특징
I 없음 (독립) 낮음 (기준 100%) 단독으로 디코딩 가능 · 탐색(seek) 지점
P 이전 프레임 1장 높음 (I 대비 5~15%) 참조 프레임이 먼저 디코딩되어 있어야 함
B 이전 + 이후 프레임 가장 높음 미래 프레임을 먼저 받아야 해 지연·순서 재배열 발생

이미지 1장의 압축(DCT·양자화)은 /dct 페이지, 데이터 자체의 무손실 압축은 /lz77·/huffman 페이지 참고