WAND wiki
최근 문서

검색 결과가 없습니다. 모델명이나 다른 키워드로 검색해 보세요.

SSAILast Updated 2026-09-30

Plan으로 SCTE-35 주입하기

On this page

SCTE-35 마커를 넣는다고 하면 보통 인코더부터 떠올립니다. 그런데 테스트나 데모에서는 인코더까지 손대기 번거롭습니다. StreamLive에는 Plan이라는 예약 이벤트 리소스가 있고, 여기서 SCTE35_SPLICE_INSERT 타입을 사용하면 인코더 없이 마커를 바로 밀어 넣을 수 있습니다.

요청 예시

지금 돌고 있는 라이브 채널에 60초짜리 광고 구간을 하나 넣는다고 합시다.

LANGUAGE
cat > /tmp/plan.json <<'EOF'
{"EventName":"justinkim_ad_break_001",
 "TimingSettings":{"StartType":"IMMEDIATE"},
 "EventSettings":{"EventType":"SCTE35_SPLICE_INSERT",
                  "SpliceEventID":909001,
                  "SpliceDuration":"5400000"}}
EOF

tccli mdl CreateStreamLivePlan --region ap-seoul \
  --ChannelId 6941****5240 \
  --Plan "$(cat /tmp/plan.json)"

Plan을 만드는 순간 채널에 마커가 들어갑니다. 10초쯤 뒤에 미디어 플레이리스트를 보면 출력 예시.

LANGUAGE
#EXT-X-CUE-OUT-CONT:ElapsedTime=8.2,Duration=60,SCTE35=/AAgAAGuKZt0AAAADwUADd7KAPCAAFJlwAAAAAAAANYfkZ8=
#EXT-X-PROGRAM-DATE-TIME:2026-09-14T06:29:22.361Z
#EXTINF:4.000, seq 40778661

60초 뒤 #EXT-X-CUE-IN이 표시되며 광고 구간이 종료됩니다.

SpliceDuration 계산

SpliceDuration 단위는 90kHz tick입니다. 초 단위로 생각하면 헷갈립니다.

LANGUAGE
tick = 초 × 90000
광고 구간 tick 값
15초 1350000
30초 2700000
60초 5400000
90초 8100000

해당 값은 문자열 형식으로 전달합니다.

TimingSettings

StartType 동작
IMMEDIATE Plan을 만드는 즉시 실행
ABSOLUTE Time에 지정한 시각에 실행

IMMEDIATE는 만들자마자 발화합니다. "나중에 켜는" 개념이 아니라는 점이 처음에 헷갈립니다. 예약이 필요하면 ABSOLUTE와 Time을 같이 사용합니다.

LANGUAGE
{
  "StartType": "ABSOLUTE",
  "Time": "2026-09-15T12:00:00Z"
}

Segmentation Descriptor 붙이기

기본 splice_insert만으로 충분한 경우가 많지만, 광고 시스템이 segmentation type을 요구하면 SCTE35SegmentationDescriptor를 같이 지정합니다.

LANGUAGE
{
  "EventName": "justinkim_ad_break_002",
  "TimingSettings": {
    "StartType": "IMMEDIATE"
  },
  "EventSettings": {
    "EventType": "SCTE35_SPLICE_INSERT",
    "SpliceEventID": 909002,
    "SpliceDuration": "5400000",
    "SCTE35SegmentationDescriptor": [
      {
        "EventID": 909002,
        "EventCancelIndicator": 0,
        "Duration": 5400000,
        "UPIDType": 0,
        "UPID": "justinkim-ad-break-002",
        "TypeID": 52,
        "Num": 0,
        "Expected": 0,
        "SubSegmentNum": 0,
        "SubSegmentsExpected": 0
      }
    ]
  }
}

TypeID 값은 SCTE-35 segmentation_type_id입니다.

TypeID 의미
48 Provider Advertisement Start
49 Distributor Advertisement Start
52 Provider Placement Opportunity Start
53 Distributor Placement Opportunity Start
54 Break Start

AdTriggers에 넣은 값과 이 TypeID가 서로 맞아야 합니다. AdTriggers 값 표를 같이 보고 고르세요.

EventType 종류

EventType 용도
SCTE35_SPLICE_INSERT 광고 구간 진입 (이 문서의 주인공)
SCTE35_RETURN_TO_NETWORK 광고 구간 종료
SCTE35_TIME_SIGNAL 시각 신호
TIMED_METADATA ID3 메타데이터 삽입
ID3_SEGMENT_TAGGING 세그먼트 단위 태깅
INPUT_SWITCH 입력 전환
TIMED_RECORD 구간 녹화

SCTE35_SPLICE_INSERT 하나로 진입과 종료가 같이 처리됩니다. SpliceDuration이 끝나면 자동으로 CUE-IN이 나갑니다.

Plan 관리

Plan API는 생성 / 조회 / 삭제를 제공합니다.

LANGUAGE
# 목록
tccli mdl DescribeStreamLivePlans --region ap-seoul --ChannelId 6941****5240

# 삭제
tccli mdl DeleteStreamLivePlan --region ap-seoul \
  --ChannelId 6941****5240 --EventName justinkim_ad_break_001

IMMEDIATE Plan은 생성 직후 실행됩니다. 테스트가 끝나면 실행 이력을 정리합니다.

확인하는 방법

마커가 실제로 나갔는지는 미디어 플레이리스트를 보는 게 가장 빠릅니다.

LANGUAGE
curl -s "https://<endpoint>/<rendition>.m3u8" | grep -E "CUE-OUT|CUE-IN"

마커 실행 후 #EXT-X-CUE-OUT-CONT, 지정 구간 종료 후 #EXT-X-CUE-IN을 확인합니다. 플레이리스트 보관 구간보다 짧은 간격으로 조회합니다.

유의 사항

SpliceDuration은 90kHz tick 단위입니다. 60초는 60 × 90000 = 5400000으로 지정합니다.

Plan은 RUNNING 상태의 StreamLive 채널에 적용합니다.

SpliceEventID는 32비트 고유값입니다. 테스트를 반복할 때마다 ID를 바꿔주는 편이 안전합니다.

다음 단계