Agora Cloud Recording으로 상담 통화를 녹화하면 녹음 파일이 S3에 어떻게 올라가는지, 중간에 끊기면 어떻게 되는지, MP4는 몇 개나 생기는지 — 처음 도입할 때 궁금했던 것들을 정리합니다. 마지막에는 S3에 저장된 녹음을 presigned URL로 재생하는 실제 코드도 포함했습니다.
실시간으로 S3에 올라가는가?
녹화가 끝나고 한꺼번에 올리는 게 아닙니다. 녹화 중에 조각(TS 파일)이 실시간으로 S3에 업로드됩니다.
Cloud Recording은 내부적으로 HLS(HTTP Live Streaming) 방식을 사용합니다. HLS는 미디어를 짧은 TS(Transport Stream) 조각으로 분할하고, M3U8 인덱스 파일로 순서를 관리하는 구조입니다.
녹화 진행 중 (30분 상담):
─────────────────────────────────────────
[0초] Agora 서버에서 녹화 시작
│
[0~10초] TS 조각 001 생성 → 바로 S3 업로드 ✅
[10~20초] TS 조각 002 생성 → 바로 S3 업로드 ✅
[20~30초] TS 조각 003 생성 → 바로 S3 업로드 ✅
...
[30분] 녹화 종료
│
├── M3U8 인덱스 파일 최종 업로드
└── MP4 파일 생성 후 업로드 (설정한 경우)
HLS(TS 조각)는 실시간으로, MP4는 녹화가 끝난 후에 생성됩니다. 이 차이가 중요합니다. TS는 "원본 데이터"이고, MP4는 그걸 합쳐서 재생하기 편하게 만든 "가공물"입니다.
끊기면 어떻게 되는가?
여기가 Cloud Recording의 장점이 드러나는 부분입니다. TS 조각이 실시간으로 올라가기 때문에, 네트워크가 끊겨도 이미 업로드된 조각은 S3에 그대로 남아있습니다.
정상 종료:
─────────────────────────────────────────
TS 001 ✅ → TS 002 ✅ → TS 003 ✅ → ... → TS 180 ✅
│
M3U8 최종 업로드 ✅
MP4 생성 후 업로드 ✅
비정상 종료 (네트워크 끊김 등):
─────────────────────────────────────────
TS 001 ✅ → TS 002 ✅ → TS 003 ✅ → 💥 끊김
│
여기까지의 TS는 이미 S3에 있음 ✅
M3U8도 중간중간 업데이트됨
BUT: MP4는 생성 안 됨 ❌
(MP4는 녹화가 정상 완료돼야 만들어지므로)
끊겼을 때 파일별 상태를 정리하면:
파일
상태
설명
TS 조각
✅ S3에 남아있음
이미 업로드된 조각은 유실 없음
M3U8
✅ 마지막 업데이트 시점까지 존재
중간중간 갱신되므로 부분 인덱스라도 있음
MP4
❌ 생성 안 됨
최종 완성 시점에 만들어지는 파일이라 없음
MP4가 없어도 TS 파일이 살아있으니, FFmpeg로 직접 복구할 수 있습니다.
# 끊긴 후 S3에 남은 TS 파일들로 MP4 복구
ffmpeg -i recording.m3u8 -c copy recovered.mp4
실제로 이 복구를 해 본 적이 있는데, M3U8 인덱스가 중간까지라도 있으면 깔끔하게 복구됩니다. M3U8마저 없으면 TS 파일들을 직접 concat 해야 해서 좀 번거롭습니다.
MP4는 계속 새로 만드는가?
30분짜리 음성 상담이면 MP4 1개로 끝납니다. 분할이 발생하는 건 장시간 녹화에서입니다.
MP4 분할 조건 (Composite 모드):
─────────────────────────────────────────
약 2시간 초과 OR 약 2GB 초과 → 새 MP4 파일 생성
(maxVideoDuration 파라미터로 분할 기준 변경 가능)
30분 상담 (음성만):
용량: ~10.8 MB → 분할 없음, MP4 1개 ✅
3시간 회의 (영상+음성):
→ recording_001.mp4 (0~2시간)
→ recording_002.mp4 (2~3시간)
일반적인 1:1 상담이나 CS 통화에서는 MP4 분할을 신경 쓸 일이 거의 없습니다. 분할이 걱정되는 건 수 시간짜리 웨비나나 라이브 방송 녹화 정도입니다.
S3 녹음 파일 재생 — 실제 코드
Cloud Recording으로 S3에 저장된 MP4를 웹에서 재생하려면, presigned URL을 발급해서 브라우저에서 직접 스트리밍하는 방식이 가장 깔끔합니다. 백엔드는 URL만 만들어주고, 실제 파일 전송은 S3가 직접 처리합니다.