H.264 Profile, Encoder, Bitrate — WebRTC 운영 기준
H.264 profile과 packetization mode, software·hardware encoder, bitrate control이 WebRTC 호환성과 품질에 미치는 영향을 정리합니다. 해상도만으로 bitrate를 고정하지 않고 frame rate, 화면 움직임, codec implementation, network 조건을 포함해 시험하는 절차와 browser stats·bitstream 검사 항목을 제시합니다.
앞선 글(프레임의 모든 것)에서 "WebRTC는 왜 이렇게 생겼는가"의 개념적 기초를 다뤘다면, 이 글은 실무에서 어떤 옵션을 골라야 하는가의 현장 지침입니다. 다루는 주제:
- 클라우드 녹화에서 B-frame이 다시 등장하는 이유
- H.264 Profile 4총사 — Baseline, Constrained Baseline, Main, High
- Main/High +
bframes=0— 이 조합이 왜 실용 답인가 - MTI (Mandatory To Implement)란 무엇인가
- x264의
threads옵션 - 하드웨어 vs 소프트웨어 인코더
- 720p@30fps에 왜 1.5~2.5 Mbps가 필요한가 — 수학적 근거
- 해상도/FPS별 권장 비트레이트 표
1. 클라우드 녹화 + B-frame — 실시간 전송과 저장의 이중 구조
저지연 WebRTC H.264 encoder는 흔히 B-picture를 끕니다. 같은 입력을 다시 인코딩해 VOD로 저장하는 경로라면 다른 latency/quality tradeoff를 선택할 수 있습니다.
RTC 녹화의 두 가지 처리 방식
왜 녹화는 B-frame을 써도 되는가
- 녹화는 실시간 재생이 아님 — VOD로 나중에 봄
- look-ahead 지연은 재생 시점에 흡수되므로 체감 영향 없음
- 파일 크기가 작을수록 스토리지 비용 절감
- playback target과 container가 지원하면 High profile, B-picture, 긴 GOP를 선택할 수 있음
실무 시사점
즉 "전송은 저지연 제약, 저장은 압축 효율" 이라는 두 단계 구조입니다. 서버단 트랜스코딩이 두 세계를 연결합니다.
2. 실무에서 자주 만나는 H.264 Profile 4종
Profile은 "디코더가 어떤 압축 도구를 지원해야 하는가"의 계약입니다. 쉽게 말해 "이 비트스트림을 재생하려면 필요한 최소 능력치".
왜 Profile이 여러 개 있는가
사용 가능한 coding tool과 제품별 compatibility target이 다르기 때문입니다. 아래 연도·기기식 구분보다 실제 decoder capability와 negotiated profile-level-id를 우선합니다.
송출측이 High로 인코딩하면 구형 디바이스는 재생 불가. 그래서 "타겟 디바이스 수준에 맞춰" Profile을 선택합니다.
Profile 스펙트럼
| Profile | 식별자 | B-frame | CABAC | 8x8 변환 | 주 용도 |
|---|---|---|---|---|---|
| Baseline | 0x42 | ❌ 금지 | ❌ | ❌ | 초기 모바일 |
| Constrained Baseline | 0x42 + constraint flags | ❌ 금지 | ❌ | ❌ | WebRTC H.264 MTI |
| Main | 0x4D | ✅ 허용 | ✅ | ❌ | SD 방송, 초기 YouTube |
| High | 0x64 | ✅ 허용 | ✅ | ✅ | Blu-ray, HD/4K VOD |
- CABAC: CAVLC보다 복잡한 context-adaptive entropy coding. 이득은 content와 설정에 따라 달라짐
- 8x8 변환: 더 세밀한 공간 변환 블록
고급 프로파일의 트레이드오프
핵심: Profile 선택은 "지연 vs 압축률 vs 호환성" 3각 트레이드오프에서 어디에 점을 찍을 것인가의 문제입니다.
시각화
3. Main/High + bframes=0 — 실용 답
"Constrained Baseline이 실시간에 안전하다"고 했는데, 실무에서는 종종 Main 또는 High + bframes=0 조합을 씁니다. 이유:
Constrained Baseline의 한계
Main/High + bframes=0의 이점
x264 설정 예시
"그럼 WebRTC에서도 Main/High + bframes=0 쓰면 되는 거 아닌가?"
이론상 그렇습니다. 실무에서 걸리는 두 가지가 있습니다.
제약 1: 상호운용성 (interop)
제약 2: SDP profile-level-id 협상 복잡도
결론
| 환경 | 권장 Profile |
|---|---|
| 브라우저 WebRTC | SDP로 협상된 profile 사용. 상호운용 기준선은 Constrained Baseline |
| SDK 기반, 양쪽 통제 | SDK가 공개한 지원 범위에서 Main/High를 협상한 경우에만 사용 |
| VOD 녹화/방송 배포 | High + B-frame (최대 효율) |
4. MTI — Mandatory To Implement
MTI = Mandatory To Implement ("반드시 구현해야 하는 것"). IETF/RFC 표준 용어입니다.
의미
표준을 따르는 구현이 공통으로 제공해야 하는 최소 기능 집합입니다. MTI는 codec 공통분모를 만들지만 signaling·ICE·권한·network까지 포함한 통화 성공을 보장하지는 않습니다.
WebRTC의 MTI
| 영역 | MTI 코덱 |
|---|---|
| 비디오 | VP8, H.264 Constrained Baseline |
| 오디오 | Opus, G.711 (PCMU/PCMA) |
MTI가 없다면?
MTI는 생태계 최소 공통분모입니다. 그래서 WebRTC에서 H.264 Constrained Baseline이 계속 기준선 역할을 합니다.
5. x264의 threads 옵션
x264는 오픈소스 H.264 인코더. threads 옵션은 병렬 처리에 쓸 CPU 스레드 수입니다.
옵션 값
트레이드오프
언제 뭘 쓰나
| 시나리오 | 권장 |
|---|---|
| 실시간 인코딩 | 기본 auto에서 real-time factor와 latency를 측정하고 필요하면 제한 |
| 저지연 스트리밍 | zerolatency의 sliced-threading과 실제 frame delay 확인 |
| VOD 배치 인코딩 | 보통 auto로 throughput 확보; bit-exact 요구가 있을 때 별도 제한 |
| 모바일/배터리 제약 | hardware encoder 우선, thermal/power 측정으로 결정 |
예시
6. 하드웨어 vs 소프트웨어 인코더
소프트웨어 인코더
- 대표: x264(H.264), libvpx(VP8/VP9), libaom(AV1)
- CPU로 계산
- 품질·설정 자유도 높음
- CPU 점유율 큼 (노트북 팬, 배터리 소모)
- 지연 상대적으로 큼
하드웨어 인코더
- 전용 칩/회로로 인코딩 (GPU 내장 or 별도 유닛)
- CPU 사용량을 줄이는 경우가 많음
- 속도 매우 빠름, 지연 작음
- 배터리 효율 좋음
- 품질은 소프트웨어 대비 살짝 낮음 (같은 비트레이트 기준)
- 설정 자유도 제한적
플랫폼별 하드웨어 인코더
| 플랫폼 | 인코더 이름 |
|---|---|
| NVIDIA GPU | NVENC |
| Intel CPU (내장 GPU) | Quick Sync Video (QSV) |
| AMD GPU | VCE / VCN |
| Apple (macOS/iOS) | VideoToolbox |
| Android | MediaCodec |
브라우저 WebRTC에서 확인하는 법
하드웨어 vs 소프트웨어 인코더 흐름도
같은 720p@30fps를 비교할 때 확인할 항목:
| 항목 | 소프트웨어 (x264) | 하드웨어 (NVENC/VideoToolbox) |
|---|---|---|
| CPU 사용률 | CPU·preset별 측정 | driver·copy 경로 포함 측정 |
| 인코딩 지연 | threading·lookahead 포함 측정 | hardware queue 포함 측정 |
| 배터리 소모 | 큼 | 작음 |
| 화질 (같은 bitrate) | 조금 더 좋음 | 조금 낮음 |
| 설정 자유도 | 매우 높음 | 제한적 |
실무 포인트
- 상용 SDK의 encoder 선택 정책은 SDK version·기기·codec·thermal state에 따라 달라짐
- iOS/Android에서도 hardware fallback 여부를 runtime stats와 log로 확인
- 데스크톱 브라우저는 GPU 드라이버 상태에 따라 다름
- 품질 이슈가 있을 때는 "하드웨어 vs 소프트웨어 인코더 차이"도 체크 대상
7. 720p@30fps에 왜 1.5~2.5 Mbps가 필요한가
🌱 처음부터 — 4단계로 유도하기
1️⃣ 해상도 → 픽셀 수
2️⃣ 프레임당 바이트 수 (RGB 기준)
RGB 각 채널이 1바이트(8비트)이므로 픽셀당 3바이트:
MB 단위 주의
- 1 MB = 1,000,000 바이트 (SI 단위, 마케팅/네트워크) → 2,764,800 ÷ 1,000,000 ≈ 2.76 MB
- 1 MB = 1,048,576 바이트 (2진법, OS 파일 시스템) → 2,764,800 ÷ 1,048,576 ≈ 2.64 MB
네트워크 비트레이트 계산은 관례상 SI 단위 (1M = 10⁶)를 씁니다. 아래 계산도 SI 기준.
3️⃣ 초당 데이터량
4️⃣ Mbps (비트) 변환
1 바이트 = 8 비트이므로 × 8:
핵심 공식 요약
| 단계 | 계산 |
|---|---|
| 픽셀 수 | 가로 × 세로 |
| 프레임 크기 | 픽셀수 × 3 (RGB) |
| 초당 데이터 | 프레임크기 × fps |
| 비트레이트 | 초당데이터 × 8 |
무압축 대역폭 계산 — RGB 기준
무압축 전송은 663 Mbps가 필요합니다. 일반 가정 인터넷으로는 불가능.
실제 인코더 입력은 YUV 4:2:0
위 계산은 RGB 3바이트/픽셀 기준입니다. 실제 H.264 인코더 입력은 YUV 4:2:0 색 공간을 씁니다 (사람 눈이 밝기에는 민감하고 색상에는 덜 민감하다는 점을 이용한 서브샘플링).
그래서 "무압축"의 정확한 수치는 약 331 Mbps (YUV 4:2:0) 또는 663 Mbps (RGB). H.264 인코더는 이 중 YUV 입력을 받아 압축합니다.
H.264 압축 효율
H.264는 inter/intra prediction, integer transform, quantization, entropy coding으로 bitrate를 줄입니다. 무압축 대비 압축 배수는 target quality와 source complexity가 결정하므로 고정값으로 환산할 수 없습니다.
따라서 "720p@30fps에 1.5~2.5 Mbps"는 수학적 필연값이 아니라 특정 live service의 시작점으로 쓰이는 경험적 범위입니다.
요약: raw bandwidth 계산은 buffer 규모를 알려줄 뿐 목표 bitrate를 결정하지 않습니다. codec 비교도 동일한 content·quality metric·encoder speed에서 측정해야 합니다.
해상도/FPS별 권장 비트레이트
| 해상도 | FPS | 권장 비트레이트 | 비고 |
|---|---|---|---|
| 360p | 30 | 500 ~ 800 Kbps | 모바일 저화질 |
| 480p | 30 | 800 ~ 1,200 Kbps | SD |
| 720p | 30 | 1.5 ~ 2.5 Mbps | 초기 planning 예시 |
| 720p | 60 | 2.5 ~ 4 Mbps | 게임/스포츠 |
| 1080p | 30 | 3 ~ 5 Mbps | Full HD |
| 1080p | 60 | 4.5 ~ 7.5 Mbps | Full HD 고프레임 |
| 1440p | 30 | 6 ~ 10 Mbps | QHD |
| 2160p (4K) | 30 | 15 ~ 25 Mbps | UHD |
| 2160p (4K) | 60 | 25 ~ 40 Mbps | UHD 고프레임 |
한눈에 보는 해상도별 비트레이트
왜 범위인가
비트레이트 부족의 증상
실무 감잡기 — 간편 계산
시각화 — 비트레이트 스펙트럼
8. 네트워크 예산과 연결 짓기
실제 통화/스트리밍을 기획할 때 비트레이트 → 네트워크 요구치로 환산합니다.
단일 송출 (1:1 화상통화)
그룹 통화 (4명, SFU)
라이브 방송 (1 송출 → N 수신)
품질 저하의 첫 증상
이 중 어떤 조정을 어떤 순서로 적용하는지는 congestion controller, simulcast/SVC 구성과 application policy에 따라 달라집니다.
정리
- transcoded 녹화는 B-picture를 선택할 수 있음 — playback target의 decoder capability와 output profile을 맞춘 뒤 사용
- H.264 Profile 4종: 호환성↔압축률 스펙트럼. WebRTC MTI는 Constrained Baseline
- Main/High +
bframes=0— 협상된 경우 일부 coding tool을 유지하며 B-picture reorder delay 제거 - MTI (Mandatory To Implement) — "반드시 구현해야" → 상호운용성 보장의 기반
- x264
threads— throughput, frame delay, compression tradeoff를 측정해 선택 - 하드웨어 인코더 — CPU 부담 적고 배터리 효율 높음.
chrome://webrtc-internals에서 확인 가능 - 720p@30fps 1.5~2.5 Mbps — 특정 live workload의 planning 예시이며 source와 quality target으로 검증
- bitrate scaling — pixel count만으로 결정하지 않고 content·frame rate·codec·preset·quality metric을 함께 비교
Profile과 비트레이트는 "타겟 디바이스 × 네트워크 × 콘텐츠 성격"의 3축 공간에서 점을 고르는 일입니다. 무조건 높은 Profile과 낮은 비트레이트가 좋은 게 아니라, 시스템 전체가 공급할 수 있는 것과 수용자가 처리할 수 있는 것의 교집합을 찾는 작업입니다.
품질 이슈에서는 bitrate, negotiated profile, encoder implementation을 확인하되 capture quality·lighting·resize·packet loss·decoder/rendering도 같은 시간축으로 조사합니다.
관련 글
- #27 프레임의 모든 것 — Interlaced/I·P·B/GOP/PLI·FIR — Profile이 좌우하는 B-frame/GOP의 개념적 기초. 이 글의 직전 편.
- #29 B-frame 이해하기 —
bframes=0을 왜/어떻게 끄는지, B-frame의 지연 구조를 더 깊게. - #30 x264 실전 옵션 — ref/tune/keyint —
threads,tune=zerolatency등 이 글에서 다룬 x264 파라미터의 확장. - #18 Bitrate 완전 정복 — 720p@30fps 비트레이트 수학과 해상도/FPS별 권장치의 심화.
- #43 Agora 자체 코덱 vs Web SDK, SD-RTN, FEC — SDK가 Profile/하드웨어 인코더를 어떻게 자동 선택하는지의 시스템 맥락.
참고 자료
- RFC 6184 — RTP Payload Format for H.264 Video —
profile-level-id, packetization-mode 등 SDP 협상 파라미터의 표준 정의. - RFC 7742 — WebRTC Video Processing and Codec Requirements — WebRTC 비디오 MTI(VP8, H.264 Constrained Baseline)의 근거.
- RFC 7874 — WebRTC Audio Codec and Processing Requirements — Opus·PCMA·PCMU audio MTI.
- ITU-T H.264 Advanced video coding for generic audiovisual services — Baseline/Main/High Profile, CABAC, 8x8 변환의 1차 표준 명세.
- x264 source — encoder parameters —
bframes,threads,b-pyramid,zerolatencyoption의 1차 구현. - FFmpeg Codec Options —
-profile:v,-x264-params,-tunewrapper option. - WebRTC Internals (chrome://webrtc-internals 가이드) —
encoderImplementation등 하드웨어/소프트웨어 인코더 진단 방법.