Skip to content

Plan으로 SCTE-35 주입하기 ​

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

요청 예시 ​

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

bash
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초쯤 뒤에 미디어 플레이리스트를 보면 출력 예시.

text
#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입니다. 초 단위로 생각하면 헷갈립니다.

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

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

TimingSettings ​

StartType동작
IMMEDIATEPlan을 만드는 즉시 실행
ABSOLUTETime에 지정한 시각에 실행

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

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

Segmentation Descriptor 붙이기 ​

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

json
{
  "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의미
48Provider Advertisement Start
49Distributor Advertisement Start
52Provider Placement Opportunity Start
53Distributor Placement Opportunity Start
54Break Start

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

EventType 종류 ​

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

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

Plan 관리 ​

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

bash
# 목록
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은 생성 직후 실행됩니다. 테스트가 끝나면 실행 이력을 정리합니다.

확인하는 방법 ​

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

bash
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를 바꿔주는 편이 안전합니다.

다음 단계 ​

基于 VitePress 构建 · 部署于腾讯云 EdgeOne Pages