Video Frame 기초 — Interlaced, I/P/B-frame, GOP, PLI, FIR
Interlaced와 progressive scan, intra·predictive·bi-predictive picture, GOP의 관계를 설명합니다. RTP video session에서 decoder가 reference picture를 잃었을 때 RTCP PLI·FIR가 요청하는 동작도 구분합니다. GOP 길이와 B-frame 사용 여부는 서비스 유형과 codec 협상에 따라 달라집니다.
목차(45개 항목)
1. 프레임이란? 그리고 Interlaced의 역사
- 2. 720p의 "p"의 정체
4. WebRTC는 왜 대부분 P-frame만 쓰는가
5. GOP란 무엇인가
6. I-frame은 언제, 왜 새로 찍히는가
7. PLI / FIR — RTCP 피드백 메시지
8. B-frame이 장애 복구를 어렵게 만드는 구조
9. 전송 순서 ≠ 표시 순서 — B-frame 지연의 정체
- 정리
- 관련 글
- 참고 자료
"프레임이 뭐예요?", "720p의 p가 뭐예요?", "I-frame은 뭐고 P-frame은 뭐예요?", "GOP는 왜 있어요?". 영상 품질 이슈를 조사할 때마다 이 질문들이 반복됩니다. 이 글은 영상이 픽셀 덩어리에서 네트워크를 타고 눈에 도달할 때까지 반드시 이해해야 할 개념들을, 현실 예시와 다이어그램으로 정리합니다.
구성:
- 프레임의 개념과 Interlaced(비월) vs Progressive(순차)
- 720p의 "p"의 정체
- I / P / B-frame
- WebRTC는 왜 대부분 P-frame만 쓰는가
- GOP란 무엇인가
- I-frame은 언제, 왜 새로 찍히는가
- PLI와 FIR — "키프레임 다시 주세요" RTCP 피드백
- B-frame이 장애 복구를 어렵게 만드는 구조
- 전송 순서 ≠ 표시 순서 — B-frame 지연의 정체
1. 프레임이란? 그리고 Interlaced의 역사
TV 화면은 실제로는 정지 이미지(프레임)를 빠르게 연속으로 보여주는 것입니다. 초당 30장의 정지 이미지를 보여주면 사람 눈은 "움직임"으로 인식합니다. 이는 정지 이미지의 빠른 연속을 뇌가 움직임으로 해석하는 가현운동(apparent motion / phi 현상) 덕분입니다. 흔히 "잔상 효과(persistence of vision)"로 설명되지만, 잔상은 깜빡임이 연속광으로 보이는 부분(flicker fusion)만 설명할 뿐 움직임 지각의 원인은 아니라는 것이 현대 지각과학의 정설입니다.
아날로그 시대의 문제
옛날 아날로그 TV는 전송할 수 있는 대역폭이 제한적이었습니다.
- 30fps → 그럭저럭 전송 가능
- 같은 공간 해상도에서 frame rate를 두 배로 만들면 sample 수와 필요한 전송량이 늘어남
- 30fps는 깜빡임(flicker)이 심해 눈이 피로
Interlaced (비월 주사)의 등장
"한 프레임을 두 번에 나눠서 보내자"는 해결책이 나왔습니다. 화면의 가로 주사선을 홀수 줄 / 짝수 줄로 나눕니다.
Progressive vs Interlaced
| Progressive (순차) | Interlaced (비월) | |
|---|---|---|
| 방식 | 한 프레임을 통째로 전송 | 홀수/짝수 줄 번갈아 전송 |
| 초당 전송 횟수 | 30회 | 60회 (반쪽씩) |
| 데이터량 | frame/field rate와 해상도를 함께 놓고 비교 | 예: 480i60은 초당 60 field, 약 30 frame 분량의 line sample |
| 움직임 | frame rate에 따름 | 서로 다른 시점의 field를 초당 60회 갱신 |
| 정지 화면 화질 | 선명 | 깨끗 (두 field 합성) |
| 움직이는 화면 | 깔끔 | Comb 아티팩트 발생 가능 |
왜 "부드러워 보이는가"
Field 1과 Field 2는 서로 다른 시점에 촬영되므로 60Hz motion sampling을 제공합니다. 대신 각 field의 수직 표본은 절반이고, 움직이는 영역을 두 field로 합치면 comb artifact가 생길 수 있습니다.
현대는 왜 Progressive가 표준인가
- 디지털 전송은 대역폭 충분
- LCD/OLED 모니터는 픽셀 전체를 한 번에 그림 (Interlaced를 재현하려면 디인터레이싱 처리 필요)
- 스포츠처럼 빠른 움직임에서 Interlaced는 Comb 아티팩트 (머리카락 빗 모양 줄무늬)가 보임
- 현대 WebRTC·스마트폰·웹캠 파이프라인은 대체로 Progressive를 사용하며, interlaced source는 ingest 단계에서 deinterlace가 필요할 수 있음
2. 720p의 "p"의 정체
- p = progressive
- i = interlaced
숫자는 세로 픽셀 수(해상도의 높이)입니다.
| 표기 | 해상도 | 스캔 방식 |
|---|---|---|
| 720p | 1280 × 720 | Progressive |
| 1080p | 1920 × 1080 | Progressive |
| 1080i | 1920 × 1080 | Interlaced |
| 2160p (4K UHD) | 3840 × 2160 | Progressive |
| 4320p (8K) | 7680 × 4320 | Progressive |
"숫자의 의미"는 세로 픽셀 수. 다른 해상도 표기(Full HD = 1080p, HD = 720p, UHD = 2160p)와 본질이 같고 "p"는 스캔 방식을 명시할 뿐입니다.
3. I / P / B-frame — 세 가지 프레임 타입
H.264/H.265 같은 비디오 코덱은 intra prediction과 inter prediction을 함께 사용합니다. 엄밀히는 H.264의 I/P/B는 picture 전체가 아니라 slice type이며, 한 picture에 여러 slice type이 섞일 수도 있습니다. 이 글에서는 이해를 위해 주된 slice type에 따라 I/P/B-picture라고 부릅니다.
I-frame (Intra-coded)
"Intra"는 다른 picture의 sample을 참조하지 않고 같은 picture 안의 이미 복원된 이웃 sample을 예측에 쓰는 coding 방식입니다. 압축된 완전 픽셀 dump나 JPEG와 같은 형식은 아닙니다.
- 다른 프레임을 참조하지 않음
- inter picture보다 큰 경우가 많지만 크기는 content·QP·encoder에 따라 달라짐
- random access에는 일반 I-picture가 아니라 IDR 등 decoder refresh point가 중요
P-frame (Predictive)
P-slice는 주로 과거 reference picture 후보(list 0)에서 motion-compensated prediction을 만들고 residual을 함께 부호화합니다. 단순히 직전 frame의 바뀐 픽셀만 보내는 방식은 아닙니다.
I-frame vs P-frame — 실제로 뭐가 다른가
핵심 차이:
| I-frame | P-frame | |
|---|---|---|
| 담는 것 | 절대값 — 전체 픽셀 색깔 | 변화량 — 이전 대비 delta |
| 지시 방식 | "이 장면을 이렇게 그려라" | "이전 프레임에서 이만큼만 바꿔라" |
| 비유 | 그림을 처음부터 다 그리기 | 수정 지시서 |
| 용량 | inter picture보다 큰 경우가 많음 | content·reference·QP에 따라 달라짐 |
따라서 시간적으로 비슷한 장면에서는 inter prediction이 중복을 줄일 수 있습니다. 실제 frame 크기 비율은 고정값이 아닙니다.
B-frame (Bi-directional predictive)
B-slice는 list 0, list 1 또는 양쪽 reference list에서 prediction을 만들 수 있습니다. 표시 순서상 뒤의 reference를 사용하면 decoding order 재배열과 buffer가 필요합니다.
B-frame은 "미래"를 어떻게 아는가 — 가장 근본적인 질문
가장 헷갈리는 지점입니다. 답이 의외로 간단합니다.
답: 인코더는 미래를 알고 있습니다. 왜냐하면 이미 다 찍혔으니까.
인코더 관점 — 미래를 안다
카메라는 계속 프레임을 찍어서 버퍼(임시 저장소)에 쌓습니다. 30fps면 1초에 30장이 버퍼에 쌓입니다.
인코더는 이 버퍼를 보면서 작업합니다:
인코더 입장에서는 미래도 과거도 다 "이미 찍힌 프레임" 입니다. 시간 순서는 사용자 입장이지, 인코더 입장에서는 그냥 "버퍼에 쌓인 데이터들"일 뿐입니다.
그래서 인코딩 지연이 생긴다
근데 이게 문제입니다. 영상통화는 실시간인데:
이게 WebRTC가 B-frame을 쓰지 않는 두 번째 이유입니다:
| 어느 쪽 지연인가 | 원인 | |
|---|---|---|
| 1번째 이유 | 디코딩 지연 (수신측) | B-frame 디코딩하려면 미래 P-frame 대기 |
| 2번째 이유 | 인코딩 지연 (송신측) | 인코더가 미래 프레임이 쌓일 때까지 기다림 |
디코더 관점 — 미래 모름, 재배열로 해결
디코더는 네트워크에서 도착하는 순서대로만 받을 수 있습니다. 그래서 인코더가 일부러 순서를 바꿔서 보냅니다:
이러면 디코더가 B₁을 받는 시점에는 이미 I와 P를 둘 다 가지고 있음 → 참조 가능 → B₁ 디코딩 OK.
결론: "디코더가 미래를 계산하는 게 아니라, 인코더가 미래를 미리 봐서 계산해놓고 순서를 재배열한 것."
용량 비교 (대략)
| 프레임 타입 | 상대 용량 | 특징 |
|---|---|---|
| I-picture | content·QP에 따라 다름 | 외부 reference 없이 coding, IDR 여부 별도 |
| P-picture | content·reference 선택에 따라 다름 | list 0 기반 inter prediction 가능 |
| B-picture | content·reference 선택에 따라 다름 | list 0/list 1 prediction 가능 |
한눈에 보는 프레임 타입별 의존성
핵심: 저지연 WebRTC encoder는 흔히 B-picture를 끄지만, RTP나 WebRTC 표준이 모든 B-picture를 금지하는 것은 아닙니다. 실제 profile과 bitstream은 SDP 협상과 구현 설정으로 확인합니다.
4. WebRTC는 왜 대부분 P-frame만 쓰는가
I-frame만 보내면 어떻게 될까
모든 프레임을 I-frame으로 보내면:
왜 B-frame도 안 쓰는가
B-frame을 쓰면 압축은 더 잘 되지만:
- 디코더가 "미래 프레임"을 기다리는 지연 발생 (look-ahead)
- reference graph와 reorder buffer가 복잡해질 수 있음
- gateway와 receiver가 negotiated profile·decoding order를 지원해야 함. RTP timestamp 자체는 non-monotonic일 수 있음
이건 별도 글에서 자세히 다뤘습니다 → RTMP 라이브 송출의 B-frame이 만든 PTS rollback
흔한 저지연 구성: I/IDR + P
전략 요약
- I-frame을 너무 자주 → 대역폭 폭증
- I-frame을 너무 드물게 → 조인/복구 느림
- GOP 간격은 join, loss recovery, bitrate와 대상 platform 요구사항을 함께 보고 선택
5. GOP란 무엇인가
🌱 처음부터 — fps가 뭐지? "2초마다 I-frame"이 무슨 뜻이지?
fps = frames per second = 초당 프레임 수. 영상은 사실 정지 이미지(프레임)를 빠르게 연속으로 보여주는 것입니다. 애니메이션 원리와 같습니다.
- 영화: 24fps (초당 24장)
- TV / YouTube: 30fps
- 게임: 60fps, 120fps (더 부드러움)
- 화상회의: 보통 30fps
"2초마다 I-frame"의 뜻:
왜 2초 예시를 자주 보나?
- 여러 live ingest platform이 2초 keyframe interval을 권장해 운영 예시로 흔함
- 짧으면 random-access 기회는 늘지만 intra picture 비용도 늘 수 있음
- 길면 자연 refresh를 기다리는 시간은 늘 수 있음
- WebRTC 표준의 고정값은 아니며 feedback 기반 keyframe 요청과 encoder 정책에 따라 달라짐
GOP = Group of Pictures. I-frame에서 다음 I-frame 직전까지의 프레임 묶음입니다.
GOP 길이와 I-frame 간격
30fps 기준:
| GOP 길이 | I-frame 간격 | 용도 |
|---|---|---|
| 30 | 1초마다 | 저지연 실시간 (빠른 복구, 대역폭 많이 씀) |
| 60 | 2초마다 | live ingest 설정 예시 |
| 150 | 5초마다 | 더 긴 간격의 예시 |
| 300 | 10초마다 | VOD용 긴 GOP 예시 |
GOP 짧음 vs 김
GOP 짧으면:
- 새 참여자 조인 빠름 (곧 다음 I-frame 옴)
- 패킷 유실 시 복구 빠름
- 대역폭 많이 씀 (I-frame 자주 반복)
GOP 길면:
- 대역폭 절약 (I-frame 드묾)
- 조인/복구 느림
- 장기 재생에는 유리
GOP 시각화
WebRTC 자체는 2초 GOP를 표준으로 정하지 않습니다. 실제 간격은 encoder 기본값, PLI/FIR 처리, simulcast layer, downstream ingest 요구사항으로 확인합니다.
6. I-frame은 언제, 왜 새로 찍히는가
정기 keyframe 간격 외에도 구현은 다음 event에서 decoder refresh picture를 만들 수 있습니다.
정기 I-frame
GOP 설정에 따라 주기적으로. 예: GOP 60 + 30fps → 2초마다.
추가(동적) I-frame 트리거
즉 "정기 + 필요할 때 수시" 구조입니다.
7. PLI / FIR — RTCP 피드백 메시지
🌱 처음부터 — PLI가 대체 뭐예요?
영상통화 상황을 상상해보세요. 상대방이 비디오를 계속 보내는 중. 어느 순간 인터넷이 불안해서 비디오 패킷 하나가 사라졌습니다. 내 화면이 깨집니다. 어떻게 복구할까요?
평소의 방향:
문제 발생 시 수신자가 거꾸로 요청:
PLI = Picture Loss Indication입니다. 수신자가 하나 이상의 picture를 잃어 prediction을 계속하기 어렵다는 사실을 알립니다. 응답 방식은 sender가 결정합니다.
- 평소엔 송신자 → 수신자로 한쪽 방향
- 깨졌을 때만 수신자 → 송신자로 구조 요청
- sender는 decoder refresh picture 생성, feedback 병합 또는 rate-limit 등을 결정
- refresh picture를 정상 수신하면 prediction chain을 다시 시작할 수 있음
이게 RTCP (RTP Control Protocol)가 하는 일의 핵심입니다. 미디어 전송은 RTP, 피드백·제어는 RTCP.
둘 다 decoder refresh와 관련된 RTCP feedback이지만 의미와 사용 조건이 다릅니다.
PLI (Picture Loss Indication)
- RFC 4585 정의
- 하나 이상의 picture 손실로 prediction이 어렵다는 indication
- sender가 intra picture를 만들 수 있지만 즉시 응답이 보장되지는 않음
FIR (Full Intra Request)
- RFC 5104 정의
- decoder refresh point가 필요하다는 command와 sequence number를 전달
- RFC 5104의 중복 억제·응답 규칙을 따르며 단순한 "더 강한 PLI"는 아님
왜 필요한가
inter-coded picture 손실은 그 picture를 참조하는 후속 picture에 전파될 수 있습니다. 영향 범위는 reference selection, error concealment, RTX/FEC와 refresh 정책에 따라 달라집니다.
시각화 — RTCP 피드백 루프
PLI와 FIR 선택
| 상황 | 고려할 feedback |
|---|---|
| 일반 패킷 유실 복구 | PLI |
| 새 참여자 합류 | SFU/endpoint 구현에 따라 PLI 또는 FIR |
| mixer가 새 spatial relationship을 만들 때 | RFC 5104가 설명하는 FIR 사용 사례 |
| 단순 packet 재전송 | PLI/FIR가 아니라 NACK/RTX 지원 여부 확인 |
8. B-frame이 장애 복구를 어렵게 만드는 구조
I + P만 있을 때와 B가 섞였을 때의 차이입니다.
I + P만 있을 때 (WebRTC)
B-frame이 섞일 때
결론: B-frame은 장애 영향 범위가 커지고 복구 경로가 복잡해집니다. 이것이 WebRTC가 B-frame을 피하는 구조적 이유 중 하나입니다.
9. 전송 순서 ≠ 표시 순서 — B-frame 지연의 정체
B-frame이 포함되면 디코더가 프레임을 받는 순서와 화면에 보여줘야 하는 순서가 달라집니다.
🌱 왜 순서가 달라져야만 하나? — 보간(interpolation) 비유
영화 필름을 보세요. 사용자는 시간 순서대로 봅니다: 0초 → 1초 → 2초 → 3초. 당연합니다.
그런데 이 예의 B-picture는 표시 순서상 앞뒤 reference에서 motion-compensated prediction을 만듭니다. 단순한 시간 중간값 보간은 아닙니다.
예를 들어 t=1의 B₁ 프레임이 담고 있는 건:
"t=0과 t=3 reference에서 block prediction을 만들고 residual로 차이를 보정하라"
즉 B₁ 자체에는 완전한 그림이 없습니다. I와 P가 둘 다 있어야 B₁을 그릴 수 있습니다.
그래서 어떻게 되냐면:
- 사용자가 보는 순서 (당연한 시간 순서): I → B₁ → B₂ → P
- 네트워크로 보내는 순서 (디코더가 계산 가능한 순서): I → P 먼저 → B₁ → B₂
P를 보낼 때: "I만 참조하면 되니까 바로 그릴 수 있음" ✓ B₁을 보낼 때: "I와 P가 필요한데 P는 이미 보냈음" ✓
디코더는 받은 순서대로 처리합니다. P를 못 받았으면 B₁을 계산할 방법이 없습니다. 그래서 인코더가 일부러 P를 B보다 먼저 보내는 것. 이게 "표시 순서 ≠ 전송 순서"의 뜻입니다.
표시 순서 vs 전송 순서 — 시각화
순서 역전 예시
디코더 관점의 프로세스
P를 먼저 받고도 화면에 띄우지 못하고 기다리는 시간 — 이것이 B-frame 지연의 본질입니다.
실시간 통신에서의 영향
이것이 WebRTC, 라이브 인터랙션, 원격회의에서 B-frame을 쓰지 않는 구조적 이유입니다 (스펙상 "금지"가 아니라, 구현 선택으로 사실상 거의 배제).
Look-ahead 지연 시각화
VOD에서는 175ms 지연이 문제 없지만, 실시간 통신에서는 체감 가능한 격차입니다.
정리
- 프레임은 정지 이미지의 연속이고, 뇌가 빠른 연속을 움직임으로 해석하는 가현운동(phi 현상)이 "움직임"을 만든다 (잔상 효과는 flicker fusion만 설명, 움직임 지각의 원인은 아님)
- Interlaced는 아날로그 시대 대역폭 절약 기법, 현대는 Progressive가 표준
- "720p"의 p = progressive, 숫자는 세로 픽셀 수
- I-frame(독립 완결) / P-frame(이전 참조, 차분) / B-frame(양방향 참조, 최고 압축)
- 저지연 WebRTC H.264 encoder는 흔히 B-picture를 끄지만 실제 profile과 bitstream을 확인해야 함
- GOP/keyframe 간격은 encoder와 platform 정책이며 WebRTC 표준의 고정 2초 값이 아님
- PLI는 picture loss indication, FIR은 decoder refresh command이며 sender 응답은 구현 정책을 따름
- B-picture의 reference/reorder 구조는 latency와 loss recovery의 tradeoff를 늘릴 수 있음
다음 글에서는 H.264 프로파일, x264 인코더 옵션, 하드웨어 인코더, 비트레이트 계산을 다룹니다. 이 글이 "왜 WebRTC가 이렇게 생겼는가"에 대한 개념 기초라면, 다음 글은 "실무에서 어떻게 설정해야 하는가"의 현장 지침입니다.
정정/보강: RFC 7742의 H.264 필수 구현 범위는 Constrained Baseline이며 다른 profile은 협상에 따라 사용할 수 있습니다. RFC 6184는 B-picture를 포함한 H.264 전송을 표현할 수 있고 RFC 3550은 sampling order와 transmission order가 다를 때 non-monotonic RTP timestamp를 허용합니다. VP8 bitstream은 key frame과 interframe 두 frame type을 정의하며 H.264의 B-slice에 대응하는 별도 frame type은 없습니다.
관련 글
- #28 H.264 Profile·인코더·비트레이트 — 이 글의 프레임 개념을 실제 인코더 옵션과 비트레이트 설정으로 잇는 후속편
- #29 B-frame 이해하기 — B-frame의 참조 구조·DTS/PTS·지연을 단일 주제로 깊게 파고드는 심화편
- #26 RTMP B-frame PTS rollback — WebRTC 변환 — 본문에서 링크한, B-frame의 PTS/DTS 역전이 실제 장애로 터진 사례
- #42 영상 압축의 본질 — I/P/B-frame/GOP/HLS — 같은 프레임/GOP 개념을 HLS 세그먼트 관점에서 재정리
- #0 WebRTC란? ICE/STUN/NAT/TURN 기초 — PLI/FIR가 오가는 RTCP·시그널링 토대를 처음부터 설명
참고 자료
- RFC 3550 — RTP — RTP timestamp와 transmission order 관계
- RFC 6184 — RTP Payload Format for H.264 Video — RTP에서 H.264 NAL/slice와 decoding order를 운반하는 표준
- RFC 4585 — RTP/AVPF — Picture Loss Indication(PLI)의 의미와 sender 동작
- RFC 5104 — Codec Control Messages in RTP/AVPF — Full Intra Request(FIR)의 sequence·중복 억제 규칙
- RFC 6386 — VP8 Data Format and Decoding Guide — VP8 key frame/interframe과 reference frame 구조
- RFC 7742 — WebRTC Video Codec Requirements — WebRTC H.264 Constrained Baseline 필수 구현 범위
- ITU-T H.264 — Advanced Video Coding — I/P/B 슬라이스, 프로파일, GOP 구조의 1차 규격
- FFmpeg Codec Options — GOP·B-picture·profile 관련 encoder option