SSAI 검증과 트러블슈팅
On this page
켜는 것보다 확인하는 게 어렵습니다.
검증 준비
파이프라인 구성 항목입니다.
| 항목 | 방법 | 결과 |
|---|---|---|
| SSAI 설정 반영 | DescribeStreamPackageChannel |
SSAIEnable = True, 설정값 그대로 |
| 엔드포인트 재생 | 마스터 플레이리스트 요청 | 200 |
| 렌디션 분리 | 마스터 플레이리스트 내용 | 720p / 1080p 두 개 확인 |
| SCTE-35 패스스루 | DescribeStreamLiveChannel |
Behavior = PASSTHROUGH |
| 마커 주입 (Plan) | CreateStreamLivePlan |
EXT-X-CUE-OUT 발생, 60초 후 EXT-X-CUE-IN |
| PDT 삽입 | 미디어 플레이리스트 | EXT-X-PROGRAM-DATE-TIME 확인 |
| CDN 경유 | 도메인으로 요청 | 200 |
Plan으로 주입한 마커의 실제 측정값입니다. 5초 간격으로 미디어 플레이리스트를 폴링했습니다.
| 경과 | CUE-OUT | CUE-IN | 비고 |
|---|---|---|---|
5초 |
0 |
0 |
아직 — |
10초 |
1 |
0 |
마커 발화 |
35초 |
7 |
0 |
플레이리스트 윈도우 전부 광고 구간 |
70초 |
6 |
1 |
SpliceDuration 경과, 구간 종료 |
90초 |
0 |
1 |
윈도우에서 마커 소멸 |
SpliceDuration을 5400000(60초)으로 넣었고 CUE-IN이 70초 부근에 찍혔습니다. tick 환산이 맞게 들어갔다는 뜻입니다.
광고 삽입 검증
ADS를 직접 호스팅해서 접근 로그를 봤지만 StreamPackage에서 들어온 요청이 한 건도 없었습니다.
지금까지 확인한 사실은 이렇습니다.
설정을 바꿔가며 여러 가지를 시도해 봤습니다.
| 시도 | 결과 |
|---|---|
| Google 공개 VAST 샘플 URL | ADS 호출 — |
직접 호스팅한 VAST (work.justinkim.co.kr) |
ADS 호출 — |
AdTriggers [1] / [1,2,4,5] |
동일 |
Segmentation Descriptor TypeID=52 추가 |
동일 |
TimeShiftEnable = True |
동일 |
| 엔드포인트를 새로 만들어 적용 | 동일 |
광고 삽입 검증 전 콘솔에서 계정의 SSAI 이용 설정을 확인하고, ADS 요청 로그와 실제 재생을 대조합니다.
광고 삽입까지 확인해야 하면 콘솔에서 SSAI 사용 신청 상태를 먼저 확인하세요.
검증 순서
1. 마커 소스 확보 StreamLive Plan 또는 SCTE-35 인코더
2. StreamLive 통과 확인 Behavior = PASSTHROUGH, 플레이리스트에 CUE-OUT
3. StreamPackage 설정 SSAIEnable = True
4. ADS 응답 확인 ADS 접근 로그에 요청이 찍히는지
5. 재생 확인 광고 구간에서 광고가 나오는지ADS 서버 로그에서 광고 요청 / 응답을 확인합니다. 외부 ADS는 제공사의 로그 또는 진단 기능을 사용합니다.
1. StreamLive SCTE-35
tccli mdl DescribeStreamLiveChannel --region ap-seoul --Id 6AA6****5542 \
| python3 -c "
import sys,json
d=json.load(sys.stdin)['Info']
for g in d['OutputGroups']:
for o in g['Outputs']:
print(o['Name'], o['Scte35Settings'])
print('PDT:', g['HlsRemuxSettings']['PdtInsertion'], g['HlsRemuxSettings']['PdtDuration'])
"기대하는 결과입니다.
justinkimout1080p {'Behavior': 'PASSTHROUGH'}
justinkimout720p {'Behavior': 'PASSTHROUGH'}
PDT: OPEN 6002. StreamPackage SSAI
tccli mdp DescribeStreamPackageChannel --region ap-seoul --Id 6AA6****32BF \
| python3 -c "
import sys,json
for e in json.load(sys.stdin)['Info']['Points']['Endpoints']:
print(e['Name'], 'SSAIEnable =', e.get('SSAIEnable'))
"3. PDT 태그
curl -s "https://cdn.tencentpoc.com/v1/01a0****6005/01a0****86d9/justinkim_to_package_justinkim720p.m3u8" | head -8기대하는 결과입니다.
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:40901677
#EXT-X-TARGETDURATION:4
#EXT-X-PROGRAM-DATE-TIME:2026-09-14T05:42:45.388Z
#EXTINF:4.000, seq 409016774. ADS 응답
VAST 태그 자체는 이렇게 확인합니다.
curl -s -o /dev/null -w "%{http_code}\n" "https://ads.example.com/vast?cid=****"
curl -s "https://ads.example.com/vast?cid=****" | head -3<?xml version="1.0" encoding="UTF-8"?><VAST version="3.0"><Ad id="..."># ADS를 직접 호스팅한 경우
sudo grep 'vast.xml' /var/log/nginx/access.logADS 요청 로그와 플레이리스트 마커 시각을 대조해 광고 삽입 구간을 확인합니다.
VAST를 직접 만들 때 최소한으로 필요한 건 이렇습니다.
<?xml version="1.0" encoding="UTF-8"?><VAST version="3.0"><Ad id="ad-001">
<InLine>
<AdSystem>test</AdSystem>
<AdTitle>Test Ad</AdTitle>
<Creatives>
<Creative id="c1" sequence="1">
<Linear>
<Duration>00:01:00</Duration>
<MediaFiles>
<MediaFile delivery="progressive" type="video/mp4"
bitrate="500" width="1280" height="720">
<![CDATA[https://example.com/ad.mp4]]>
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
</Creatives>
</InLine></Ad></VAST>Duration과 광고 구간(SpliceDuration)을 맞추고, MP4는 본편과 해상도를 맞춰두는 게 좋습니다.
트러블슈팅
| 증상 | 원인 | 조치 |
|---|---|---|
| 마커가 스트림에 — | 인코더에서 안 보냄 | Plan으로 주입해서 마커 구간만 먼저 확인 |
| 마커가 스트림에 — | SpliceDuration을 초 단위로 넣음 |
tick 환산 (초 × 90000) |
| 마커는 오는데 광고 — | AdTriggers에 해당 타입이 — |
트리거 값 확인 |
| 마커는 오는데 광고 — | DeliveryRestrictions 불일치 |
4(Both)로 넓혀보기 |
| 마커는 오는데 ADS 로그가 비어 있음 | 계정에 SSAI 미개통 (유력) | 콘솔에서 SSAI 사용 신청 확인 |
| 광고 대체 구간 | ADS 응답 | ADS URL과 응답 확인 |
| 광고 대체 구간 | 슬레이트 | SlateAd URL 접근성 확인 |
| 광고가 엉뚱한 지점에 붙음 | PDT 꺼져 있음 | PdtInsertion = OPEN |
| 광고 구간에서 튐 | 슬레이트 해상도 불일치 | 해상도와 프레임레이트 통일 |
| 마커가 사라짐 | StreamLive가 통과 안 시킴 | Behavior = PASSTHROUGH |
| 재생 자체가 안 됨 | CDN 도메인 문제 | CDN 문서 참고 |
유의 사항
Modify 호출 후 Describe로 적용된 설정을 확인합니다.
StreamPackage 채널을 삭제했다가 다시 만들면 엔드포인트 URL의 해시가 바뀝니다. 문서나 앱에 재생 주소를 하드코딩해 뒀다면 다 깨집니다. 테스트용 채널을 지울 때 주의하세요.
테스트 후 정리
# StreamLive 채널 정지
tccli mdl StopStreamLiveChannel --region ap-seoul --Id 6AA6****5542
# StreamLink Flow 정지
tccli mdc StopStreamLinkFlow --region ap-seoul --FlowId 82iv****74egRUNNING 상태인 동안 계속 과금됩니다.
