이 가이드에서는 광고 인스턴스 타이밍 메타데이터(ATM) 방법을 사용하여 광고 인스턴스의 정확한 타이밍과 지속 시간을 가져와 인스트림 광고를 비롯한 광고 인스턴스를 삽입하는 방법을 설명합니다.
프리롤 광고를 삽입하고 미드롤 광고 시점 후 콘텐츠로 돌아가는 것을 관리하려면 다음 API를 호출하는 것이 좋습니다.
- 광고 모음 타이밍 메타데이터 (ATM) API: 광고 및 슬레이트 기간을 비롯한 광고 모음 결정 결과를 쿼리합니다.
- 광고 세그먼트 엔드포인트: 현재 광고 애드팟을 종료하는 옵션과 함께 광고 또는 슬레이트 세그먼트를 요청합니다.
선택적으로 동시성이 높은 라이브 스트림 이벤트의 경우 Early Ad Break Notification (EABN) API를 호출하여 광고 시점이 시작되기 전에 광고 결정을 예약하는 것이 좋습니다.
기본 요건
시작하려면 광고 모음 게재 리디렉션 동적 광고 삽입 (DAI) 유형으로 설정된 라이브 스트림 이벤트가 필요합니다. 다음 방법 중 하나를 선택합니다.
- Ad Manager UI: DAI용 라이브 스트림을 설정합니다.
- Ad Manager API: 클라이언트 라이브러리 (사용 가능한 옵션)를 사용하여
LiveStreamEventService.createLiveStreamEvents
메서드를 호출합니다.LiveStreamEvent.dynamicAdInsertionType
매개변수를POD_SERVING_REDIRECT
로 설정합니다.
콘텐츠 스트림 가져오기
사용자가 라이브 스트림 이벤트를 선택하면 클라이언트 앱이 Google Ad Manager에 스트림 요청을 합니다. 스트림 응답에서 앱은 스트림 매니페스트 요청에 포함할 Google DAI 세션 ID와 메타데이터를 추출합니다.
다음 예에서는 Google DAI 세션 ID를 매니페스트 조작기에 전달합니다.
https://MANIFEST_MANIPULATOR_URL/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY
동영상 콘텐츠 재생 요청을 처리할 때 광고 스티칭을 준비하기 위해 요청에서 Google DAI 세션 ID와 CUSTOM_ASSET_KEY을 저장합니다.
광고 모음 타이밍 메타데이터 가져오기
광고 애드팟 타이밍을 가져오려면 다음 단계를 따르세요.
- HMAC 토큰을 생성합니다.
- HMAC 토큰으로 ATM API를 호출합니다.
서명된 HMAC 토큰 생성
요청을 인증하려면 다음 단계를 따르세요.
다음 매개변수를 알파벳순으로 연결하여 토큰 문자열을 만듭니다. 매개변수는 물결표시
~
로 구분됩니다.매개변수 필수 또는 선택사항 설명 ad_break_id
필수 광고 시점을 식별하기 위해 지정하는 문자열입니다(예: ad-break-1
). 프리롤 광고의 경우preroll
를 사용합니다.custom_asset_key
필수 라이브 스트림 이벤트의 맞춤 애셋 키입니다. cust_params
선택사항 맞춤 타겟팅 매개변수입니다. 자세한 내용은 타겟팅 매개변수를 스트림에 공급하기를 참고하세요. exp
필수 이 토큰이 만료되는 시간입니다. Unix epoch 이후 경과된 총 시간(초)으로 측정됩니다. network_code
필수 Google Ad Manager 네트워크 코드 자세한 내용은 Ad Manager 계정 정보 찾기를 참고하세요. pd
필수 광고 시점 길이(밀리초)입니다. 프리롤 광고의 경우 Google DAI가 이 매개변수를 라이브 스트림 이벤트 설정으로 재정의합니다. scte35
선택사항 Base64로 인코딩된 SCTE-35 신호입니다. 신호가 올바른지 확인합니다. 잘못된 경우 응답의 X-Ad-Manager-Dai-Warning
HTTP 헤더로 메시지가 전송되고 신호는 광고 시점을 만들기 위해 계속 전파됩니다. 지원되는 광고 시점 마커에 대한 자세한 내용은 HLS 통합을 참고하세요.HMAC 유형의 Google DAI 인증 키를 다운로드합니다. 자세한 내용은 DAI 동영상 스트림 요청 인증을 참고하세요.
다운로드한 HMAC 키를 사용하여 토큰 문자열의 SHA256 서명을 생성합니다.
토큰 문자열과 생성된 서명을 연결합니다.
연결된 문자열에 URL 인코딩을 적용합니다. 인코딩된 문자열은 광고 애드팟 타이밍 메타데이터 (ATM) API 요청을 인증하기 위해 서명된 HMAC 토큰입니다.
다음 예에서는 프리롤 광고용 서명된 HMAC 토큰을 생성합니다.
custom_asset_key="CUSTOM_ASSET_KEY"
exp="1750700000" # Expired on Mon Jun 23 2025 13:33:20 GMT-0400 (Eastern Daylight Time)
network_code="NETWORK_CODE"
ad_break_id="preroll"
pd="0" # Pod duration value is overridden by the livestream event settings.
# The HMAC authentication key associated with your livestream event in Google Ad Manager.
secret_key="24E96382584C328087546B0E8454F26158564E8466FD2BE3D8A996B38445876C"
# Concatenate the parameters, keep the parameters alphabetically ordered by name.
token_string="ad_break_id=${ad_break_id}~custom_asset_key=${custom_asset_key}~exp=${exp}~network_code=${network_code}~pd=${pd}"
# Calculate the SHA256 signature of the token_string.
hmac_signature=$(echo -n "$token_string" | openssl dgst -sha256 -hmac "$secret_key" | awk '{print $2}')
# Concatenate the token string and the signature.
signed_token="${token_string}~hmac=${hmac_signature}"
url_encode() {
local string="${1}"
local strlen=${#string}
local encoded=""
local pos c
for (( pos=0 ; pos<strlen ; pos++ )); do
c=${string:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9] ) o="${c}" ;;
* ) printf -v o '%%%02x' "'$c"
esac
encoded+="${o}"
done
echo "${encoded}"
}
# Apply URL encoding to the concatenated string.
url_encoded_signed_token=$(url_encode "$signed_token")
echo "Signed HMAC token:"
echo "${url_encoded_signed_token}"
# Example output:
# ad_break_id%3Dpreroll~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D21775744923~pd%3D180000~pod_id%3D5~hmac%3D24E96382584C328087546B0E8454F26158564E8466FD2BE3D8A996B38445876C
프리롤 광고의 요청 타이밍 메타데이터
다음 옵션을 사용하여 라이브 스트림 이벤트의 인트로 설정을 확인합니다.
프리롤 광고 결정 결과를 가져오려면 ATM API에 요청하세요.
다음 예에서는 프리롤 광고에 대한 ATM 요청을 실행합니다.
curl "https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/pod.json?stream_id=SESSION_ID&ad_break_id=preroll&auth-token=your_signed_HMAC_token"
미드롤 광고의 타이밍 메타데이터 요청
미드롤의 광고 애드팟 메타데이터를 가져오려면 다음 단계를 따르세요.
- 라이브 스트림 매니페스트를 파싱하여 각 미드롤 광고 시점의 타이밍과 재생 시간을 포함하는 광고 마커를 찾습니다.
- ATM API 엔드포인트를 호출하여 정확한 광고 애드팟 및 슬레이트 기간을 요청합니다. API는 광고 애드팟의 결정 결과가 포함된 JSON 객체를 반환합니다.
다음 예에서는 미드롤 광고에 대한 ATM 요청을 실행합니다.
curl "https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/pod.json?stream_id=SESSION_ID&ad_break_id=AD_BREAK_ID&pd=AD_BREAK_DURATION&auth-token=your_signed_HMAC_token"
성공하면 다음과 비슷한 JSON 객체가 출력됩니다.
{
"status": "final",
"ads": [
{
"duration_ms": 5046,
"variants": {
"devrel1428000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5045
]
}
},
"devrel1928000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5045
]
}
}
}
}
],
"slate": {
"duration_ms": 0,
"variants": {
"devrel1428000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5005,
...
5046
]
}
},
"devrel1928000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5005,
...
5046
]
}
}
}
}
}
콘텐츠 매니페스트에 광고 스티칭
다음 섹션에서는 라이브 스트림 매니페스트를 수정하고 광고 세그먼트를 추가하는 방법을 안내합니다.
광고 시점 세그먼트 식별 및 불연속성 삽입
각 변형 매니페스트를 처리할 때 스트림에서 EXT-X-CUE-IN
및 EXT-X-CUE-OUT
태그를 식별하여 광고 시점의 시작과 종료를 나타냅니다.
EXT-X-CUE-IN
및 EXT-X-CUE-OUT
태그를 EXT-X-DISCONTINUITY
요소로 바꿔 클라이언트 동영상 플레이어가 콘텐츠와 광고 간에 전환할 수 있도록 합니다.
다음 예시 매니페스트는 EXT-X-CUE-IN
및 EXT-X-CUE-OUT
태그를 대체합니다.
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.000,
contentorigin.com/3.ts
#EXTINF:5.000,
contentorigin.com/4.ts
#EXTINF:5.000,
contentorigin.com/5.ts
#EXT-X-CUE-IN
#EXTINF:5.000,
contentorigin.com/6.ts
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
다음 예시는 대체된 매니페스트를 보여줍니다.
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXTINF:5.000,
#EXT-X-DISCONTINUITY
{... Insert ad segments here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/6.mp4
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
Google DAI 광고 세그먼트는 암호화되지 않습니다. 콘텐츠가 암호화된 경우 각 광고 시점의 첫 번째 광고 세그먼트 앞에 EXT-X-KEY:METHOD=NONE
요소를 삽입하여 암호화를 삭제합니다. 광고 시점이 끝나면 적절한 EXT-X-KEY
를 삽입하여 암호화를 다시 추가합니다.
예정된 광고 시점의 시작 시간, 재생 시간, 색인을 추적합니다.
광고 세그먼트 URL 빌드
EXT-X-DISCONTINUITY
태그 사이의 콘텐츠 세그먼트를 각 광고 세그먼트의 URL로 바꿉니다. 삽입할 광고 세그먼트 수를 확인하려면 ATM API의 JSON 응답에 제공된 ads.segment_durations.values
를 사용하세요.
EXT-X-CUE-IN
태그가 감지될 때 광고 애드팟을 조기에 종료하려면 최종 광고 세그먼트의 URL에 d=
매개변수를 추가하세요. 이 매개변수는 클라이언트 동영상 플레이어의 타임라인에 영향을 미치지 않도록 세그먼트를 단축합니다.
다음 예에서는 매니페스트에 인트로 광고 세그먼트 URL을 어셈블합니다. 광고 세그먼트는 0 기반 색인을 사용합니다.
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/preroll/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
다음 예에서는 미드롤 광고 세그먼트 URL을 매니페스트에 어셈블합니다.
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
다음 예에서는 광고 세그먼트를 매니페스트에 삽입합니다.
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.00,
contentorigin.com/1.ts
#EXTINF:5.00,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/1.ts?stream_id=SESSION_ID
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/2.ts?stream_id=SESSION_ID
#EXT-X-DISCONTINUITY
#EXTINF:5.00,
contentorigin.com/6.mp4
#EXTINF:5.00,
contentorigin.com/7.mp4
#EXTINF:5.00,
contentorigin.com/8.mp4
슬레이트 세그먼트 빌드
광고와 콘텐츠 사이의 간격을 메우려면 슬레이트 세그먼트를 삽입합니다.
ATM API의 JSON 응답에서 slates.segment_durations.values
배열을 사용하여 각 슬레이트 세그먼트의 길이를 확인합니다. 전체 광고 시점을 채우는 데 필요한 만큼 세그먼트 지속 시간 시퀀스를 반복합니다.
다음 예에서는 슬레이트 세그먼트를 어셈블합니다.
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/slate/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
예의 slate/0
는 슬레이트 반복 번호를 나타냅니다. 0
에서 시작하고 슬레이트의 각 루프에 대해 이 숫자를 늘릴지 아니면 모든 반복에 대해 0
로 유지할지 결정하려면 클라이언트 동영상 플레이어의 호환성 및 캐싱 기능을 참고하세요.
콘텐츠로 돌아가기 관리
광고 모음의 모든 세그먼트를 삽입한 후 다음 방법 중 하나를 선택하여 콘텐츠 스트림으로 다시 전환합니다.
메서드 | 설명 | 클라이언트 동영상 플레이어에 미치는 영향 |
---|---|---|
슬레이트 세그먼트로 채우기 | 슬레이트 세그먼트를 삽입하고 슬레이트를 반복합니다. 각 슬레이트 반복 사이에 기간을 채우고 EXT-X-DISCONTINUITY 요소를 삽입합니다. |
효과 없음 동영상 플레이어가 타임라인 변경 없이 콘텐츠로 다시 전환됩니다. |
단일 슬레이트 세그먼트로 다시 정렬 | 단일 슬레이트 세그먼트를 삽입합니다. d= 매개변수를 사용하여 콘텐츠 시작까지의 기간을 채웁니다. |
효과 없음 동영상 플레이어가 타임라인 변경 없이 콘텐츠로 다시 전환됩니다. |
즉시 반품 | 콘텐츠 세그먼트를 삽입합니다. | 동영상 플레이어의 타임라인이 변경됩니다. 클라이언트 동영상 플레이어는 변경된 타임라인을 처리해야 합니다. |
선택사항: 광고 시점 예약
게재율을 높이려면 광고 애드팟 기간, 맞춤 타겟팅 매개변수, SCTE-35 신호 데이터와 함께 EABN (Early Ad Break Notification)을 전송하세요. 자세한 내용은 조기 광고 시점 알림 전송을 참고하세요.