블로그 목록
시리즈: 실시간 통화, 어떻게 녹화하는가3/6
  1. 1.실시간 통화, 왜 녹화해야 하는가
  2. 2.내 서버에서 직접 녹화한다면
  3. 3.Agora 녹화 모드 비교 ← 현재 글
  4. 4.M3U8과 TS 구조
  5. 5.FFmpeg 미디어 처리
  6. 6.FFmpeg 실전 파이프라인
Media시리즈12분 읽기

Agora 녹화 모드 비교 — Individual, Composite, Web page

Individual, Composite(`mix`), Web page recording의 출력과 처리 범위를 비교합니다. Individual은 참가자별 track 후처리에, Composite는 서버 합성과 고정 레이아웃 출력에, Web page recording은 웹 화면 캡처에 맞습니다. 과금은 모드 이름이 아니라 스트림 수·시간·합산 해상도 등 공식 가격 기준으로 확인해야 합니다.

Cloud RecordingIndividualCompositeWeb page recording

같은 채널을 녹화해도 모드에 따라 출력 파일 구조와 후처리 방식이 달라집니다. 다만 Agora Cloud Recording 요금은 Individual과 Composite 중 어떤 모드를 선택했는지가 아니라 녹화한 스트림 수·시간·합산 해상도로 계산됩니다.

Agora Cloud Recording은 Individual, Composite(mode=mix), Web page recording 세 가지 모드를 제공합니다. 이 글에서는 공개 문서로 확인되는 출력 동작과 선택 기준을 정리합니다.


Individual 모드 — UID별 분리 저장

Individual 모드는 참가자별 audio/video stream을 UID 단위 파일로 저장합니다.

RTC Channel
  │
  ├─ User A stream ──→ UID별 audio/video slice + M3U8
  ├─ User B stream ──→ UID별 audio/video slice + M3U8
  └─ User C stream ──→ UID별 audio/video slice + M3U8

합성: 없음 (각 UID 독립 저장)
출력: UID별 M3U8 + TS/WebM slice

Compositing 단계는 없습니다. audio/video를 모두 녹화하면서 streamMode=standard를 사용하면 UID별 audio M3U8, video M3U8과 함께 두 track을 재생하는 merged M3U8이 생성됩니다. Individual recording은 MP4를 생성하지 않습니다.

transcoding 여부는 media type과 streamMode에 따라 다릅니다. default와 standard에서 비디오는 transcoding하지 않고 오디오는 transcoding합니다. original은 audio-only recording에만 적용되며 오디오도 transcoding하지 않습니다.

파일명과 M3U8의 Agora track event에는 UTC 시각 정보가 포함됩니다. 여러 UID를 후처리로 합칠 때는 이 정보와 실제 stream timestamp를 기준으로 sync를 맞춥니다.

주요 사용 사례:

  • STT(Speech-to-Text): 화자별 오디오를 독립적으로 처리하기 쉬움
  • AI 분석: 특정 참가자의 발화 패턴, 감정 분석 등
  • 후처리 유연성: 나중에 원하는 레이아웃으로 직접 합성

Composite 모드 — Audio/video 합성

Composite 모드는 구독한 참가자의 스트림을 하나의 output으로 합성합니다. 여기서 "합친다"는 말이 오디오와 비디오에서 다른 처리를 의미합니다. 오디오부터 살펴봅니다.

Audio Mixing (오디오 믹싱)
─────────────────────────────────────────────
User A: ~~~~▓▓▓░░▓▓▓~~~~  (PCM waveform)
User B: ~~▓░░▓▓▓▓░░▓▓~~  (PCM waveform)
User C: ~~~~░░▓▓▓▓▓░░~~  (PCM waveform)
              ↓
        Sample-level Addition
        (각 시점의 amplitude 값을 더함)
              ↓
Output: ~~▓▓▓▓▓▓▓▓▓▓▓▓~~  (단일 PCM stream)
              ↓
        AAC/Opus Encoding
              ↓
        mixed audio track

PCM(Pulse Code Modulation) 이란 아날로그 오디오를 디지털로 변환한 raw 데이터입니다. 초당 44,100개(CD 품질) 혹은 48,000개(방송 품질)의 샘플로 파형을 숫자로 표현합니다.

위 그림은 일반적인 audio mixing을 단순화한 개념도입니다. 실제 mixer는 sample rate와 channel layout을 맞추고, gain·normalization·limiting 같은 처리를 조합할 수 있습니다.

문제는 여기서 발생합니다. 세 사람이 동시에 말하면 amplitude 합이 최대값을 초과합니다.

Clipping: 16-bit signed PCM의 범위는 -32768~32767입니다. 합산 결과가 표현 범위를 벗어나면 clipping이 생길 수 있습니다. Agora가 Composite recording 내부에서 AGC를 어떤 순서로 적용하는지는 공개 문서로 확인되지 않으므로 특정 처리 순서를 전제로 설계해서는 안 됩니다.


Composite 모드 — Video Compositing 기술 상세

비디오 합성은 오디오보다 훨씬 계산 집약적입니다.

Video Compositing (비디오 합성)
─────────────────────────────────────────────
┌────────┐ ┌────────┐ ┌────────┐
│ User A │ │ User B │ │ User C │
│ 720p   │ │ 720p   │ │ 720p   │
│ YUV420 │ │ YUV420 │ │ YUV420 │
└────┬───┘ └────┬───┘ └────┬───┘
     │          │          │
     ▼          ▼          ▼
┌──────────────────────────────┐
│     Canvas (1920x1080)       │
│  ┌──────┐ ┌──────┐ ┌──────┐ │
│  │  A   │ │  B   │ │  C   │ │
│  └──────┘ └──────┘ └──────┘ │
└──────────────┬───────────────┘
               │
         H.264/VP8 Encoding
               │
         mixed video track

YUV 4:2:0은 밝기와 색차를 분리하고 색차를 가로·세로 방향으로 subsampling합니다. 압축하지 않은 8-bit RGB 4:4:4의 24 bit/pixel과 8-bit YUV 4:2:0의 12 bit/pixel을 비교하면 표본 데이터는 절반입니다. bit depth와 pixel format이 다르면 이 계산도 달라집니다.

Frame compositing: 여러 입력 영상을 layout의 영역에 맞게 scale/crop하고 하나의 출력 frame으로 합성하는 일반적인 처리입니다. Agora 내부 구현이 특정 pixel blitting 방식을 사용한다고 공개되어 있지는 않습니다.

Layout Engine: Agora는 그리드, 사이드바, 커스텀 좌표 등 배치 설정을 API로 제어할 수 있습니다. 레이아웃 설정에 따라 각 유저 프레임이 Canvas의 어느 좌표에 blitting될지가 결정됩니다.

전체 파이프라인을 표로 정리하면:

단계오디오비디오
1. 입력 처리구독한 audio stream구독한 video stream
2. 합성여러 audio를 한 output track으로 합성layout에 따라 한 output frame으로 합성
3. 출력HLS audioHLS video
4. 컨테이너TS/HLS, 설정 시 MP4같은 output에 포함

입력 수, 해상도, frame rate, codec과 layout은 합성 처리량에 영향을 줍니다. 증가율이 항상 선형이라고 단정할 수는 없으므로 자체 후처리와 비교할 때 실제 workload로 측정해야 합니다.


Muxing vs Mixing — 자주 혼동되는 두 개념

이 맥락에서 헷갈리기 쉬운 두 용어를 명확히 구분합니다.

Mixing: 여러 스트림을 하나로 합치는 것 (오디오 믹싱, 비디오 컴포지팅)

Muxing (Multiplexing): 이미 완성된 오디오/비디오 트랙을 하나의 컨테이너(MP4)에 담는 것

비유하자면:

  • Mixing = 여러 재료를 섞어서 하나의 요리를 만드는 것 (재료가 합쳐져 구별 불가)
  • Muxing = 완성된 반찬들을 도시락 통에 담는 것 (각 트랙은 독립적으로 존재, 컨테이너만 공유)

MP4 파일 안에는 H.264 비디오 트랙과 AAC 오디오 트랙이 별도로 존재합니다. 이 둘을 MP4 컨테이너로 묶는 것이 Muxing입니다. Mixing은 그 이전 단계에서, 여러 참가자 스트림을 각각 단일 트랙으로 합치는 작업입니다.


Web page recording — 웹앱 화면 녹화

Web page recording은 지정한 URL의 화면과 오디오를 하나의 output으로 기록합니다. 녹화 대상 웹앱은 Chrome을 지원해야 하지만, Agora가 사용하는 browser engine과 capture pipeline의 세부 구현은 공개 API 계약이 아닙니다.

                          ┌─────────────────────────────────┐
                          │      Web page recording         │
Your Web App URL ────────→│                                  │
                          │  Chrome-compatible web app      │
                          │       │                          │
                          │  ┌──────────────────────┐        │
                          │  │  Rendered Web Page   │        │
                          │  │ ┌────┐ ┌──────────┐  │        │
                          │  │ │영상│ │ 채팅     │  │        │
                          │  │ │카메라│ │ 메시지들 │ │        │
                          │  │ └────┘ └──────────┘  │        │
                          │  │ ┌────────────────────┐│        │
                          │  │ │ 화이트보드          ││        │
                          │  │ └────────────────────┘│        │
                          │  └───────────┬────────────┘        │
                          │              │                    │
                          │       화면과 audio capture        │
                          │              │                    │
                          │       M3U8 + TS, optional MP4     │
                          └─────────────────────────────────┘

웹앱은 지정 URL로 접근 가능해야 하고, 녹화할 모든 콘텐츠가 scroll 없이 한 화면에 표시되어야 합니다. host의 조작을 녹화하려면 그 상태를 웹앱이 recording page에도 동기화해야 합니다.

Web page recording은 지정 URL의 렌더링 결과와 page audio를 녹화하므로, capture 환경에서 정상 렌더링되는 화이트보드·채팅·커스텀 UI를 결과에 포함할 수 있습니다. 브라우저 권한, DRM, cross-origin resource와 자동 재생 정책은 별도로 검증해야 합니다.

Web page recording은 별도 가격 정책을 사용합니다. 내부 process별 CPU·메모리 수치는 공개 문서로 확인되지 않으므로 임의의 상대 배수로 비교하지 않습니다.

녹화 전용 웹페이지 설계 패턴

Web 모드를 사용하려면 Agora 서버가 접속할 웹페이지를 직접 만들어야 합니다. 이 페이지는 세 가지 역할을 합니다:

  1. 짧은 수명의 opaque recording job ID로 bootstrap 정보를 조회
  2. 원하는 레이아웃으로 참가자 비디오를 배치
  3. 녹화에 최적화된 UI (컨트롤 버튼 없음, 고정 해상도)
<!-- recording-page.html -->
<!-- URL: https://your-app.com/recording?job=opaque-short-lived-id -->
<div id="video-grid" style="display:grid; grid-template-columns:1fr 1fr; width:1280px; height:720px;">
  <!-- 리모트 비디오가 여기에 자동 배치 -->
</div>
<script type="module">
  // URL에는 RTC token을 직접 넣지 않는다.
  const params = new URLSearchParams(location.search);
  const jobId = params.get('job');

  const response = await fetch('/api/recording/bootstrap', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ jobId }),
  });
  if (!response.ok) throw new Error('recording bootstrap failed');

  const { channel, token } = await response.json();
  // 검증된 channel/token으로 Agora SDK join 및 remote stream subscribe
</script>

이 페이지는 실제 사용자에게 노출되는 앱과 분리된 녹화 전용 URL로 배포하는 것이 일반적입니다. 사용자는 이 URL을 직접 방문하지 않고, Agora 서버만 이 URL에 접속합니다.


처리와 요금 비교

공개 문서로 확인되는 처리 차이를 비교하면:

병목IndividualCompositeWeb page
디코딩유저별 1회유저별 1회브라우저가 처리
합성없음매 프레임 compositing브라우저 DOM 렌더링
출력UID별 파일합성된 단일 output웹페이지 화면의 단일 output
요금 기준스트림 수·시간·합산 해상도스트림 수·시간·합산 해상도Web page recording 별도 가격

Agora 공식 문서는 Individual과 Composite의 녹화 요금이 모드 선택에 좌우되지 않는다고 명시합니다. 자체 FFmpeg 후처리를 추가하면 그 compute·storage·운영 비용은 별도로 계산해야 합니다.


모드 선택 Decision Matrix

요구사항을 기준으로 정리하면:

요구사항추천 모드
화자별 분리 (STT, AI 분석)Individual
다시보기 영상 하나로Composite
화이트보드/웹앱 UI 포함Web
UID별 후처리Individual
별도 합성 작업 없는 단일 결과Composite

Individual 결과를 FFmpeg으로 합성하는 방식은 layout을 사후 결정할 수 있지만 추가 compute와 운영 pipeline이 필요합니다. 비용 절감 여부는 Agora 요금과 자체 후처리 비용을 함께 측정해야 합니다.


핵심 요약

  • Individual 모드는 UID별 M3U8과 slice를 저장합니다. standard는 UID별 merged M3U8을 추가하지만 MP4를 생성하지 않습니다.
  • Composite 모드는 구독한 audio/video를 합성해 하나의 HLS output을 만들고, 설정하면 MP4도 생성합니다.
  • Muxing(컨테이너에 담기)과 Mixing(스트림 합성)은 다른 개념입니다. 혼용하면 아키텍처 논의에서 혼선이 생깁니다.
  • Web page recording은 Chrome-compatible 웹페이지의 화면과 오디오를 녹화합니다. 내부 browser engine 구현은 공개 계약이 아닙니다.
  • 모드 선택은 출력 구조와 후처리 방식에 영향을 주지만 Individual/Composite 녹화 요금 자체를 결정하지는 않습니다.

시리즈 네비게이션

실시간 통화, 어떻게 녹화하는가 시리즈

  1. 실시간 통화, 왜 녹화해야 하는가 — Cloud Recording Architecture
  2. 내 서버에서 직접 녹화한다면 — On-Premise vs Cloud Recording
  3. 녹화 모드 해부 ← 현재 글
  4. M3U8과 TS 구조 — HLS 녹화 파일 읽기
  5. FFmpeg 미디어 처리 — 컨테이너, 코덱, 스트림
  6. FFmpeg 실전 파이프라인 — Agora 녹화에서 프로덕션 VOD까지

관련 글

참고 자료

© 2026 Frank Kim. All rights reserved.