API обслуживания модулей Google DAI позволяет выполнять вставку рекламы на стороне сервера с помощью Google Ads, сохраняя при этом контроль над собственным сшиванием видео.
В этом руководстве показано, как взаимодействовать с API обслуживания модулей и достигать аналогичной функциональности с помощью IMA DAI SDK. По конкретным вопросам о поддерживаемых функциях обращайтесь к своему менеджеру аккаунта Google.
API обслуживания модулей поддерживает потоки обслуживания модулей в протоколах потоковой передачи HLS или MPEG-DASH. В этом руководстве основное внимание уделяется потокам HLS и на конкретных этапах освещаются ключевые различия между HLS и MPEG-DASH.
Чтобы интегрировать API обслуживания Pod в ваше приложение для потоков VOD, выполните следующие шаги:
Отправьте запрос на регистрацию трансляции в Менеджер рекламы.
Отправьте POST-запрос к конечной точке регистрации потока. Вы, в свою очередь, получаете ответ JSON, содержащий идентификатор потока для отправки на ваш сервер манифестов и связанные с ним конечные точки API обслуживания модулей.
конечная точка API
POST: /ondemand/pods/api/v1/network/{network_code}/stream_registration
Host: dai.google.com
Content-Type: application/json
Параметры пути
{network_code} | Код вашей сети Google Ad Manager 360. |
Параметры тела JSON
targeting_parameters | Объект JSON, содержащий параметры таргетинга рекламы. Необходимый |
Ответ в формате JSON
media_verification_url | Базовый URL-адрес для проверки связи с событиями отслеживания воспроизведения. Полный URL-адрес проверки мультимедиа формируется путем добавления идентификатора рекламного события к этому базовому URL-адресу. |
metadata_url | URL-адрес для запроса метаданных рекламного модуля . |
stream_id | Строка, используемая для идентификации текущего сеанса потока. |
valid_for | Количество времени, оставшееся до истечения текущего сеанса потоковой передачи, в формате dhms (дни, часы, минуты, секунды). Например, 2h0m0.000s соответствует продолжительности 2 часа. |
valid_until | Время истечения текущего сеанса потоковой передачи в виде строки даты и времени ISO 8601 в формате yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm . |
Пример запроса (cURL)
curl -X POST \
-d '{"targeting_parameters":{"url":"http://example.com"}}' \
-H 'Content-Type: application/json' \
https://dai.google.com/ondemand/pods/api/v1/network/21775744923/stream_registration
Пример ответа
{
"media_verification_url": "https://dai.google.com/.../media/",
"metadata_url": "https://dai.google.com/.../metadata",
"stream_id": "6e69425c-0ac5-43ef-b070-c5143ba68541:CHS",
"valid_for": "8h0m0s",
"valid_until": "2023-03-24T08:30:26.839717986-07:00"
}
В случае ошибок возвращаются стандартные коды ошибок HTTP без тела ответа JSON.
Проанализируйте ответ JSON и сохраните соответствующие значения.
Запросите манифест потока у манипулятора манифеста.
Каждый манипулятор манифеста имеет разные форматы запросов и ответов. Свяжитесь с поставщиком манипуляторов, чтобы узнать его конкретные требования. Если вы реализуете собственный манипулятор манифеста, прочтите руководство по манипулятору манифеста, чтобы понять требования к этому компоненту.
Как правило, вам необходимо передать идентификатор потока, который был возвращен указанной выше конечной точкой регистрации, в ваш манипулятор манифеста, чтобы он мог создавать манифесты для конкретного сеанса. Если иное не указано вашим манипулятором манифеста, ответом на ваш запрос манифеста является видеопоток, содержащий как контент, так и рекламу.
Пример запроса (cURL)
curl https://{manifest_manipulator}/video/1331997/stream/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/vod_manifest.m3u8
Пример ответа (HLS)
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="abcd1234_ subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.42e00a,mp4a.40.2"
abcd1234_video-1080p.m3u8
Воспроизвести трансляцию
Загрузите манифест, полученный с сервера манипуляции манифестами, в видеоплеер и запустите воспроизведение.
Запросить метаданные рекламного блока у Менеджера рекламы
Сделайте запрос GET
к metadata_url
, который вы получили на первом шаге. Этот шаг необходимо выполнить после того, как вы получили сшитый манифест от манипулятора манифеста. Взамен вы получаете объект JSON, содержащий следующие параметры:
tags | Набор пар ключ-значение, содержащий все рекламные события, которые появляются в потоке. Ключами являются либо первые 17 символов идентификатора рекламного события, которые появляются в синхронизированных метаданных потока, либо, в случае событий типа progress , полный идентификатор рекламного события.Каждое значение представляет собой объект, содержащий следующие параметры:
| ||||||||||||||||||
ads | Набор пар ключ-значение, описывающий все объявления, которые появляются в потоке. Ключи — это идентификаторы объявлений, соответствующие значениям, найденным в объекте tags указанном выше. Каждое значение представляет собой объект, содержащий следующие параметры:
| ||||||||||||||||||
ad_breaks | Набор пар ключ-значение, описывающий все рекламные паузы, которые появляются в потоке. Ключами являются идентификаторы рекламных пауз, которые соответствуют значениям, найденным в tags и объектах ads перечисленных выше. Каждое значение представляет собой объект, содержащий следующие параметры:
|
Сохраните эти значения, чтобы связать их с синхронизированными событиями метаданных в вашем видеопотоке.
Пример запроса (cURL)
curl https://dai.google.com/.../metadata
Пример ответа
{
"tags":{
"google_5555555555":{
"ad":"0000229834_ad1",
"ad_break_id":"0000229834",
"type":"firstquartile"
},
"google_1234567890123456789":{
"ad":"0000229834_ad1",
"ad_break_id":"0000229834",
"type":"progress"
},
...
},
"ads":{
"0000229834_ad1":{
"ad_break_id":"0000229834",
"position":1,
"duration":15,
"clickthrough_url":"https://.../",
...
},
...
},
"ad_breaks":{
"0000229834":{
"type":"mid",
"duration":15,
"ads":1
},
...
}
}
Слушайте рекламные события
Прослушивайте синхронизированные метаданные через триггерные рекламные события в аудио-/видеопотоке вашего видеоплеера.
Для потоков MPEG-TS метаданные отображаются в виде внутриполосных тегов ID3 v2.3. Каждый тег метаданных имеет идентификатор TXXX
, а значение начинается со строки google_
за которой следует ряд символов. Это значение — идентификатор рекламного события .
XXX
в TXXX
не является заполнителем. Строка TXXX
— это идентификатор тега ID3, зарезервированный для «текста, определяемого пользователем».
Пример тега ID3
TXXXgoogle_1234567890123456789
Для потоков MP4 они отправляются как внутриполосные события emsg, которые эмулируют теги ID3 v2.3. Каждое соответствующее поле emsg имеет значение scheme_id_uri
либо https://aomedia.org/emsg/ID3
, либо https://developer.apple.com/streaming/emsg-id3
а также значение message_data
начинающееся с ID3TXXXgoogle_
. Это значение message_data
без префикса ID3TXXX
является идентификатором рекламного события .
Пример окна emsg
Структура данных может различаться в зависимости от вашей библиотеки медиаплеера.
Если идентификатор рекламного события — google_1234567890123456789
ответ будет выглядеть следующим образом:
{
"scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3",
"presentation_time": 27554,
"timescale": 1000,
"message_data": "ID3TXXXgoogle_1234567890123456789",
...
}
Некоторые библиотеки медиаплееров автоматически представляют события emsg, которые имитируют теги ID3, как собственные теги ID3. В этом случае потоки MP4 представляют те же теги ID3, что и MPEG_TS.
Обновите пользовательский интерфейс клиентского приложения видеоплеера.
Каждый идентификатор рекламного события можно сопоставить с ключом в объекте tags
из шага 4. Сопоставление этих значений выполняется в два этапа:
Проверьте объект
tags
на наличие ключа, соответствующего полному идентификатору рекламного события. Если совпадение найдено, получите тип события и связанные с ним объектыad
иad_break
. Эти события должны иметь типprogress
.Если совпадение для полного идентификатора рекламного события не найдено, проверьте объект
tags
на наличие ключа, совпадающего с первыми 17 символами идентификатора рекламного события. Получите тип события и связанные объектыad
иad_break
. Это должно получить все события с типами, отличными отprogress
.Используйте полученную информацию для обновления пользовательского интерфейса вашего плеера. Например, когда вы получаете событие
start
или первогоprogress
, скройте элементы управления поиском вашего проигрывателя и отобразите наложение, описывающее текущую позицию объявления в рекламной паузе, например: «Объявление 1 из 3».
Примеры идентификаторов рекламных событий
google_1234567890123456789 // Progress event ID
google_5555555555123456789 // First Quartile event ID
Пример объекта тегов
{
"google_5555555555":{
"ad":"0000229834_ad1",
"ad_break_id":"0000229834",
"type":"firstquartile"
},
"google_1234567890123456789":{
"ad":"0000229834_ad1",
"ad_break_id":"0000229834",
"type":"progress"
},
...
}
Отправка сигналов проверки носителя
Пинг-проверка мультимедиа должна отправляться в Менеджер рекламы каждый раз при получении рекламного события с типом, отличным от progress
.
Чтобы создать полный URL-адрес проверки мультимедиа рекламного события, добавьте полный идентификатор рекламного события к значению media_verification_url
из ответа на регистрацию потока.
Сделайте запрос GET с полным URL-адресом. Если запрос на проверку успешен, вы получите HTTP-ответ с кодом состояния 202
. В противном случае вы получите код ошибки HTTP 404
.
Пример запроса (cURL)
curl https://{...}/media/google_5555555555123456789
Пример успешного ответа
HTTP/1.1 202 Accepted