SCTE-35 마커 파싱 및 다중 플랫폼 플레이어 통합을 통한 클라이언트 측 광고 삽입(CSAI)
한 비디오 스트리밍 플랫폼은 웹, 모바일 및 커넥티드 TV 앱 전반에 걸쳐 Client-Side Ad Insertion (CSAI)을 구현해야 했습니다. 이는 서버 측 삽입으로는 제공할 수 없는, 클릭 가능한 오버레이, 컴패니언 배너, 건너뛰기 버튼 등 완전한 광고 상호작용 지원을 통해 개인화된 기기 수준의 광고 경험을 가능하게 합니다.
프로젝트 상담하기
과제
이 플랫폼은 이전에 SSAI (server-side ad insertion)만을 사용하고 있었는데, 이는 수익화는 잘 처리했지만 인터랙티브 광고 경험에는 상당한 제약이 있었습니다.
- SSAI로 스티칭된 광고는 클릭 가능한 오버레이, 컴패니언 배너 또는 인터랙티브 광고 단위를 지원할 수 없었습니다.
- 프리미엄 광고 구매자가 요구하는 클라이언트 측 광고 이벤트 (쿼타일 진행, 시청 가능성, 클릭률)를 추적할 수 없었습니다.
- 커넥티드 TV 플랫폼 (Roku, Fire TV, Apple TV)은 자체 네이티브 광고 프레임워크 및 인증 요건을 위해 CSAI를 기대했습니다.
- HLS/DASH 매니페스트의 SCTE-35 마커는 클라이언트에서 파싱되어야 했지만, 각 플레이어 SDK는 큐 이벤트를 다르게 처리했습니다.
- 광고 포드 관리 (여러 광고로 다중 슬롯 광고 브레이크 채우기)는 클라이언트 측 오케스트레이션을 필요로 했습니다.
- 웹 플랫폼에서 수익을 보호하기 위해 광고 차단기 감지 및 폴백 로직이 필요했습니다.
- 콘텐츠 버퍼를 중단하지 않고 광고를 미리 로드하려면 신중한 플레이어 수명 주기 관리가 필요했습니다.
우리의 솔루션
저희는 크로스 플랫폼 CSAI 프레임워크를 구축했습니다. 이 프레임워크는 통합 광고 오케스트레이션 레이어를 갖추고 있으며, HLS/DASH 매니페스트에서 SCTE-35 마커를 파싱하고, VAST/VMAP 광고 서버와 통신하며, 웹 (Video.js/Shaka), iOS (AVPlayer), Android (ExoPlayer) 및 커넥티드 TV 플레이어 전반에 걸쳐 광고 재생 수명 주기를 관리합니다.
아키텍처
- 콘텐츠 전송: AWS MediaPackage + CloudFront를 통한 SCTE-35 마커가 포함된 HLS/DASH 스트림
- 광고 결정 서버: VAST 4.2 및 VMAP 지원을 포함하는 Google Ad Manager (GAM) / SpotX
- 웹 플레이어: 맞춤형 SCTE-35 큐 파서 및 Google IMA SDK 통합을 갖춘 Video.js
- iOS 플레이어: AVPlayer with
AVDateRangeMetadataGroup리스너 및 IMA iOS SDK - Android 플레이어: ExoPlayer with
MetadataOutput리스너 및 IMA Android SDK - 커넥티드 TV: 광고 프레임워크 어댑터를 갖춘 플랫폼 네이티브 플레이어 (Roku RAF, Fire TV IMA, Apple TV AVKit)
- 광고 분석: 노출, 쿼타일, 완료, 클릭 및 시청 가능성 추적을 위한 맞춤형 이벤트 파이프라인
- 폴백: 광고 채우기가 불가능하거나 광고 차단기가 감지될 때 슬레이트/하우스 광고 전송
SCTE-35 클라이언트 측 파싱
HLS 매니페스트 마커
SCTE-35 신호는 HLS 매니페스트에 두 가지 형식으로 나타나며, 둘 다 클라이언트에서 파싱됩니다.
EXT-X-DATERANGE (HLS v7 이상)- 플레이어는
SCTE35-OUT및SCTE35-IN속성을 가진#EXT-X-DATERANGE태그를 수신합니다. - 속성에는 광고 브레이크 길이를 위한
PLANNED-DURATION과 이벤트 상관관계를 위한ID가 포함됩니다. - 최신 플레이어 (AVPlayer, ExoPlayer, Shaka)를 위한 선호 형식
#EXT-X-CUE-OUT:DURATION=<seconds>는 광고 브레이크 시작을 표시합니다.#EXT-X-CUE-IN은 콘텐츠로의 복귀를 표시합니다.- 오래된 플레이어 및 인코더와의 하위 호환성을 위해 지원됩니다.
DASH 매니페스트 마커
- SCTE-35 신호는 DASH MPD에서
schemeIdUri="urn:scte:scte35:2013:xml"을 가진<EventStream>요소로 나타납니다. <Event>요소는presentationTime,duration, 그리고 base64 인코딩된 SCTE-35 바이너리 페이로드를 포함합니다.- Shaka Player와 ExoPlayer는 자체 이벤트 리스너 API를 통해 이를 네이티브로 파싱합니다.
마커 처리 흐름
- 감지 — 플레이어 메타데이터 리스너는 매니페스트 파싱 중 SCTE-35 큐 이벤트를 감지합니다.
- 추출 — 마커에서 브레이크 지속 시간, 이벤트 ID 및 세그먼테이션 유형을 추출합니다.
- 광고 요청 — 타겟팅 매개변수 (콘텐츠 ID, 장르, 기기 유형, 사용자 세그먼트, 지리)와 함께 VAST/VMAP 요청이 광고 결정 서버로 전송됩니다.
- 포드 계획 — 광고 응답을 파싱하여 광고 포드 (브레이크 지속 시간을 채우는 광고 크리에이티브의 정렬된 목록)를 구축합니다.
- 사전 로드 — 광고 브레이크 시작 시 지연 시간을 없애기 위해 콘텐츠 재생 중 광고 크리에이티브를 미리 로드합니다.
- 일시 정지 및 전환 — 큐 포인트에서 콘텐츠 재생이 일시 정지되고, 플레이어는 광고 재생으로 전환합니다.
- 광고 재생 — 쿼타일 추적, 컴패니언 배너 표시 및 클릭률 처리를 통해 광고가 순차적으로 재생됩니다.
- 재개 — 포드 완료 후, 큐 포인트 다음의 정확한 프레임부터 콘텐츠 재생이 재개됩니다.
플랫폼별 구현
웹 (Video.js + IMA SDK)
- 사용자 지정 Video.js 플러그인은
textTrack큐 변경 이벤트를 통해#EXT-X-DATERANGE메타데이터를 가로챕니다. - Google IMA HTML5 SDK는 VAST 광고 요청, 광고 재생 및 컴패니언 렌더링을 관리합니다.
- 클릭률 및 건너뛰기 버튼 지원을 위해 비디오 요소 위에 광고 컨테이너 오버레이를 배치합니다.
- 카나리아 요청을 통한 광고 차단기 감지 — 감지 시 하우스 광고 또는 콘텐츠 재개로 폴백합니다.
- VMAP 또는 수동 큐 포인트 스케줄링을 통한 프리롤, 미드롤 및 포스트롤 지원
iOS (AVPlayer + IMA SDK)
- SCTE-35 큐를 감지하기 위해
AVPlayerItem.navigationMarkerGroups및AVDateRangeMetadataGroup이 사용됩니다. AVPlayerItemMetadataOutput델리게이트는 파싱된 타이밍 및 페이로드와 함께 각 큐 이벤트에서 실행됩니다.- Google IMA iOS SDK는 별도의
AVPlayer인스턴스에서 VAST 요청 및 광고 재생을 처리합니다. - 플랫폼 광고 정책에 따라 광고 브레이크 중 Picture-in-Picture (PiP)가 일시 정지됩니다.
- 백그라운드 오디오 처리 — 광고는 백그라운드 모드에서 재생되지 않습니다.
Android (ExoPlayer + IMA SDK)
MetadataOutput을 포함하는Player.Listener.onMetadata()는 HLS/DASH에서 SCTE-35 이벤트를 캡처합니다.- Google IMA Android SDK는 ExoPlayer의
ImaAdsLoader확장을 통해 통합됩니다. - 광고 재생은 콘텐츠 버퍼 오염을 방지하기 위해 별도의
MediaSource를 사용합니다. - 액티비티 수명 주기를 처리 — 구성 변경 및 백그라운드 전환 시 광고 상태가 보존됩니다.
- Android TV와 모바일은 UI 계층 적응과 함께 동일한 광고 로직을 공유합니다.
커넥티드 TV 플랫폼
Roku (RAF — Roku Ad Framework)- Roku의 네이티브 RAF 라이브러리는 HLS 매니페스트에서 SCTE-35 마커를 직접 파싱합니다.
RAF.setAdUrl()은 VAST 엔드포인트로 구성되며, RAF는 광고 요청, 포드 구축 및 재생을 처리합니다.- RAF의
renderStitchedAd및renderTrackingEvent콜백을 통한 컴패니언 광고 지원 - Roku 인증은 RAF 사용을 요구합니다 — 사용자 지정 광고 플레이어는 검토 중 거부됩니다.
- Fire TV의 Leanback UI에 맞춰 조정된 Android ExoPlayer + IMA SDK 구현을 사용합니다.
- 광고 오버레이에서 건너뛰기 버튼 및 "자세히 알아보기" 클릭률을 위한 D-패드 내비게이션
- VAST 요청에서 광고 타겟팅을 위해 Fire TV Ad ID가 사용됩니다.
- 네이티브 광고 브레이크 UI 표시기를 위한
interstitialTimeRanges가 포함된AVPlayerViewController AVPlayerItemMetadataCollector를 통해 SCTE-35 큐가 파싱됩니다.- 깔끔한 콘텐츠/광고 분리를 위해 별도의
AVQueuePlayer에서 광고 재생이 관리됩니다. - 인터랙티브 광고 요소를 위한 tvOS 리모컨 클릭 핸들러
광고 포드 관리
- 포드 채우기 — 신호된 브레이크 지속 시간을 채우기 위해 여러 VAST 광고가 조합됩니다.
- 폭포수 — 기본 광고 서버가 채우기 불가(no-fill)를 반환하면, 보조/삼차 수요 소스를 순차적으로 쿼리합니다.
- 지속 시간 맞춤 — 포드 빌더는 브레이크 지속 시간 내에 맞는 (±0.5초 허용 오차) 광고 조합을 선택합니다.
- 중복 제거 — 동일한 광고 크리에이티브는 단일 포드 내에서 두 번 표시되지 않습니다.
- 빈도 제한 — 광고 피로를 피하기 위해 사용자별, 세션별 제한이 클라이언트 측에서 적용됩니다.
- 범퍼 추가 — 짧은 범퍼 크리에이티브 ("잠시 후 돌아오겠습니다" / "다시 오신 것을 환영합니다")가 광고 포드를 감쌉니다.
광고 이벤트 추적 및 분석
- 표준 VAST 이벤트 —
impression(노출),start(시작),firstQuartile(첫 쿼타일),midpoint(중간 지점),thirdQuartile(세 번째 쿼타일),complete(완료),skip(건너뛰기),clickThrough(클릭률) - 시청 가능성 — 광고 뷰포트 가시성 및 지속 시간 임계값을 기반으로 MOAT/IAS 시청 가능성 픽셀이 실행됩니다.
- 사용자 지정 이벤트 — 앱 수준 이벤트 (광고 브레이크 시작/종료, 포드 채우기율, 사전 로드 타이밍, 폴백 트리거)
- 서버 파이프라인 — 클라이언트는 경량 이벤트 수집기로 이벤트를 전송하고, 이는 GAM, MOAT 및 내부 분석 웨어하우스로 분산됩니다.
- 조정 — 불일치 감지를 위한 클라이언트 측 이벤트와 서버 측 로그 조정
광고 차단기 처리 (웹)
- 감지 — 알려진 광고 도메인으로 카나리아 VAST 요청; 시간 초과 또는 차단은 광고 차단기를 나타냅니다.
- 폴백 전략 — 자사 CDN 도메인에서 하우스 광고 또는 프로모션 예고편 제공
- 콘텐츠 게이팅 — 선택적 소프트 게이트: 콘텐츠 재생 전에 사용자에게 사이트를 화이트리스트에 추가하도록 요청
- 분석 — 브라우저, 지리 및 페이지별로 광고 차단기 감지율 추적
주요 기능
- 크로스 플랫폼 CSAI — 웹, iOS, Android, Roku, Fire TV 및 Apple TV 전반에 걸친 통합 광고 삽입
- SCTE-35 클라이언트 파싱 — HLS
EXT-X-DATERANGE,CUE-OUT/IN및 DASHEventStream파싱 - 인터랙티브 광고 — 모든 플랫폼에서 클릭 가능한 오버레이, 컴패니언 배너 및 건너뛰기 버튼
- 광고 포드 오케스트레이션 — 폭포수, 지속 시간 맞춤 및 중복 제거를 통한 다중 광고 브레이크 채우기
- 사전 로드 — 제로 지연 시간 광고 전환을 위해 콘텐츠 재생 중 미리 로드되는 광고 크리에이티브
- 시청 가능성 추적 — 프리미엄 광고 구매자 시청 가능성 요구 사항을 위한 MOAT/IAS 통합
- 커넥티드 TV 규정 준수 — 인증 요구 사항을 충족하는 Roku RAF, Fire TV IMA 및 Apple TV AVKit 통합
- 광고 차단기 복원력 — 웹에서 광고 차단기 감지 및 자사 하우스 광고로의 폴백
결과
기술 스택
caseStudyDetail.more 사례 연구
더 많은 기술 구현 사례를 살펴보세요
SCTE-35 광고 마커 신호 및 미디어 트레일러 삽입 파이프라인
한 스트리밍 미디어 회사는 라이브 및 VOD 스트림에 SCTE-35 광고 마커를 삽입하고, 프로모션 트레일러(pre-roll, mid-roll, post-roll)를 정확한 시점에 삽입할 수 있는 견고하고 자동화된 파이프라인이 필요했습니다. 이는 FAST 채널, 라이브 이벤트 및 주문형 콘텐츠 라이브러리 전반에 걸쳐 수익을 창출하기 위함이었습니다.
SRT를 통한 FAST 채널 스트리밍을 위한 AWS 미디어 서비스
한 미디어 회사는 예측 불가능한 인터넷 연결을 통해 원격 스튜디오, 클라우드 플레이아웃 시스템 및 신디케이션 파트너로부터 고품질 콘텐츠를 수집할 수 있도록 Secure Reliable Transport (SRT) 프로토콜을 사용하여 FAST 채널을 위한 안정적이고 짧은 지연 시간의 기여 피드를 구축해야 했습니다.
자주 묻는 질문
MicrocosmWorks는 base64로 인코딩된 SCTE-35 splice_info_section 데이터를 포함하는 EXT-X-DATERANGE 태그를 추출하고, splice command를 디코딩하며, 적절한 break duration과 함께 VAST/VMAP ad server에 ad decision request를 트리거하는 manifest parser를 구현했습니다. 이 parser는 live 및 VOD manifest 모두에서 time_signal 및 splice_insert command type을 모두 처리합니다.
MicrocosmWorks는 iOS용 AVPlayer, Android용 ExoPlayer, web용 hls.js, 그리고 Roku 및 Fire TV의 네이티브 플레이어를 위한 플랫폼별 어댑터를 갖춘 공유 광고 재생 SDK를 구축했습니다. 해당 SDK는 impression, quartile tracking, completion과 같은 광고 수명 주기 이벤트를 모든 플랫폼에서 표준화하여, 재생 기기에 관계없이 통합 보고를 보장합니다.
MicrocosmWorks는 플레이어가 광고 서버 응답을 최대 3초까지 기다린 후 기본 슬레이트를 재생하거나 다음 콘텐츠 세그먼트로 건너뛰는 타임아웃 및 대체 전략을 구현했습니다. 또한 SDK는 콘텐츠 재생 중에 다가오는 광고 삽입점의 VAST 응답을 사전 로드하여 실제 삽입 시점에서의 지연 시간을 최소화합니다.
MicrocosmWorks는 MOAT, IAS, DoubleVerify와 호환되는 Open Measurement SDK (OM SDK)를 가시성 검증을 위해 통합했으며, 트래킹 구현은 노출 수 및 쿼타일 이벤트 집계를 위해 IAB VAST 4.2 사양을 따릅니다. 이 시스템은 또한 정확한 광고 완료율 보고를 위한 IAB의 Video Ad Serving Template 측정 가이드라인을 지원합니다.
MicrocosmWorks는 시간당 $30~$50의 요율로 광고 기술 구현을 제공하며, SCTE-35 파싱, VAST/VMAP 통합, 그리고 iOS, Android, 웹 및 CTV용 다중 플랫폼 플레이어 SDK를 포함하는 완전한 CSAI 시스템은 일반적으로 600~900시간의 개발 시간을 필요로 합니다. 각 추가 플랫폼 어댑터는 기본 구현에 약 80~120시간을 추가합니다.