Bitrate 완전 정복 — 같은 해상도인데 왜 화질이 다른가
해상도는 캔버스 크기, Bitrate는 물감의 양. Resolution×FPS×Bitrate 삼각관계, Cloud Recording 재인코딩 손실, HLS에서 ffprobe bitrate가 N/A인 이유, 화질 디버깅 5단계 체크리스트.
목차(24개 항목)
- Bitrate란 — 초당 데이터 예산
Resolution × FPS × Bitrate — 세 변수의 삼각관계
Cloud Recording에서 Bitrate가 결정되는 흐름
"같은 해상도인데 왜 뭉개지나" — 실제 사례
CBR vs VBR — Bitrate 할당 전략
- 호스트 Bitrate > 녹화 Bitrate — 무슨 일이 일어나는가
- 핵심 요약
- 시리즈 네비게이션
같은 720×1280인데 왜 한쪽은 선명하고 한쪽은 뭉개져 보이는가? 해상도가 같아도 bitrate가 다르면 화질은 완전히 달라집니다. 해상도는 캔버스 크기이고, bitrate는 그 캔버스 위에 얼마나 세밀하게 그릴 수 있는지를 결정합니다.
Cloud Recording 트러블슈팅을 하다 보면 "화질이 나빠요"라는 문의가 옵니다. 해상도를 확인하면 정상인데 체감 화질은 360p 수준. 이런 경우 십중팔구 bitrate 문제입니다.
Bitrate란 — 초당 데이터 예산
Bitrate는 1초 동안 영상을 표현하는 데 사용할 수 있는 데이터량입니다.
JPEG 품질 설정과 같은 원리입니다. 같은 1280×720 이미지라도 JPEG 품질 20으로 저장하면 뭉개지고, 80으로 저장하면 선명합니다. 해상도는 동일하지만 압축 품질이 다릅니다. 동영상에서 이 "압축 품질"을 결정하는 것이 bitrate입니다.
Resolution × FPS × Bitrate — 세 변수의 삼각관계
화질을 결정하는 세 변수는 서로 얽혀 있습니다. 하나를 올리면 다른 것도 따라 올려야 합니다.
계산 직관
세 변수 중 하나만 올리고 나머지를 고정하면 이런 일이 벌어집니다.
| 변경 | 결과 |
|---|---|
| 해상도↑ bitrate 고정 | 큰 캔버스에 적은 물감 → 뭉개짐 |
| FPS↑ bitrate 고정 | 프레임마다 예산 줄어듦 → 각 프레임 품질↓ |
| Bitrate↑ 해상도·FPS 고정 | 일정 수준까지 선명해지다가 수확 체감 |
해상도별 권장 bitrate
Agora의 setVideoEncoderConfiguration 기준으로 정리하면:
| 해상도 | FPS | 최소 bitrate | 권장 bitrate | 최대 bitrate |
|---|---|---|---|---|
| 640×480 | 15 | 400 kbps | 500 kbps | 750 kbps |
| 640×480 | 30 | 600 kbps | 750 kbps | 1000 kbps |
| 1280×720 | 15 | 600 kbps | 1130 kbps | 1500 kbps |
| 1280×720 | 30 | 1000 kbps | 1500 kbps | 2000 kbps |
| 1920×1080 | 15 | 1000 kbps | 2000 kbps | 3000 kbps |
| 1920×1080 | 30 | 1500 kbps | 2500 kbps | 4000 kbps |
이 표에서 핵심은 같은 해상도라도 FPS가 올라가면 권장 bitrate도 올라간다는 점입니다. 720×1280 @ 15fps에서 1130 kbps가 적정이지만, 30fps로 올리면 1500 kbps가 필요합니다.
Cloud Recording에서 Bitrate가 결정되는 흐름
녹화 화질은 단일 설정으로 결정되지 않습니다. 호스트 SDK에서 출발한 영상이 최종 녹화 파일이 되기까지 여러 단계를 거칩니다.
각 단계에서 화질이 깎이는 방식
① 호스트 SDK 설정 — 출발점. 여기서 720×1280 / 30fps / 1710 kbps로 설정했다면 이것이 이론적 최대 화질입니다.
② 네트워크 적응 — 가장 예측 불가능한 구간. Agora SDK는 네트워크 상태를 실시간으로 측정하고, 대역폭이 부족하면 자동으로 해상도와 bitrate를 낮춥니다. 호스트가 Wi-Fi에서 셀룰러로 전환되거나, 네트워크 혼잡 시 360p까지 떨어질 수 있습니다. 설정값과 실제 송출값은 다를 수 있습니다.
③ Cloud Recording 수신 — videoStreamType: 0이면 고화질 스트림을 요청합니다. 하지만 channelType이 앱과 불일치하면 스트림 구독이 불안정해질 수 있습니다. Communication 모드로 Live Broadcasting 채널에 조인하면 호스트/청중 역할 라우팅이 맞지 않기 때문입니다.
④ Mix 모드 재인코딩 — 여기서 transcodingConfig의 bitrate가 적용됩니다. 호스트가 1710 kbps로 보내도 녹화 설정이 1130 kbps면 34% 적은 데이터로 다시 압축합니다. 재인코딩 자체도 generation loss(세대 손실)를 일으킵니다.
"같은 해상도인데 왜 뭉개지나" — 실제 사례
실제 트러블슈팅 사례로 설명합니다.
상황
ffprobe로 확인
해상도는 720×1280으로 정상. 그런데 bit_rate=N/A입니다.
HLS에서 bit_rate가 N/A인 이유
MP4는 moov atom에 전체 파일의 bitrate 메타데이터가 기록되어 있어서 ffprobe가 즉시 읽을 수 있습니다. 하지만 M3U8은 TS 세그먼트들의 목차일 뿐, bitrate 정보를 담고 있지 않습니다.
전체 bitrate를 알고 싶다면 개별 TS 세그먼트를 분석해야 합니다.
화질 저하의 원인 분석
해상도가 정상이라면 문제는 이 세 가지 조합입니다.
CBR vs VBR — Bitrate 할당 전략
Bitrate를 할당하는 방식에는 두 가지가 있습니다.
CBR (Constant Bitrate) — 고정 비트레이트
매 순간 동일한 bitrate를 사용합니다. 실시간 스트리밍에서 주로 사용됩니다. 네트워크 대역폭을 예측 가능하게 사용할 수 있지만, 장면 복잡도에 관계없이 같은 예산을 쓰기 때문에 비효율적입니다.
VBR (Variable Bitrate) — 가변 비트레이트
장면 복잡도에 따라 bitrate를 유동적으로 할당합니다. 움직임이 많은 장면에는 더 많은 데이터를, 정적 장면에는 적은 데이터를 사용합니다. VOD(녹화 파일 재생)에 적합합니다.
Agora Cloud Recording은 어떤 방식?
Agora Cloud Recording의 transcodingConfig.bitrate는 목표(target) bitrate입니다. 내부 인코더가 이 값을 기준으로 VBR에 가까운 방식으로 인코딩합니다. 즉, 설정한 bitrate가 상한선에 가까운 가이드라인이지 매 프레임 고정값이 아닙니다.
호스트 Bitrate > 녹화 Bitrate — 무슨 일이 일어나는가
흔한 질문입니다. "호스트가 1710으로 보내는데 녹화를 2500으로 설정하면 더 좋아지나요?"
녹화 bitrate를 호스트보다 높게 설정해도 화질은 좋아지지 않습니다. 원본에 없는 디테일을 만들어낼 수 없기 때문입니다. 인코더는 필요 이상의 bitrate를 강제로 채우지 않습니다.
반대로, 녹화 bitrate가 호스트보다 낮으면 확실히 나빠집니다. 원본의 디테일을 더 강하게 압축해서 버리기 때문입니다.
적정 설정: 호스트 bitrate와 같거나 약간 높게 (재인코딩 손실 보상). 호스트가 1710이면 녹화는 1800~2000이 적정입니다.
실전: 화질이 나쁠 때 디버깅 체크리스트
녹화 화질 문의가 왔을 때 순서대로 확인합니다.
Step 1: 실제 해상도 확인
설정한 해상도와 다르면 → 호스트 SDK가 네트워크 적응으로 다운그레이드했거나, 호스트와 녹화 캔버스의 방향(가로/세로)이 불일치.
Step 2: channelType 일치 확인
Step 3: FPS 일치 확인
Step 4: Bitrate 적정성 확인
Step 5: 방향(Orientation) 일치 확인
핵심 요약
- Bitrate는 초당 데이터 예산. 해상도가 같아도 bitrate가 낮으면 뭉개집니다. JPEG 품질 설정과 같은 원리.
- Resolution × FPS × Bitrate는 삼각관계. 하나를 올리면 나머지도 맞춰야 합니다. 720p/30fps 기준 1500 kbps가 적정.
- Cloud Recording Mix 모드는 재인코딩. 디코딩 → 합성 → 재인코딩 과정에서 필연적 품질 손실 발생. 녹화 bitrate를 호스트보다 약간 높게 설정해 보상.
- 녹화 bitrate > 호스트 bitrate는 무의미. 원본 이상으로 좋아지지 않습니다. 스토리지 비용만 증가.
- HLS(M3U8)에서 ffprobe bitrate가 N/A인 이유. M3U8은 세그먼트 목차일 뿐 bitrate 메타데이터가 없습니다. 개별 TS 또는 MP4 변환 후 확인.
- 화질 디버깅 순서: 해상도 → channelType → FPS → Bitrate → 방향. 이 다섯 가지를 체크하면 대부분의 화질 문제를 잡을 수 있습니다.
시리즈 네비게이션
실시간 통화, 어떻게 녹화하는가 시리즈