Technical Blog

기술 인사이트

실시간 통신, 미디어 처리, AI 통합에 대한 심층 분석.Agora SDK를 중심으로 프로덕션 레벨의 구현을 다룹니다.

56
포스트
7
카테고리
추천 자료아키텍처 트랙

WebRTC 아키텍처 트랙

WebRTC 아키텍처 글을 읽기 전에 먼저 보는 추천 자료입니다. Mesh, SFU, MCU, Hybrid 구조를 다이어그램과 시퀀스 흐름으로 비교합니다.

아키텍처 트랙 열기
MeshSFUMCUclient loadserver control

블로그 검색 결과

Media
14분 읽기

HLS vs HTTP-FLV vs MP4 — 프로토콜과 컨테이너부터 바로잡는 스트리밍 선택 가이드

HLS, HTTP-FLV, MP4를 같은 종류의 포맷처럼 비교하면 선택 기준이 흐려집니다. HLS와 HTTP-FLV는 전달 방식이고, FLV와 MP4는 미디어를 담는 컨테이너입니다. 이 글은 HLS가 반드시 .ts만 쓰는지, HTTP-FLV가 Flash 종료와 함께 사라졌는지, 1~3초·10~30초라는 지연 수치를 어디까지 믿어야 하는지 검증하고, ABR·브라우저 호환성·CDN 확장성·실시간성에 따라 무엇을 선택할지 정리합니다.

HLSLL-HLSHTTP-FLVFLV+7
Media
12분 읽기

Stream과 RTP의 관계 — Cloud Recording 디버깅에서 헷갈리지 않는 법

stream은 논리적인 미디어 흐름이고 RTP는 그 미디어를 네트워크로 운반하는 패킷 프로토콜입니다. 하지만 WebRTC API의 MediaStream, Agora 운영 문맥의 stream, RTP의 SSRC packet stream은 같은 말이 아닙니다. 이 글은 track, stream, RTP, RTCP의 층위를 분리하고, muteLocalVideoStream, enableLocalVideo, stopPreview, leaveChannel이 Cloud Recording에서 어떻게 다르게 보이는지 검증된 기준으로 정리합니다.

WebRTCAgoraCloud RecordingRTP+6
Fundamentals
17분 읽기

WebRTC 전송과 토폴로지 — ICE, Full Mesh, SFU

WebRTC가 ICE를 통해 host·server-reflexive·relay candidate를 점검하고, 환경에 따라 UDP 또는 TURN/TCP·TURN/TLS relay를 사용하는 방식을 설명합니다. Full Mesh에서는 참가자 수에 따라 각 client의 연결과 송신 복제량이 늘고, SFU는 일반적으로 media frame을 decode·mix·re-encode하지 않은 채 RTP packet을 선택 전달합니다. 실제 topology는 device·network·recording·E2EE 요구를 기준으로 부하 시험해 결정해야 합니다.

WebRTCSFUFull MeshICE+6
AI
20분 읽기

TEN Framework TTS 구현 읽기 — Extension과 Client, HTTP Streaming과 WebSocket

TEN Framework main의 OpenAI·ElevenLabs TTS extension을 실제 소스 기준으로 읽습니다. Extension이 config와 client 생성을 맡고 vendor client가 합성·취소·정리를 처리하는 경계, OpenAI의 재사용 HTTP/2 client, ElevenLabs의 WebSocket 입력 흐름을 비교합니다. 지연과 chunk 크기는 고정 권장값 대신 provider 문서와 서비스 환경의 계측값으로 판단합니다.

TEN FrameworkTTSExtensionClient+6
Architecture
16분 읽기

WebRTC 아키텍처 — Mesh, SFU, MCU, Hybrid 비교

Mesh, SFU, MCU, Hybrid의 media path와 처리 경계를 토폴로지·시퀀스 다이어그램으로 비교합니다. Mesh의 direct path에는 TURN relay 예외가 있고, SFU는 선택 전달, MCU는 서버 합성을 담당합니다. 참가자 수만으로 결론을 내리지 않고 codec·subscription·layout·region·hardware·recording 요구를 함께 검증하는 기준을 제시합니다.

WebRTCMeshSFUMCU+3
Media
18분 읽기

HLS와 DASH 비교 — 매니페스트, 세그먼트, DRM, 저지연

HLS와 DASH를 매니페스트 문법, 세그먼트 형식, ABR, DRM, 저지연 확장 기준으로 비교합니다. 두 프로토콜이 fMP4를 사용할 때 CMAF 미디어 세그먼트를 공유할 수 있는 조건과 Apple 플랫폼의 HLS 요구사항도 함께 설명합니다. LL-HLS는 HTTP/2 Push가 아니라 blocking playlist reload와 preload hint를 사용한다는 점을 현재 사양에 맞춰 정리했습니다.

HLSDASHCMAFfMP4+8
Media
22분 읽기

라이브 스트리밍 송출 파이프라인 — Ingest, Transcoding, HLS, CDN

OBS의 RTMP·RTMPS 출력이 ingest, transcoding, ABR packaging, CDN, player buffer를 거쳐 재생되는 경로를 분해합니다. 전체 지연은 세그먼트 길이 하나가 아니라 인코더, 패키저, 배포망, 플레이어 설정의 합으로 결정됩니다. AWS MediaLive와 MediaConvert의 역할 차이와 상호작용 요구에 따라 HLS 계열과 WebRTC를 선택하는 기준도 다룹니다.

라이브 스트리밍RTMPHLSABR+7
Media
20분 읽기

SFU 확장 구조 — 단일 노드 용량과 Cascading

Full Mesh, 단일 SFU, 지역 간 SFU cascading, CDN 기반 방송 구조의 부하 특성을 비교합니다. SFU 용량은 참가자 수만으로 정해지지 않고 publish·subscribe 수, simulcast layer, bitrate, packet rate, 암호화, 하드웨어에 따라 달라집니다. 따라서 예시 계산은 용량 계획의 출발점으로만 사용하고 실제 트래픽 모델로 부하 시험해야 합니다.

SFUMCUMeshP2P+6
Media
18분 읽기

모바일 영상 파이프라인의 발열 — 메모리 복사, GPU Texture, Zero-Copy, 하드웨어 코덱

카메라 캡처부터 색공간 변환, 인코딩, 디코딩, 렌더링까지 모바일 영상 경로에서 메모리 복사와 CPU·GPU·하드웨어 코덱 사용이 발열에 미치는 영향을 설명합니다. Android SurfaceTexture와 iOS CVPixelBuffer 같은 플랫폼별 버퍼 공유 방식도 비교합니다. 실제 전력 효과는 단말과 코덱 지원에 따라 달라지므로 계측 기준을 함께 제시합니다.

Zero-CopyGPUTextureSurfaceTexture+6
Fundamentals
25분 읽기

하나의 C++ 코어로 iOS와 Android를 — 네이티브 코드, 크로스 컴파일, .so/.a, JNI, Objective-C++

공통 C++ 코어를 Android와 iOS에 배포할 때 필요한 ABI별 빌드와 플랫폼 바인딩을 설명합니다. Android의 JNI와 shared library, iOS의 Objective-C++와 static library·XCFramework를 구분하고, 네이티브 코어 업데이트가 앱 재빌드와 배포를 요구하는 이유도 함께 다룹니다.

C++JNIObjective-C++크로스 컴파일+8
Telephony
25분 읽기

iOS VoIP 통합의 4-레이어 모델 — CallKit · PushKit · AVAudioSession · Agora ADM

PushKit 수신, CallKit transaction, AVAudioSession activation, RTC SDK audio module의 책임을 네 계층으로 나눕니다. `didActivate`와 `didDeactivate`, interruption·route change callback을 어떤 상태 전이에 연결할지 설명하며, channel join 시점과 audio module 제어는 사용 중인 SDK 계약에 맞춰 검증합니다.

iOSCallKitPushKitAVAudioSession+5
Architecture
25분 읽기

RTC 미디어 경로 해부 — RTP에서 Media Push·Cloud Recording까지

RTC 채널의 압축 프레임이 RTP로 패킷화되는 과정과 서버 측 미디어 제품이 그 흐름에 개입하는 지점을 추적합니다. Media Gateway·Media Pull·Cloud Transcoding·Media Push·Cloud Recording을 입력, 변환, 출력 기준으로 구분하고 CDN 송출과 stream fallback까지 같은 데이터 경로 위에서 설명합니다.

RTPRTCPMedia GatewayMedia Pull+4
Backend
10분 읽기

Google TTS 캐시 파이프라인 — R2, DB, 브라우저 전달

Google TTS 결과를 R2에 캐시하고 브라우저에 전달하는 서버 파이프라인을 다룹니다. 음성 출력에 영향을 주는 모든 설정을 canonical JSON으로 묶어 캐시 키를 만들고, 동시 cache miss와 stale metadata를 처리하며, R2 저장 후 DB를 갱신하는 순서를 설명합니다. 인증·rate limit·내구성 있는 후속 작업까지 포함한 운영 기준도 함께 정리했습니다.

TTSR2캐시Base64
Media
12분 읽기

Bitrate와 화질 — 같은 해상도인데 왜 결과가 다른가

Bitrate는 해상도·frame rate·codec·장면 복잡도와 함께 압축 화질을 좌우합니다. 이 글은 송출 설정, 네트워크 적응, Cloud Recording 출력 설정을 구분하고 `ffprobe`로 실제 결과를 측정하는 절차를 설명합니다. 출력 bitrate를 높여도 원본에서 이미 잃은 디테일은 복원되지 않으므로 실제 콘텐츠로 품질을 비교해야 합니다.

BitrateCloud RecordingHLSffprobe+1
Backend시리즈
15분 읽기

FFmpeg 실전 파이프라인 — Agora 녹화에서 프로덕션 VOD까지

Individual recording 결과를 참가자별 VOD나 하나의 composite 화면으로 후처리하는 FFmpeg 파이프라인을 설명합니다. M3U8과 TS를 점검하고 기록된 track의 시작 시각을 맞춘 뒤, audio-only·video-only 입력과 참가자 수를 검증해 레이아웃을 구성합니다. 입력값 제한, 경로 검증, 실패 복구를 포함한 자동화 기준도 함께 다룹니다.

FFmpegCloud Recordingfilter_complexCRF+1
Backend시리즈
14분 읽기

FFmpeg 미디어 처리 — 컨테이너, 코덱, 스트림

FFmpeg에서 컨테이너, 코덱, 스트림을 구분하고 probe·demux·decode·filter·encode·mux 단계가 어떻게 연결되는지 설명합니다. `-c copy`는 입력 코덱과 출력 컨테이너, timestamp와 keyframe 조건이 맞을 때만 안전합니다. remux, transcoding, stream mapping, seek, concat을 선택하는 기준을 실제 명령으로 정리했습니다.

FFmpegCodecContainerMuxing+1
Media시리즈
12분 읽기

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

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

Cloud RecordingIndividualCompositeWeb page recording
Backend시리즈
8분 읽기

내 서버에서 직접 녹화한다면 — On-Premise vs Cloud Recording

데이터 위치·처리자·보유 방식에 대한 계약이나 규제 요구가 Cloud Recording의 데이터 흐름과 맞지 않을 때 On-Premise Recording을 검토할 수 있습니다. 이 글은 배포 위치, 운영 책임, 후처리 통제 범위를 Cloud 방식과 비교하고 raw-data callback은 사용하는 SDK 버전의 API 계약으로 확인해야 한다는 기준을 제시합니다.

On-Premise RecordingCloud RecordingYUVRaw Data+1
Backend시리즈
10분 읽기

실시간 통화, 왜 녹화해야 하는가 — Cloud Recording Architecture

WebRTC는 미디어 저장 방식을 정의하지 않으므로 녹화가 필요하면 별도 파이프라인을 설계해야 합니다. 이 글은 브라우저 `MediaRecorder`, 자체 미디어 서버, Agora Cloud Recording의 통제 범위와 운영 부담을 비교합니다. Cloud Recording의 non-streaming client 모델, `acquire → start → query → stop` 수명주기, REST 인증과 RTC token의 역할도 구분합니다.

Cloud RecordingNon-streaming ClientSD-RTNREST API
Backend
8분 읽기

Cloud Recording 녹화 파일은 어떻게 저장되는가? — S3 실시간 업로드, 끊김 복구, 재생까지

Cloud Recording 산출물이 object storage에 기록되는 방식과 장애 후 처리 절차를 설명합니다. TS·M3U8·MP4의 분할 조건, recording server failover 시 생성되는 backup playlist, stop·query 응답의 file list를 구분합니다. 애플리케이션에서는 사용자 소유권을 확인한 뒤 저장된 object key로 짧은 수명의 presigned URL을 발급해야 합니다.

Cloud RecordingS3HLSMP4+1
Media
10분 읽기

Agora의 기업 방화벽 우회 전략 — Cloud Proxy와 Firewall Whitelist

제한된 enterprise network에서 Agora RTC에 필요한 domain·port allowlist와 Cloud Proxy를 비교합니다. UDP 차단, 고정 outbound 정책, TLS inspection 같은 조건에 따라 적용 범위가 달라지며 어느 방식도 모든 방화벽 통과를 보장하지 않습니다. 운영망에서 join·publish·subscribe를 검증하는 절차를 함께 제시합니다.

FirewallCloud ProxyUDP/TCP

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

포스트 12–17은 연재 글입니다. 순서대로 읽으시면 전체 맥락을 이해할 수 있습니다.

© 2026 Frank Kim. All rights reserved.