Plan으로 SCTE-35 주입하기
On this page
SCTE-35 마커를 넣는다고 하면 보통 인코더부터 떠올립니다. 그런데 테스트나 데모에서는 인코더까지 손대기 번거롭습니다. StreamLive에는 Plan이라는 예약 이벤트 리소스가 있고, 여기서 SCTE35_SPLICE_INSERT 타입을 사용하면 인코더 없이 마커를 바로 밀어 넣을 수 있습니다.
요청 예시
지금 돌고 있는 라이브 채널에 60초짜리 광고 구간을 하나 넣는다고 합시다.
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초쯤 뒤에 미디어 플레이리스트를 보면 출력 예시.
#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 4077866160초 뒤 #EXT-X-CUE-IN이 표시되며 광고 구간이 종료됩니다.
SpliceDuration 계산
SpliceDuration 단위는 90kHz tick입니다. 초 단위로 생각하면 헷갈립니다.
tick = 초 × 90000| 광고 구간 | tick 값 |
|---|---|
15초 |
1350000 |
30초 |
2700000 |
60초 |
5400000 |
90초 |
8100000 |
해당 값은 문자열 형식으로 전달합니다.
TimingSettings
| StartType | 동작 |
|---|---|
IMMEDIATE |
Plan을 만드는 즉시 실행 |
ABSOLUTE |
Time에 지정한 시각에 실행 |
IMMEDIATE는 만들자마자 발화합니다. "나중에 켜는" 개념이 아니라는 점이 처음에 헷갈립니다. 예약이 필요하면 ABSOLUTE와 Time을 같이 사용합니다.
{
"StartType": "ABSOLUTE",
"Time": "2026-09-15T12:00:00Z"
}Segmentation Descriptor 붙이기
기본 splice_insert만으로 충분한 경우가 많지만, 광고 시스템이 segmentation type을 요구하면 SCTE35SegmentationDescriptor를 같이 지정합니다.
{
"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는 생성 / 조회 / 삭제를 제공합니다.
# 목록
tccli mdl DescribeStreamLivePlans --region ap-seoul --ChannelId 6941****5240
# 삭제
tccli mdl DeleteStreamLivePlan --region ap-seoul \
--ChannelId 6941****5240 --EventName justinkim_ad_break_001IMMEDIATE Plan은 생성 직후 실행됩니다. 테스트가 끝나면 실행 이력을 정리합니다.
확인하는 방법
마커가 실제로 나갔는지는 미디어 플레이리스트를 보는 게 가장 빠릅니다.
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를 바꿔주는 편이 안전합니다.
