이 가이드에서는 광고 시점 타이밍 메타데이터(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를 호출합니다.
프리롤 광고의 요청 타이밍 메타데이터
다음 옵션을 사용하여 라이브 스트림 이벤트의 프리롤 설정을 확인합니다.
프리롤 광고 결정 결과를 가져오려면 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:17.450
#EXTINF:5.000,
contentorigin.com/3.ts
#EXTINF:5.000,
contentorigin.com/4.ts
#EXTINF:5.000,
contentorigin.com/5.ts
#EXTINF:2.450,
contentorigin.com/6.ts
#EXT-X-CUE-IN
#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/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.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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
#EXTINF:2.450,
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/3.ts?stream_id=SESSION_ID
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
슬레이트 세그먼트 빌드
광고와 콘텐츠 사이의 간격을 메우려면 슬레이트 세그먼트를 삽입합니다.
ATM API의 JSON 응답에서 slates.segment_durations.values 배열을 사용하여 각 슬레이트 세그먼트의 기간을 확인합니다. 전체 광고 시점을 채우는 데 필요한 만큼 세그먼트 지속 시간 시퀀스를 반복합니다.
EXT-X-CUE-IN 태그를 감지하는 등 광고 모음이 완료되기 전에 콘텐츠로 돌아가려면 최종 슬레이트 세그먼트의 URL에 d= 매개변수를 추가하세요. 이 매개변수는 클라이언트 동영상 플레이어의 타임라인에 영향을 미치지 않도록 세그먼트를 단축합니다. d= 매개변수의 값은 세그먼트를 단축할 밀리초 단위의 시간을 나타내는 정수여야 합니다.
다음 예에서는 슬레이트 세그먼트를 어셈블합니다.
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= 매개변수를 추가합니다.
즉시 반환: d= 매개변수를 사용하여 단일 재정렬 슬레이트 세그먼트를 삽입하고 콘텐츠를 따릅니다.
동영상 플레이어가 타임라인 변경 없이 콘텐츠로 다시 전환됩니다.
다음 예에서는 광고 시간의 나머지 부분을 슬레이트 세그먼트로 채워 전환을 만듭니다.
#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-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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
#EXT-X-DISCONTINUITY
#EXTINF:2.450,
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/1.ts?stream_id=SESSION_ID&d=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
이 메서드에서 매니페스트 조작기는 필요에 따라 슬레이트를 루프하고 마지막 슬레이트 세그먼트에만 d= URL 매개변수를 추가합니다. 이 프로세스는 기본 콘텐츠의 예약된 시작 시간과 정확히 일치합니다.
다음 예에서는 d= 매개변수와 함께 단일 슬레이트 세그먼트를 사용하여 루프 슬레이트로 나머지 광고 시점을 모두 채우지 않을 때 플레이어 타임라인을 정확하게 유지하는 방법을 보여줍니다.
#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-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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:2.450,
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&d=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
선택사항: 광고 시점 예약
유효노출률을 높이려면 광고 모음 지속 시간, 맞춤 타겟팅 매개변수, SCTE-35 신호 데이터와 함께 EABN (Early Ad Break Notification)을 전송하세요. 자세한 내용은 조기 광고 시점 알림 전송을 참고하세요.