Skip to content

SSAI 검증과 트러블슈팅 ​

켜는 것보다 확인하는 게 어렵습니다.

검증 준비 ​

파이프라인 구성 항목입니다.

항목방법결과
SSAI 설정 반영DescribeStreamPackageChannelSSAIEnable = True, 설정값 그대로
엔드포인트 재생마스터 플레이리스트 요청200
렌디션 분리마스터 플레이리스트 내용720p / 1080p 두 개 확인
SCTE-35 패스스루DescribeStreamLiveChannelBehavior = PASSTHROUGH
마커 주입 (Plan)CreateStreamLivePlanEXT-X-CUE-OUT 발생, 60초 후 EXT-X-CUE-IN
PDT 삽입미디어 플레이리스트EXT-X-PROGRAM-DATE-TIME 확인
CDN 경유도메인으로 요청200

Plan으로 주입한 마커의 실제 측정값입니다. 5초 간격으로 미디어 플레이리스트를 폴링했습니다.

경과CUE-OUTCUE-IN비고
5초00아직 —
10초10마커 발화
35초70플레이리스트 윈도우 전부 광고 구간
70초61SpliceDuration 경과, 구간 종료
90초01윈도우에서 마커 소멸

SpliceDuration을 5400000(60초)으로 넣었고 CUE-IN이 70초 부근에 찍혔습니다. tick 환산이 맞게 들어갔다는 뜻입니다.

광고 삽입 검증 ​

ADS를 직접 호스팅해서 접근 로그를 봤지만 StreamPackage에서 들어온 요청이 한 건도 없었습니다.

지금까지 확인한 사실은 이렇습니다.

기존 테스트의 확인 지점

설정을 바꿔가며 여러 가지를 시도해 봤습니다.

시도결과
Google 공개 VAST 샘플 URLADS 호출 —
직접 호스팅한 VAST (work.)ADS 호출 —
AdTriggers [1] / [1,2,4,5]동일
Segmentation Descriptor TypeID=52 추가동일
TimeShiftEnable = True동일
엔드포인트를 새로 만들어 적용동일

광고 삽입 검증 전 콘솔에서 계정의 SSAI 이용 설정을 확인하고, ADS 요청 로그와 실제 재생을 대조합니다.

광고 삽입까지 확인해야 하면 콘솔에서 SSAI 사용 신청 상태를 먼저 확인하세요.

검증 순서 ​

text
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 ​

bash
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'])
"

기대하는 결과입니다.

text
justinkimout1080p {'Behavior': 'PASSTHROUGH'}
justinkimout720p  {'Behavior': 'PASSTHROUGH'}
PDT: OPEN 600

2. StreamPackage SSAI ​

bash
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 태그 ​

bash
curl -s "https://cdn." | head -8

기대하는 결과입니다.

text
#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 40901677

4. ADS 응답 ​

VAST 태그 자체는 이렇게 확인합니다.

bash
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
<?xml version="1.0" encoding="UTF-8"?><VAST version="3.0"><Ad id="...">
bash
# ADS를 직접 호스팅한 경우
sudo grep 'vast.xml' /var/log/nginx/access.log

ADS 요청 로그와 플레이리스트 마커 시각을 대조해 광고 삽입 구간을 확인합니다.

VAST를 직접 만들 때 최소한으로 필요한 건 이렇습니다.

xml
<?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의 해시가 바뀝니다. 문서나 앱에 재생 주소를 하드코딩해 뒀다면 다 깨집니다. 테스트용 채널을 지울 때 주의하세요.

테스트 후 정리 ​

bash
# StreamLive 채널 정지
tccli mdl StopStreamLiveChannel --region ap-seoul --Id 6AA6****5542
# StreamLink Flow 정지
tccli mdc StopStreamLinkFlow --region ap-seoul --FlowId 82iv****74eg

RUNNING 상태인 동안 계속 과금됩니다.

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