블로그 목록
Media22분 읽기

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 검사 항목을 제시합니다.

H.264ProfileBaselineMainHighMTIx264NVENCVideoToolboxMediaCodecBitrateYUVWebRTC
목차(49개 항목)
  1. 1. 클라우드 녹화 + B-frame — 실시간 전송과 저장의 이중 구조
    1. RTC 녹화의 두 가지 처리 방식
    2. 왜 녹화는 B-frame을 써도 되는가
    3. 실무 시사점
  2. 2. 실무에서 자주 만나는 H.264 Profile 4종
    1. 왜 Profile이 여러 개 있는가
    2. Profile 스펙트럼
    3. 고급 프로파일의 트레이드오프
    4. 시각화
  3. 3. Main/High + `bframes=0` — 실용 답
    1. Constrained Baseline의 한계
    2. Main/High + `bframes=0`의 이점
    3. x264 설정 예시
    4. "그럼 WebRTC에서도 Main/High + bframes=0 쓰면 되는 거 아닌가?"
    5. 결론
  4. 4. MTI — Mandatory To Implement
    1. 의미
    2. WebRTC의 MTI
    3. MTI가 없다면?
  5. 5. x264의 `threads` 옵션
    1. 옵션 값
    2. 트레이드오프
    3. 언제 뭘 쓰나
    4. 예시
  6. 6. 하드웨어 vs 소프트웨어 인코더
    1. 소프트웨어 인코더
    2. 하드웨어 인코더
    3. 플랫폼별 하드웨어 인코더
    4. 브라우저 WebRTC에서 확인하는 법
    5. 하드웨어 vs 소프트웨어 인코더 흐름도
    6. 실무 포인트
  7. 7. 720p@30fps에 왜 1.5~2.5 Mbps가 필요한가
    1. 무압축 대역폭 계산 — RGB 기준
    2. 실제 인코더 입력은 YUV 4:2:0
    3. H.264 압축 효율
    4. 해상도/FPS별 권장 비트레이트
    5. 한눈에 보는 해상도별 비트레이트
    6. 왜 범위인가
    7. 비트레이트 부족의 증상
    8. 실무 감잡기 — 간편 계산
    9. 시각화 — 비트레이트 스펙트럼
  8. 8. 네트워크 예산과 연결 짓기
    1. 단일 송출 (1:1 화상통화)
    2. 그룹 통화 (4명, SFU)
    3. 라이브 방송 (1 송출 → N 수신)
    4. 품질 저하의 첫 증상
  9. 정리
  10. 관련 글
  11. 참고 자료

앞선 글(프레임의 모든 것)에서 "WebRTC는 왜 이렇게 생겼는가"의 개념적 기초를 다뤘다면, 이 글은 실무에서 어떤 옵션을 골라야 하는가의 현장 지침입니다. 다루는 주제:

  1. 클라우드 녹화에서 B-frame이 다시 등장하는 이유
  2. H.264 Profile 4총사 — Baseline, Constrained Baseline, Main, High
  3. Main/High + bframes=0 — 이 조합이 왜 실용 답인가
  4. MTI (Mandatory To Implement)란 무엇인가
  5. x264의 threads 옵션
  6. 하드웨어 vs 소프트웨어 인코더
  7. 720p@30fps에 왜 1.5~2.5 Mbps가 필요한가 — 수학적 근거
  8. 해상도/FPS별 권장 비트레이트 표

1. 클라우드 녹화 + B-frame — 실시간 전송과 저장의 이중 구조

저지연 WebRTC H.264 encoder는 흔히 B-picture를 끕니다. 같은 입력을 다시 인코딩해 VOD로 저장하는 경로라면 다른 latency/quality tradeoff를 선택할 수 있습니다.

RTC 녹화의 두 가지 처리 방식

전송 경로 (실시간):
  Sender → RTP/SRTP → Receiver
          (I + P만, B 없음)

녹화 경로 (서버):
  Sender → 서버 도달 → [모드 선택]
                      │
                      ├─ ① Individual recording
                      │    (받은 스트림 그대로 파일로 저장)
                      │    → I + P 그대로
                      │
                      └─ ② Composite / Transcoded recording
                           (서버가 다시 인코딩해서 저장)
                           → encoder 설정과 output profile이 허용하면 B-picture 사용 가능

왜 녹화는 B-frame을 써도 되는가

  • 녹화는 실시간 재생이 아님 — VOD로 나중에 봄
  • look-ahead 지연은 재생 시점에 흡수되므로 체감 영향 없음
  • 파일 크기가 작을수록 스토리지 비용 절감
  • playback target과 container가 지원하면 High profile, B-picture, 긴 GOP를 선택할 수 있음

실무 시사점

실시간 스트림:
  Profile: Constrained Baseline (또는 Main + bframes=0)
  GOP: 2초
  B-frame: 없음

녹화 (Composite):
  Profile: High
  GOP: 10초
  B-frame: 2~3개
  → 파일 크기 차이는 source·quality target·encoder로 실측

즉 "전송은 저지연 제약, 저장은 압축 효율" 이라는 두 단계 구조입니다. 서버단 트랜스코딩이 두 세계를 연결합니다.


2. 실무에서 자주 만나는 H.264 Profile 4종

Profile은 "디코더가 어떤 압축 도구를 지원해야 하는가"의 계약입니다. 쉽게 말해 "이 비트스트림을 재생하려면 필요한 최소 능력치".

왜 Profile이 여러 개 있는가

사용 가능한 coding tool과 제품별 compatibility target이 다르기 때문입니다. 아래 연도·기기식 구분보다 실제 decoder capability와 negotiated profile-level-id를 우선합니다.

2005년 피처폰:       Baseline만 가능
2010년 초기 스마트폰: Main까지 가능
2015년 중급 스마트폰: High까지 가능
2020년 이후:          대부분 High 무리 없음
Blu-ray 플레이어:     High 전제

송출측이 High로 인코딩하면 구형 디바이스는 재생 불가. 그래서 "타겟 디바이스 수준에 맞춰" Profile을 선택합니다.

Profile 스펙트럼

Profile식별자B-frameCABAC8x8 변환주 용도
Baseline0x42❌ 금지❌❌초기 모바일
Constrained Baseline0x42 + constraint flags❌ 금지❌❌WebRTC H.264 MTI
Main0x4D✅ 허용✅❌SD 방송, 초기 YouTube
High0x64✅ 허용✅✅Blu-ray, HD/4K VOD
  • CABAC: CAVLC보다 복잡한 context-adaptive entropy coding. 이득은 content와 설정에 따라 달라짐
  • 8x8 변환: 더 세밀한 공간 변환 블록

고급 프로파일의 트레이드오프

Profile ↑ (Baseline → High):
  압축률        ↑  (같은 화질에 파일 작아짐)
  디코더 연산량  ↑  (저사양 기기 재생 어려움)
  지연          profile 자체보다 실제로 선택한 B-picture·lookahead·buffer 설정에 좌우
  호환성        ↓  (지원 기기 줄어듦)

핵심: Profile 선택은 "지연 vs 압축률 vs 호환성" 3각 트레이드오프에서 어디에 점을 찍을 것인가의 문제입니다.

시각화

Profile 선택 매트릭스:

저지연 ◀────────────────────────────────▶ 고압축
  Constrained Baseline
  (WebRTC)
       ┃
       │    Main + bframes=0
       │    (WebRTC 고급)
       │           ┃
       │           │      Main
       │           │      (SD 방송)
       │           │            ┃
       │           │            │     High
       │           │            │     (VOD/Blu-ray)
       └───────────┴────────────┴──────▶

3. Main/High + bframes=0 — 실용 답

"Constrained Baseline이 실시간에 안전하다"고 했는데, 실무에서는 종종 Main 또는 High + bframes=0 조합을 씁니다. 이유:

Constrained Baseline의 한계

Baseline / Constrained Baseline은:
  ❌ B-frame 금지 (이건 OK)
  ❌ CABAC 금지 (압축률 손해)
  ❌ 8x8 변환 금지 (디테일 손해)

→ 단순한 tool subset이어서 같은 quality target에서 bitrate가 늘 수 있으나 비율은 고정되지 않음

Main/High + bframes=0의 이점

Main 또는 High 선택:
  ✅ CABAC 활성화 가능 (압축률 ↑)
  ✅ 8x8 변환 가능 (High only, 디테일 ↑)
  ✅ B-frame 사용 "가능"하지만 필수는 아님

bframes=0 강제:
  ✅ B-picture reorder delay 제거
  
결과: 고급 profile의 일부 coding tool을 유지하면서 B-picture reorder delay를 제거. lookahead·VBV·threading·capture buffer까지 0이 되는 것은 아님

x264 설정 예시

# Main + bframes=0
ffmpeg -i input.mp4 \
  -c:v libx264 \
  -profile:v main \
  -x264-params "bframes=0:b-pyramid=none:scenecut=0" \
  -preset veryfast \
  -tune zerolatency \
  ...

# High + bframes=0 (더 높은 압축률)
ffmpeg -i input.mp4 \
  -c:v libx264 \
  -profile:v high \
  -x264-params "bframes=0:b-pyramid=none:scenecut=0" \
  ...

"그럼 WebRTC에서도 Main/High + bframes=0 쓰면 되는 거 아닌가?"

이론상 그렇습니다. 실무에서 걸리는 두 가지가 있습니다.

제약 1: 상호운용성 (interop)

WebRTC H.264 MTI 예 = Constrained Baseline (`profile-level-id`의 level byte는 endpoint capability에 따라 달라짐)

Chrome ↔ Safari ↔ Firefox 사이에서:
  → Constrained Baseline은 반드시 지원
  → Main/High는 구현체마다 지원 여부 다름

SDP 협상 시:
  Offer: "Main 써도 될까?"
  Answer: "난 High까진 안 되는데..."
  → Fallback to Constrained Baseline 또는 실패

제약 2: SDP profile-level-id 협상 복잡도

profile-level-id=42e01f  → Constrained Baseline, Level 3.1
profile-level-id=4d001f  → Main, Level 3.1
profile-level-id=64001f  → High, Level 3.1

offer/answer가 합의한 profile·level·packetization mode와 실제 bitstream이 일치해야 함
합의 가능한 codec이 없으면 media negotiation이 실패할 수 있음

결론

환경권장 Profile
브라우저 WebRTCSDP로 협상된 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가 없다면?

Chrome: "난 VP9만 써"
Safari: "난 H.265만 써"
Firefox: "난 AV1만 써"
  ↓
서로 호환 안 됨 → 통화 불가

MTI 있음:
표준 준수 WebRTC endpoint는
  "최소한 VP8 + H.264 CBL + Opus/PCMA/PCMU 구현"
  → codec 협상의 공통 기반 제공

MTI는 생태계 최소 공통분모입니다. 그래서 WebRTC에서 H.264 Constrained Baseline이 계속 기준선 역할을 합니다.


5. x264의 threads 옵션

x264는 오픈소스 H.264 인코더. threads 옵션은 병렬 처리에 쓸 CPU 스레드 수입니다.

옵션 값

threads=1:    단일 스레드 (느림, 결정론적 출력)
threads=6:    6개 코어 병렬
threads=0 또는 option 생략: x264가 자동 결정

트레이드오프

스레드 많음:
  처리량은 늘 수 있지만 frame-threading은 frame delay를 늘릴 수 있음
  sliced threading을 쓰면 frame delay를 줄이는 대신 compression efficiency가 달라질 수 있음

스레드 적음:
  ✅ 압축 효율 ↑ (전체 프레임 글로벌 최적화)
  ❌ 인코딩 속도 ↓
  ❌ 지연 ↑

언제 뭘 쓰나

시나리오권장
실시간 인코딩기본 auto에서 real-time factor와 latency를 측정하고 필요하면 제한
저지연 스트리밍zerolatency의 sliced-threading과 실제 frame delay 확인
VOD 배치 인코딩보통 auto로 throughput 확보; bit-exact 요구가 있을 때 별도 제한
모바일/배터리 제약hardware encoder 우선, thermal/power 측정으로 결정

예시

# 실시간 (6코어 시스템)
ffmpeg -i input -c:v libx264 \
  -x264-params "threads=6:sliced-threads=1" \
  -preset ultrafast -tune zerolatency ...

# VOD 최대 압축
ffmpeg -i input -c:v libx264 \
  -x264-params "threads=1" \
  -preset veryslow -crf 18 ...

6. 하드웨어 vs 소프트웨어 인코더

소프트웨어 인코더

  • 대표: x264(H.264), libvpx(VP8/VP9), libaom(AV1)
  • CPU로 계산
  • 품질·설정 자유도 높음
  • CPU 점유율 큼 (노트북 팬, 배터리 소모)
  • 지연 상대적으로 큼

하드웨어 인코더

  • 전용 칩/회로로 인코딩 (GPU 내장 or 별도 유닛)
  • CPU 사용량을 줄이는 경우가 많음
  • 속도 매우 빠름, 지연 작음
  • 배터리 효율 좋음
  • 품질은 소프트웨어 대비 살짝 낮음 (같은 비트레이트 기준)
  • 설정 자유도 제한적

플랫폼별 하드웨어 인코더

플랫폼인코더 이름
NVIDIA GPUNVENC
Intel CPU (내장 GPU)Quick Sync Video (QSV)
AMD GPUVCE / VCN
Apple (macOS/iOS)VideoToolbox
AndroidMediaCodec

브라우저 WebRTC에서 확인하는 법

방법 ① — Chrome GPU 정보 페이지
주소창에 입력: chrome://gpu
→ "Video Encode" capability 확인. 현재 통화가 그 encoder를 사용한다는 직접 증거는 아님

방법 ② — WebRTC 통계 (실시간)
주소창에 입력: chrome://webrtc-internals
→ 통화 중 열어서 "outbound-rtp" 섹션 확인
  Chrome이 해당 build에서 노출하는 implementation field 확인:
    - "ExternalEncoder", "NVENC", "MediaCodec" → 하드웨어
    - "libvpx", "OpenH264", "x264" → 소프트웨어

하드웨어 vs 소프트웨어 인코더 흐름도

카메라 원본 압축 전 raw YUV 프레임 소프트웨어 인코더 x264, libvpx, OpenH264 하드웨어 인코더 NVENC, QSV, VideoToolbox CPU 연산 범용 프로세서가 직접 계산 전용 칩 연산 GPU 내장 / 전용 유닛 특징 • CPU 사용량은 preset·해상도·CPU에 따라 측정 • 배터리 빠르게 소모 • 화질 우수, 조정 자유도 ↑ • latency는 preset·threading·buffer에 따라 측정 특징 • 전용 block으로 CPU 부담을 줄일 수 있음 • 배터리 효율 좋음 • 화질 살짝 낮음 (같은 bitrate) • 세대·driver·설정에 따라 latency가 다름 확인: chrome://webrtc-internals → encoderImplementation 필드 • "ExternalEncoder" / "NVENC" / "MediaCodec" / "VideoToolbox" → 하드웨어 • "libvpx" / "OpenH264" / "x264" → 소프트웨어 chrome://gpu 의 "Video Encode" 항목에서도 Hardware accelerated 여부 확인 가능

같은 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️⃣ 해상도 → 픽셀 수

1280 × 720 = 921,600 픽셀

2️⃣ 프레임당 바이트 수 (RGB 기준)

RGB 각 채널이 1바이트(8비트)이므로 픽셀당 3바이트:

921,600 픽셀 × 3 바이트 = 2,764,800 바이트

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️⃣ 초당 데이터량

2.76 MB × 30 fps = 82.8 MB/s

4️⃣ Mbps (비트) 변환

1 바이트 = 8 비트이므로 × 8:

82.8 MB/s × 8 = 662.4 Mbps ≈ 663 Mbps

핵심 공식 요약

단계계산
픽셀 수가로 × 세로
프레임 크기픽셀수 × 3 (RGB)
초당 데이터프레임크기 × fps
비트레이트초당데이터 × 8

무압축 대역폭 계산 — RGB 기준

720p = 1280 × 720 = 921,600 픽셀
픽셀당 RGB 3바이트 = 3 byte
프레임당: 921,600 × 3 = 2,764,800 byte ≈ 2.76 MB

30fps:
  2.76 MB × 30 = 82.8 MB/s
  = 82.8 × 8 Mbps
  = 662.4 Mbps ≈ 663 Mbps

무압축 전송은 663 Mbps가 필요합니다. 일반 가정 인터넷으로는 불가능.

실제 인코더 입력은 YUV 4:2:0

위 계산은 RGB 3바이트/픽셀 기준입니다. 실제 H.264 인코더 입력은 YUV 4:2:0 색 공간을 씁니다 (사람 눈이 밝기에는 민감하고 색상에는 덜 민감하다는 점을 이용한 서브샘플링).

YUV 4:2:0 기준:
  픽셀당 평균 1.5 바이트 (Y full + UV 2×2 블록마다 각 1 샘플)
  
720p: 921,600 × 1.5 = 1,382,400 byte ≈ 1.38 MB
30fps: 1.38 × 30 = 41.4 MB/s × 8 = 331 Mbps

그래서 "무압축"의 정확한 수치는 약 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가 결정하므로 고정값으로 환산할 수 없습니다.

YUV 4:2:0 무압축: 약 331 Mbps
  → 이 값은 memory bandwidth 기준
  → 필요한 compressed bitrate는 해상도만이 아니라 content·frame rate·quality target·encoder 설정으로 시험

따라서 "720p@30fps에 1.5~2.5 Mbps"는 수학적 필연값이 아니라 특정 live service의 시작점으로 쓰이는 경험적 범위입니다.

요약: raw bandwidth 계산은 buffer 규모를 알려줄 뿐 목표 bitrate를 결정하지 않습니다. codec 비교도 동일한 content·quality metric·encoder speed에서 측정해야 합니다.

해상도/FPS별 권장 비트레이트

해상도FPS권장 비트레이트비고
360p30500 ~ 800 Kbps모바일 저화질
480p30800 ~ 1,200 KbpsSD
720p301.5 ~ 2.5 Mbps초기 planning 예시
720p602.5 ~ 4 Mbps게임/스포츠
1080p303 ~ 5 MbpsFull HD
1080p604.5 ~ 7.5 MbpsFull HD 고프레임
1440p306 ~ 10 MbpsQHD
2160p (4K)3015 ~ 25 MbpsUHD
2160p (4K)6025 ~ 40 MbpsUHD 고프레임

한눈에 보는 해상도별 비트레이트

H.264 권장 비트레이트 (Mbps) 왼쪽 = 최소 (움직임 적음), 오른쪽 = 최대 (움직임 많음) 360p@30 480p@30 720p@30 720p@60 1080p@30 1080p@60 0 5 10 15 20 25 Mbps 0.5~0.8 0.8~1.2 1.5~2.5 ← planning 예시 2.5~4 3~5 4.5~7.5

왜 범위인가

같은 해상도·FPS라도 콘텐츠에 따라:

움직임 적은 영상 (범위 하단):
  ─ 토킹헤드 (뉴스, 영상통화, 강의)
  ─ 정적 배경 + 얼굴만 움직임
  ─ P-frame 압축 매우 효율적 → 낮은 비트레이트 OK

움직임 많은 영상 (범위 상단):
  ─ 스포츠, 게임, 드론 촬영
  ─ 배경 전체가 계속 바뀜
  ─ P-frame 효율 낮음 → 높은 비트레이트 필요

비트레이트 부족의 증상

권장 하단 미달 (예: 720p@30fps에 500 Kbps):

인코더가 무리하게 압축하면:
  ─ 블록 노이즈 (매크로블록 경계가 각지게 보임)
  ─ 모스키토 노이즈 (에지 주변 노이즈)
  ─ 뭉개짐 / 색 번짐
  ─ 움직임 영역에서 deinition 급락

사용자 인식:
  "720p라는데 왜 이렇게 화질이 구리지?"

실무 감잡기 — 간편 계산

규칙 A — 해상도 변화:
  720p → 1080p: 픽셀 수 약 2.25배 → 비트레이트도 약 2배

규칙 B — FPS 변화:
  30fps → 60fps: 프레임 수 2배
  하지만 비트레이트는 1.5~1.8배 증가
  (완전 2배 아닌 이유: 프레임 간 유사도 덕분에 P-frame이 더 작아짐)

규칙 C — codec 변화:
  codec 이름만으로 절감률을 고정하지 않음
  동일 source·quality metric·latency/preset 조건에서 비교

시각화 — 비트레이트 스펙트럼

비트레이트 축 (Mbps):

0.5   1.0   1.5   2.0   3.0   5.0   10   25  (Mbps)
 │     │     │     │     │     │     │     │
 ▼     ▼     ▼     ▼     ▼     ▼     ▼     ▼
360p  480p  720p  720p  1080p 1080p 1440p 4K
30fps 30fps 30fps 60fps 30fps 60fps 30fps 30fps

        ◀─── 모바일 ──▶ ◀─── 데스크 ──▶

8. 네트워크 예산과 연결 짓기

실제 통화/스트리밍을 기획할 때 비트레이트 → 네트워크 요구치로 환산합니다.

단일 송출 (1:1 화상통화)

양방향:
  내 송출 (720p@30fps): 2 Mbps
  상대 수신:           2 Mbps
  
오디오 (Opus 양방향):
  내 송출: 32 Kbps
  수신:   32 Kbps
  
RTP/UDP/IP·SRTP·extension overhead는 평균 payload 크기로 계산
FEC/RTX overhead는 loss와 복구 정책에 따라 측정

각 방향의 send/receive target에 여유율을 더해 access link를 따로 산정

그룹 통화 (4명, SFU)

내 송출: 1 스트림 (2 Mbps)
내 수신: 3 스트림 (6 Mbps)

업로드와 다운로드를 합산하지 않고 각각 산정
simulcast/SVC layer와 실제 subscription 수를 반영

라이브 방송 (1 송출 → N 수신)

송출측: 단일 스트림 (4 Mbps 정도)
CDN/SFU가 복제 → 각 시청자에게 전달

시청자 다운로드: 4 Mbps
송출측 업로드: 4 Mbps (CDN이 팬아웃)

품질 저하의 첫 증상

대역폭 부족 시 먼저 보이는 것:

① 비디오 해상도 Downscale (동적)
   720p → 540p → 360p → 240p → 오디오만

② 비트레이트 Down
   2 Mbps → 1.5 Mbps → 1 Mbps ... (같은 해상도라도 화질 저하)

③ FPS Down
   30fps → 15fps → 10fps (모션 뚝뚝 끊김)

④ 패킷 유실 증가
   모자이크, 프리즈, PLI 요청 폭주

이 중 어떤 조정을 어떤 순서로 적용하는지는 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도 같은 시간축으로 조사합니다.


관련 글

참고 자료

© 2026 Frank Kim. All rights reserved.