RTC 미디어 경로 해부 — RTP에서 Media Push·Cloud Recording까지
RTC 채널의 압축 프레임이 RTP로 패킷화되는 과정과 서버 측 미디어 제품이 그 흐름에 개입하는 지점을 추적합니다. Media Gateway·Media Pull·Cloud Transcoding·Media Push·Cloud Recording을 입력, 변환, 출력 기준으로 구분하고 CDN 송출과 stream fallback까지 같은 데이터 경로 위에서 설명합니다.
목차(29개 항목)
RTC 채널 안의 미디어 = 실시간으로 packetize된 압축 미디어
- 이 미디어가 Agora SD-RTN에서 어떻게 흐르는가
CDN이 RTMP를 받을 때 — "아무거나 받지 않는다"
CDN 내부에서 일어나는 일 — Agora의 책임은 여기까지
- 패킷 레벨에서 보는 전체 변환 흐름
Stream Fallback — 네트워크가 나쁠 때 음성 우선 정책
- 정리: 공개 계약과 구현 추정을 구분한다
- 참고 자료
Agora RTC 채널에서 미디어가 실제로 어떤 형태로 존재하고, 네트워크를 타고 어떻게 이동하는지를 먼저 이해해야 합니다. 그래야 Media Push, Media Pull, Cloud Transcoding 같은 클라우드 제품들이 "정확히 무엇을 하는 건지" 엔지니어 관점에서 파악할 수 있습니다.
RTC 채널 안의 미디어 = 실시간으로 packetize된 압축 미디어
웹 WebRTC에서는 압축 미디어를 RTP payload로 packetize하고 SRTP로 보호해 ICE가 선택한 경로로 보냅니다. UDP를 우선하지만 UDP가 막히면 TURN/TCP 또는 TURN/TLS를 사용할 수 있습니다. Agora Native SDK의 wire format과 내부 전송 프로토콜을 표준 RTP/UDP와 동일하다고 단정해서는 안 됩니다.
먼저 오해를 없애겠습니다:
Video
- 코덱: H.264, VP8, VP9
- 인코딩 결과: H.264의 access unit은 하나 이상의 NAL unit으로 구성됩니다. I/P/B는 정확히는 slice type이며, IDR picture가 대표적인 random-access 지점입니다.
- 왜 쪼개는가: 인코딩된 access unit이 경로 MTU보다 클 수 있어 RFC 6184 같은 codec payload 규격에 따라 여러 RTP packet으로 나눕니다. 1,200바이트 안팎은 fragmentation을 피하기 위한 보수적 목표값이지 MTU의 보편값은 아닙니다.
Audio
- 코덱: WebRTC endpoint는 Opus와 G.711 PCMA/PCMU를 필수 구현합니다. Agora의 지원 코덱은 SDK·플랫폼·모드별 문서를 확인해야 합니다.
- 인코딩 결과: Opus는 2.5·5·10·20·40·60ms 프레임을 지원하며 packet은 여러 frame을 합쳐 최대 120ms를 담을 수 있습니다. byte 크기는 bitrate와 frame duration에 따라 달라집니다.
- 비디오와의 차이: 오디오 payload는 보통 영상보다 작지만, "항상 한 frame이 한 packet"인 것은 아닙니다.
네트워크에서 실제로 보이는 형태
각 필드가 하는 일:
| 필드 | 크기 | 역할 |
|---|---|---|
| SSRC | 32bit | 동기화 소스 식별자. 한 사용자가 simulcast·RTX/FEC 등 여러 SSRC를 쓸 수 있고 세션 중 바뀔 수도 있음 |
| Timestamp | 32bit | 미디어 시간. 수신 측에서 재생 타이밍을 맞추는 기준 |
| Sequence Number | 16bit | 패킷 순서. UDP는 순서 보장이 없으므로 수신 측에서 재정렬에 사용 |
| PT (Payload Type) | 7bit | payload format 번호. dynamic 값의 codec mapping은 SDP 같은 세션 신호로 정함 |
| M (Marker) | 1bit | 의미는 payload 규격별로 정의. H.264에서는 access unit의 마지막 packet을 표시 |
| CSRC | 가변 | 믹싱된 경우 원본 소스들의 SSRC 목록 |
왜 이 구조인가 — 파일이 아니라 패킷이어야 하는 이유
RTC는 본질적으로:
파일 컨테이너는 헤더·index·sample 구조를 사용하고, 손상 영향은 빠진 위치와 복구 정보에 따라 달라집니다. RTC 수신기는 deadline이 지난 packet을 버리고 concealment·재전송·refresh 요청을 조합하지만, reference picture 손실은 이후 picture에도 영향을 줄 수 있습니다.
왜 TCP가 아니라 UDP인가
RTP는 UDP 위에서 동작하되, 패킷 유실이 발생하면:
- 비디오: 손실 영향은 reference 구조·packet 위치·concealment에 따라 다릅니다. NACK/RTX, FEC, PLI/FIR 같은 feedback을 조합할 수 있습니다.
- 오디오: Opus decoder는 PLC와 선택적 in-band FEC를 지원하지만 결과는 loss pattern과 콘텐츠에 따라 달라집니다.
이 미디어가 Agora SD-RTN에서 어떻게 흐르는가
Agora는 SD-RTN을 공용 인터넷 위의 소프트웨어 정의 오버레이로 설명합니다. 아래 SFU 그림은 다자간 RTC의 일반적인 전달 모델을 설명하기 위한 개념도이며, Agora 내부 노드의 정확한 토폴로지나 암호화 경계를 공개 API 계약처럼 해석하면 안 됩니다.
일반적인 SFU의 핵심은 압축 미디어를 합성하지 않고 수신자별로 계층을 선택해 전달하는 것입니다. RTP header rewrite·재전송·SRTP termination 여부는 구현과 E2EE 방식에 따라 달라집니다.
그런데 여기서 중요한 질문이 생깁니다:
"SFU는 디코딩 안 하고 전달만 한다면서, Cloud Transcoding은 서버에서 합성/재인코딩을 한다고? 그럼 MCU 아닌가?"
여러 입력을 하나의 영상으로 합성하는 transcoding 경로는 decode·compose·encode를 수행한다는 점에서 MCU형 처리와 유사합니다. 이것이 Agora의 내부 배치 구조까지 증명하는 것은 아닙니다.
Agora 클라우드 제품을 데이터 흐름으로 이해하기
이제 RTP 패킷 레벨에서 각 제품이 정확히 무엇을 하는지 볼 수 있습니다.
전체 지도
① Media Gateway — "RTMP/SRT → RTP 변환기"
패킷 레벨에서 일어나는 일:
- RTMP 패킷 수신 (TCP)
- FLV 컨테이너에서 H.264 NAL units + AAC frames 분리
- 타임스탬프를 RTP timestamp 체계로 변환
- RTP 헤더 생성 (SSRC, seq number, timestamp)
- Agora SD-RTN으로 전송
트랜스코딩을 활성화하면 한 입력에서 여러 해상도·bitrate 출력을 만들 수 있습니다. 아래 SSRC와 bitrate는 원리를 보여 주는 예시이며 실제 Agora 할당 방식이나 기본 ladder가 아닙니다.
② Media Pull (Cloud Player) — "URL fetch → RTP 변환기"
Gateway와의 RTP 레벨 차이:
- Gateway: 외부에서 push → 서버가 수동적으로 받음
- Pull: 서버가 능동적으로 fetch → HTTP GET / RTMP connect
두 경우 모두 외부 미디어가 RTC 채널의 publish 가능한 형식으로 변환됩니다. 정확한 packet format과 UID/SSRC 매핑은 공개된 제품 API에서 보장하는 범위만 사용해야 합니다.
③ Cloud Transcoding — "RTP subscribe → decode → 합성 → encode → RTP publish"
이것이 RTP 레벨에서 가장 복잡한 제품입니다.
SFU vs Cloud Transcoding 비교 (같은 2호스트 시나리오):
④ Media Push — RTC 미디어를 외부 ingest로 전달
제품 버전에 따라 passthrough/remux가 가능한 경로와 transcoding 경로가 구분될 수 있습니다. 아래는 일반적인 구현 모델이며, 현재 API의 공식 모드 이름으로 보아서는 안 됩니다.
Raw Mode — decode 안 함 (핵심)
Raw mode에서 일어나는 일:
- 코덱·profile·parameter set·timestamp가 대상 ingest와 호환되면 video를 decode하지 않고 remux할 수 있습니다.
- 오디오 codec이 대상 ingest와 다르면 audio transcode가 필요합니다.
- 여러 사용자를 합성하려면 decode·mix/compose·encode 경로가 필요합니다.
remux 경로는 video 재인코딩 손실이 없고 transcoding보다 연산량이 작지만, 실제 사용 가능 조건과 과금·제한은 제품 문서를 확인해야 합니다.
Transcoding Mode — 완전히 새 영상을 만듦
Transcoding mode에서 일어나는 일:
- decode합니다. 압축을 풀어 raw 데이터로 만듭니다.
- 합성합니다. 여러 호스트의 영상을 하나의 캔버스에 배치합니다.
- encode합니다. 완전히 새로운 H.264 + AAC 스트림을 생성합니다.
- bitrate, fps, 해상도, 레이아웃 모두 변경 가능합니다.
RTP vs RTMP — 근본적인 차이
| 항목 | RTP (RTC) | RTMP (CDN) |
|---|---|---|
| Transport | ICE가 선택한 UDP/TCP relay 등 | TCP 또는 TLS |
| 구조 | packet 기반 | stream 기반 |
| Container | RTP payload format | RTMP audio/video message |
| Timestamp | RTP timestamp (비디오 90kHz, 오디오는 샘플레이트 기준: Opus 48kHz) | FLV timestamp (ms) |
| 패킷 유실 대응 | NACK/FEC | TCP 재전송 (자동) |
| 지연 | 경로·codec·buffer에 따라 달라짐 | ingest 및 downstream protocol·player buffer에 따라 달라짐 |
CDN이 RTMP를 받을 때 — "아무거나 받지 않는다"
Converter가 RTMP를 CDN에 밀어넣으면 끝일까? 아닙니다. CDN이 RTMP 스트림을 수락하려면 4가지 조건을 통과해야 합니다.
조건 1 — RTMP Handshake 정상
RTMP는 연결 시작 시 handshake를 합니다:
handshake 실패하면 연결 자체가 안 됩니다.
조건 2 — Stream Key 인증
CDN은 stream key로 "이 스트림을 받을 권한이 있는가"를 확인합니다. 틀리면 연결을 끊습니다. 이 key는 YouTube/Twitch/Facebook 등 각 플랫폼에서 발급합니다.
조건 3 — Codec 제한
전통적인 RTMP ingest가 흔히 받는 조합:
실제 허용 codec·profile·bitrate는 ingest 제공자와 protocol 버전에 따라 다릅니다. RTC의 Opus를 AAC만 받는 RTMP ingest로 보낸다면 audio transcode가 필요합니다.
조건 4 — Bitrate / FPS / GOP 제한
각 CDN마다 수용 가능한 스펙이 있습니다:
맞지 않으면 buffering, reject, 또는 quality degrade가 발생합니다.
CDN 내부에서 일어나는 일 — Agora의 책임은 여기까지
중요한 오해를 먼저 없애겠습니다:
CDN 내부 처리 4단계
1) Transmuxing — container만 변경 (가장 중요한 개념)
입력 codec을 그대로 유지하면 transmux만 할 수 있습니다. 실제 플랫폼은 ABR ladder 생성을 위해 transcoding을 함께 수행할 수 있습니다.
2) Segmentation — 스트림을 조각으로 자르기
왜 조각내는가: HTTP로 파일을 전송하려면 "파일"이 있어야 합니다. 연속 스트림을 작은 파일 조각으로 잘라서 HTTP GET으로 가져갈 수 있게 합니다.
3) Manifest 생성 — 재생 목록 파일
시청자의 플레이어는 이 .m3u8 파일을 주기적으로 polling해서 새 segment가 추가되었는지 확인하고, 순서대로 다운로드해서 재생합니다.
4) Edge 캐싱 & 글로벌 배포
segment 파일이 CDN edge 서버에 캐싱되어 시청자 가까이에서 서빙됩니다.
전체 파이프라인 한눈에
세 가지 미디어 형태의 본질적 차이
| 구분 | RTC | RTMP | HLS |
|---|---|---|---|
| 전송 | UDP | TCP | HTTP |
| 단위 | packet | stream | file segment |
| 지연 | 구성에 따라 달라짐 | 구성에 따라 달라짐 | 일반 HLS/LL-HLS와 player 설정에 따라 달라짐 |
| 유실 | 허용 | 불가 (TCP) | 불가 (HTTP) |
| 인터랙션 | 양방향 | 단방향 | 단방향 |
| 시청자 규모 | 토폴로지·서비스 용량에 따라 달라짐 | 배포 구조에 따라 달라짐 | CDN 용량에 따라 달라짐 |
⑤ Cloud Recording — "RTP subscribe → decode → 파일 저장"
패킷 레벨에서 보는 전체 변환 흐름
아래 표는 가능한 미디어 변환을 개념적으로 요약한 것입니다. 실제 제품은 선택한 모드와 codec 호환성에 따라 일부 단계만 수행합니다.
Stream Fallback — 네트워크가 나쁠 때 음성 우선 정책
RTP 레벨에서 오디오와 비디오는 별도의 SSRC를 가진 독립 스트림입니다. 이 특성 덕분에 SDK가 비디오 스트림만 선택적으로 끌 수 있습니다.
Dual Stream Mode가 하는 일
Fallback 설정 시 확인할 것
Agora Video SDK의 dual-stream/simulcast, local publish fallback, remote subscribe fallback, audio profile API는 플랫폼과 major version에 따라 이름과 signature가 달라집니다. enableDualStreamMode(true)나 두 인자를 받는 setAudioProfile 예제를 버전 표기 없이 복사하지 말고, 현재 SDK 레퍼런스의 method signature와 deprecation 상태를 기준으로 작성해야 합니다. Audio-only fallback은 필요한 대역폭을 크게 줄이지만, 극도로 나쁜 네트워크에서도 음성이 반드시 유지된다고 보장하지는 않습니다.
정리: 공개 계약과 구현 추정을 구분한다
Agora 제품은 RTC publish/subscribe, 외부 ingest·egress, recording, transcoding이라는 데이터 흐름으로 이해할 수 있습니다. 다만 "서버 봇", 정확한 SSRC, wire protocol은 공개 API 계약이 아닌 구현 비유입니다.
- Gateway/Pull: 외부 프로토콜 → RTP로 변환해서 publish
- Cloud Transcoding: RTP를 decode → 합성 → encode → 다시 RTP로 publish
- Media Push: 호환 시 remux, 필요하면 transcode한 뒤 외부 ingest로 전달
- Cloud Recording: individual/composite 설정에 따라 mux 또는 decode·compose·encode 후 저장
외부 CDN ingest로 넘기는 구성에서는 이후 동작이 해당 CDN 설정에 달려 있습니다:
- 호환되는 codec이면 transmux할 수 있습니다
- 필요하면 CDN이 transcoding·ABR ladder·segmentation을 수행합니다
- CDN이 manifest를 생성합니다 (.m3u8 재생 목록)
- CDN이 edge에 배포합니다 (글로벌 캐싱)
미디어는 그 여정 내내 형태가 바뀝니다:
하지만 본질은 변하지 않습니다. 카메라에서 찍힌 프레임이 인코딩되고, 패킷화되고, 네트워크를 타고, 다시 디코딩되어 화면에 보이는 것. 클라우드 제품들은 이 파이프라인의 중간에 서버 사이드 처리를 끼워 넣는 것일 뿐입니다. 어떤 제품이든 "이건 어디서 subscribe하고, 무엇을 변환해서, 어디로 publish하는가?"로 이해하면 됩니다.
참고 자료
- RFC 3550 — RTP — RTP header, SSRC, timestamp, sequence number의 표준 정의
- RFC 6184 — RTP Payload Format for H.264 — H.264 NAL aggregation·fragmentation과 marker semantics
- RFC 6716 — Opus — Opus frame duration·bitrate·PLC·FEC
- RFC 7874 — WebRTC Audio Requirements — Opus와 G.711 필수 구현
- RFC 8835 — Transports for WebRTC — ICE, UDP 우선, TURN/TCP·TURN/TLS fallback
- Agora SDRTN — Agora가 공개한 edge network와 intelligent routing 범위
- Agora RTC — RTC·recording·streaming 제품의 공식 개요
- Apple HLS Authoring Specification — HLS segment·variant stream authoring 요구사항