В этом руководстве рассматривается разработка клиентского приложения для загрузки потокового видео HLS или DASH с использованием API для обслуживания подов и вашего инструмента для работы с манифестами.
Предварительные требования
Прежде чем продолжить, вам необходимо иметь следующее:
Пользовательский ключ ресурса для события прямой трансляции, настроенного с использованием типа DAI
Pod serving redirect. Чтобы получить этот ключ, выполните следующие действия:Используйте клиентскую библиотеку SOAP API для вызова метода
LiveStreamEventService.createLiveStreamEventsс объектомLiveStreamEventи свойствомdynamicAdInsertionType, установленным в значение перечисленияPOD_SERVING_REDIRECT. Список всех клиентских библиотек см. в разделе «Клиентские библиотеки и примеры кода» .
Узнайте, доступен ли SDK для интерактивной рекламы (IMA) для вашей платформы. Мы рекомендуем использовать SDK для IMA для увеличения дохода. Подробности см. в разделе «Настройка SDK для IMA для DAI» .
Отправить запрос на трансляцию
Когда пользователь выберет поток, выполните следующие действия:
Отправьте
POSTзапрос к методу службы прямой трансляции. Подробности см. в разделе Метод: stream .Передайте параметры таргетинга рекламы в форматах
application/x-www-form-urlencodedилиapplication/json. Этот запрос регистрирует сессию потока в Google DAI.В следующем примере выполняется запрос потока данных:
Кодирование формы
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());кодирование JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());В случае успеха вы увидите результат, похожий на следующий:
{ "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }В JSON-ответе найдите идентификатор сеанса потока и сохраните остальные данные для последующих шагов.
Метаданные опроса
Для получения метаданных объявления выполните следующие действия:
Прочитайте значение
metadata_urlиз ответа на запрос регистрации потока.Выполните первоначальный
GETзапрос к конечной точкеmetadata_url.- Параметр запроса
delta_tokenследует опустить. Этот процесс позволяет серверу вернуть полные метаданные для окна цифрового видеорегистратора (DVR) потока. Окно DVR содержит временной интервал трансляции, доступный для перемотки и воспроизведения зрителем. Ответ включает полеnext_delta_token.
- Параметр запроса
Для оптимизации пропускной способности сохраните значение
next_delta_tokenиз последнего ответа.При следующем запросе отправьте это значение в качестве параметра запроса
delta_token. Сервер вернет только метаданные, изменившиеся с момента генерации этого токена. Всегда отправляйте последний полученный токен. Не пытайтесь анализировать, изменять или создавать токен. Подробнее см. Метод: metadata .В следующем примере извлекаются метаданные рекламы:
// Initial request (returns full metadata and next_delta_token) let response = await fetch(metadata_url); let metadata = await response.json(); let deltaToken = metadata.next_delta_token; // Subsequent request (returns only changes since deltaToken) if (deltaToken) { const url = new URL(metadata_url); url.searchParams.append('delta_token', deltaToken); response = await fetch(url.toString()); const deltaMetadata = await response.json(); // Merge deltaMetadata into your local cache mergeMetadata(metadata, deltaMetadata); deltaToken = deltaMetadata.next_delta_token; }В случае успеха вы получите ответ PodMetadata . Если вы укажете параметр
delta_token, ответ будет содержать только объявления, рекламные паузы и теги, которые сервер добавил или обновил с момента генерации токена. Ответ также будет содержать новое значениеnext_delta_token. Если какие-либо рекламные паузы устарели, ответ также будет включать списокobsolete_ad_break_idsрекламных пауз, которые необходимо удалить из вашего кеша.{ "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0", "obsolete_ad_break_ids": ["0003069407"], "tags":{ "google_1022389921":{ "ad":"0003069408_ad1", "ad_break_id":"0003069408", "type":"start" }, ... }, "ads":{ "0003069408_ad1":{ "ad_break_id":"0003069408", "position":1, "duration":10.01, "title":"External - Pod Midroll 1", "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0003069408":{ "type":"mid", "duration":30, "ads":3 }, ... } }Сохраните объект
tagsи объедините обновления с локальным кешем. Если присутствует параметрobsolete_ad_break_ids, удалите эти рекламные паузы, а также связанные с ними объявления и теги из кеша.Установите таймер, используя значение
polling_frequency, для регулярного запроса метаданных. При каждом запросе отправляйте значениеnext_delta_token, полученное в последнем ответе с метаданными, в качестве параметра запросаdelta_token.
Загрузите видеопоток в свой видеоплеер.
Получив идентификатор сессии из ответа на запрос регистрации, передайте его в инструмент обработки манифеста или создайте URL-адрес манифеста для загрузки потока в видеоплеер.
Чтобы передать идентификатор сессии, см. документацию по вашему манипулятору манифестов. Если вы разрабатываете манипулятор манифестов, см. раздел «Манипулятор манифестов для прямых трансляций» .
В следующем примере формируется URL-адрес манифеста:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
Когда ваш плеер будет готов, начните воспроизведение.
Отслеживайте рекламные события.
Проверьте формат контейнера вашего потока на наличие метаданных с указанием времени:
В потоках HLS с контейнерами транспортного потока (TS) для передачи временных метаданных используются метки ID3. Подробнее см. раздел «Общий формат медиаприложений с потоковой передачей HTTP в реальном времени (HLS)» .
В потоках DASH для указания событий в манифесте используются элементы
EventStream.В потоках DASH используются элементы
InbandEventStream, когда сегменты содержат блоки Event Message (emsg) для данных полезной нагрузки, включая теги ID3. Подробнее см. InbandEventStream .В потоках CMAF, включая DASH и HLS, используются блоки
emsg, содержащие теги ID3.
Чтобы получить ID3-теги из вашего потока, обратитесь к руководству пользователя вашего видеоплеера. Подробности см. в руководстве по обработке временных метаданных.
Чтобы получить идентификатор рекламного события из тегов ID3, выполните следующие действия:
- Отфильтруйте события по
scheme_id_uriс помощьюurn:google:dai:2018илиhttps://aomedia.org/emsg/ID3. Извлеките массив байтов из поля
message_data.В следующем примере данные
emsgдекодируются в формат JSON:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1022389921", ... }Отфильтруйте ID3-теги в формате
TXXXgoogle_{ad_event_ID}:TXXXgoogle_1022389921
Показать данные о рекламных событиях
Чтобы найти объект TagSegment , выполните следующие действия:
Получите объект
tagsиз объекта Poll ad metadata . Объектtagsпредставляет собой массив объектовTagSegment.Используйте полный идентификатор события объявления, чтобы найти объект
TagSegmentс типомprogress.Используйте первые 17 символов идентификатора рекламного события, чтобы найти объект
TagSegmentдругих типов.Поскольку ваше клиентское приложение периодически опрашивает метаданные рекламы, может возникнуть задержка между моментом, когда ваш видеоплеер обнаружит тег ID3 в потоке, и моментом, когда связанные с ним метаданные станут доступны. Если ваше клиентское приложение не обнаружит тег ID3 среди сохраненных тегов, поместите тег в очередь и обработайте его повторно после следующего опроса метаданных. Держите тег в очереди до завершения обработки.
Получив
TagSegment, используйте свойствоad_break_idв качестве ключа, чтобы найти объектAdBreakв объекте метаданных объявленияad_breaks.В следующем примере находится объект
AdBreak:{ "type":"mid", "duration":15, "ads":1 }Используйте данные
TagSegmentиAdBreak, чтобы отобразить информацию о позиции объявления в рекламной паузе. Например,Ad 1 of 3.
Отправьте запросы на подтверждение медиафайлов.
Для каждого рекламного события, кроме событий, связанных с progress , отправляйте запрос на подтверждение медиафайла. Google DAI игнорирует события, progress , и частая отправка таких событий может негативно повлиять на производительность вашего приложения.
Для генерации полного URL-адреса подтверждения медиаконтента для рекламного события выполните следующие действия:
Из ответа потока добавьте полный идентификатор рекламного события к значению
media_verification_url.Выполните
GETзапрос, указав полный URL-адрес:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_1022389921`; const response = await fetch(completeUrl);В случае успеха вы получите ответ с кодом
202В противном случае вы получите код ошибки404.
С помощью монитора активности потока (SAM) можно просмотреть историю всех рекламных событий. Подробнее см. раздел «Мониторинг и устранение неполадок в прямом эфире».
,В этом руководстве рассматривается разработка клиентского приложения для загрузки потокового видео HLS или DASH с использованием API для обслуживания подов и вашего инструмента для работы с манифестами.
Предварительные требования
Прежде чем продолжить, вам необходимо иметь следующее:
Пользовательский ключ ресурса для события прямой трансляции, настроенного с использованием типа DAI
Pod serving redirect. Чтобы получить этот ключ, выполните следующие действия:Используйте клиентскую библиотеку SOAP API для вызова метода
LiveStreamEventService.createLiveStreamEventsс объектомLiveStreamEventи свойствомdynamicAdInsertionType, установленным в значение перечисленияPOD_SERVING_REDIRECT. Список всех клиентских библиотек см. в разделе «Клиентские библиотеки и примеры кода» .
Узнайте, доступен ли SDK для интерактивной рекламы (IMA) для вашей платформы. Мы рекомендуем использовать SDK для IMA для увеличения дохода. Подробности см. в разделе «Настройка SDK для IMA для DAI» .
Отправить запрос на трансляцию
Когда пользователь выберет поток, выполните следующие действия:
Отправьте
POSTзапрос к методу службы прямой трансляции. Подробности см. в разделе Метод: stream .Передайте параметры таргетинга рекламы в форматах
application/x-www-form-urlencodedилиapplication/json. Этот запрос регистрирует сессию потока в Google DAI.В следующем примере выполняется запрос потока данных:
Кодирование формы
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());кодирование JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());В случае успеха вы увидите результат, похожий на следующий:
{ "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }В JSON-ответе найдите идентификатор сеанса потока и сохраните остальные данные для последующих шагов.
Метаданные опроса
Для получения метаданных объявления выполните следующие действия:
Прочитайте значение
metadata_urlиз ответа на запрос регистрации потока.Выполните первоначальный
GETзапрос к конечной точкеmetadata_url.- Параметр запроса
delta_tokenследует опустить. Этот процесс позволяет серверу вернуть полные метаданные для окна цифрового видеорегистратора (DVR) потока. Окно DVR содержит временной интервал трансляции, доступный для перемотки и воспроизведения зрителем. Ответ включает полеnext_delta_token.
- Параметр запроса
Для оптимизации пропускной способности сохраните значение
next_delta_tokenиз последнего ответа.При следующем запросе отправьте это значение в качестве параметра запроса
delta_token. Сервер вернет только метаданные, изменившиеся с момента генерации этого токена. Всегда отправляйте последний полученный токен. Не пытайтесь анализировать, изменять или создавать токен. Подробнее см. Метод: metadata .В следующем примере извлекаются метаданные рекламы:
// Initial request (returns full metadata and next_delta_token) let response = await fetch(metadata_url); let metadata = await response.json(); let deltaToken = metadata.next_delta_token; // Subsequent request (returns only changes since deltaToken) if (deltaToken) { const url = new URL(metadata_url); url.searchParams.append('delta_token', deltaToken); response = await fetch(url.toString()); const deltaMetadata = await response.json(); // Merge deltaMetadata into your local cache mergeMetadata(metadata, deltaMetadata); deltaToken = deltaMetadata.next_delta_token; }В случае успеха вы получите ответ PodMetadata . Если вы укажете параметр
delta_token, ответ будет содержать только объявления, рекламные паузы и теги, которые сервер добавил или обновил с момента генерации токена. Ответ также будет содержать новое значениеnext_delta_token. Если какие-либо рекламные паузы устарели, ответ также будет включать списокobsolete_ad_break_idsрекламных пауз, которые необходимо удалить из вашего кеша.{ "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0", "obsolete_ad_break_ids": ["0003069407"], "tags":{ "google_1022389921":{ "ad":"0003069408_ad1", "ad_break_id":"0003069408", "type":"start" }, ... }, "ads":{ "0003069408_ad1":{ "ad_break_id":"0003069408", "position":1, "duration":10.01, "title":"External - Pod Midroll 1", "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0003069408":{ "type":"mid", "duration":30, "ads":3 }, ... } }Сохраните объект
tagsи объедините обновления с локальным кешем. Если присутствует параметрobsolete_ad_break_ids, удалите эти рекламные паузы, а также связанные с ними объявления и теги из кеша.Установите таймер, используя значение
polling_frequency, для регулярного запроса метаданных. При каждом запросе отправляйте значениеnext_delta_token, полученное в последнем ответе с метаданными, в качестве параметра запросаdelta_token.
Загрузите видеопоток в свой видеоплеер.
Получив идентификатор сессии из ответа на запрос регистрации, передайте его в инструмент обработки манифеста или создайте URL-адрес манифеста для загрузки потока в видеоплеер.
Чтобы передать идентификатор сессии, см. документацию по вашему манипулятору манифестов. Если вы разрабатываете манипулятор манифестов, см. раздел «Манипулятор манифестов для прямых трансляций» .
В следующем примере формируется URL-адрес манифеста:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
Когда ваш плеер будет готов, начните воспроизведение.
Отслеживайте рекламные события.
Проверьте формат контейнера вашего потока на наличие метаданных с указанием времени:
В потоках HLS с контейнерами транспортного потока (TS) для передачи временных метаданных используются метки ID3. Подробнее см. раздел «Общий формат медиаприложений с потоковой передачей HTTP в реальном времени (HLS)» .
В потоках DASH для указания событий в манифесте используются элементы
EventStream.В потоках DASH используются элементы
InbandEventStream, когда сегменты содержат блоки Event Message (emsg) для данных полезной нагрузки, включая теги ID3. Подробнее см. InbandEventStream .В потоках CMAF, включая DASH и HLS, используются блоки
emsg, содержащие теги ID3.
Чтобы получить ID3-теги из вашего потока, обратитесь к руководству пользователя вашего видеоплеера. Подробности см. в руководстве по обработке временных метаданных.
Чтобы получить идентификатор рекламного события из тегов ID3, выполните следующие действия:
- Отфильтруйте события по
scheme_id_uriс помощьюurn:google:dai:2018илиhttps://aomedia.org/emsg/ID3. Извлеките массив байтов из поля
message_data.В следующем примере данные
emsgдекодируются в формат JSON:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1022389921", ... }Отфильтруйте ID3-теги в формате
TXXXgoogle_{ad_event_ID}:TXXXgoogle_1022389921
Показать данные о рекламных событиях
Чтобы найти объект TagSegment , выполните следующие действия:
Получите объект
tagsиз объекта Poll ad metadata . Объектtagsпредставляет собой массив объектовTagSegment.Используйте полный идентификатор события объявления, чтобы найти объект
TagSegmentс типомprogress.Используйте первые 17 символов идентификатора рекламного события, чтобы найти объект
TagSegmentдругих типов.Поскольку ваше клиентское приложение периодически опрашивает метаданные рекламы, может возникнуть задержка между моментом, когда ваш видеоплеер обнаружит тег ID3 в потоке, и моментом, когда связанные с ним метаданные станут доступны. Если ваше клиентское приложение не обнаружит тег ID3 среди сохраненных тегов, поместите тег в очередь и обработайте его повторно после следующего опроса метаданных. Держите тег в очереди до завершения обработки.
Получив
TagSegment, используйте свойствоad_break_idв качестве ключа, чтобы найти объектAdBreakв объекте метаданных объявленияad_breaks.В следующем примере находится объект
AdBreak:{ "type":"mid", "duration":15, "ads":1 }Используйте данные
TagSegmentиAdBreak, чтобы отобразить информацию о позиции объявления в рекламной паузе. Например,Ad 1 of 3.
Отправьте запросы на подтверждение медиафайлов.
Для каждого рекламного события, кроме событий, связанных с progress , отправляйте запрос на подтверждение медиафайла. Google DAI игнорирует события, progress , и частая отправка таких событий может негативно повлиять на производительность вашего приложения.
Для генерации полного URL-адреса подтверждения медиаконтента для рекламного события выполните следующие действия:
Из ответа потока добавьте полный идентификатор рекламного события к значению
media_verification_url.Выполните
GETзапрос, указав полный URL-адрес:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_1022389921`; const response = await fetch(completeUrl);В случае успеха вы получите ответ с кодом
202В противном случае вы получите код ошибки404.
С помощью монитора активности потока (SAM) можно просмотреть историю всех рекламных событий. Подробнее см. раздел «Мониторинг и устранение неполадок в прямом эфире».
,В этом руководстве рассматривается разработка клиентского приложения для загрузки потокового видео HLS или DASH с использованием API для обслуживания подов и вашего инструмента для работы с манифестами.
Предварительные требования
Прежде чем продолжить, вам необходимо иметь следующее:
Пользовательский ключ ресурса для события прямой трансляции, настроенного с использованием типа DAI
Pod serving redirect. Чтобы получить этот ключ, выполните следующие действия:Используйте клиентскую библиотеку SOAP API для вызова метода
LiveStreamEventService.createLiveStreamEventsс объектомLiveStreamEventи свойствомdynamicAdInsertionType, установленным в значение перечисленияPOD_SERVING_REDIRECT. Список всех клиентских библиотек см. в разделе «Клиентские библиотеки и примеры кода» .
Узнайте, доступен ли SDK для интерактивной рекламы (IMA) для вашей платформы. Мы рекомендуем использовать SDK для IMA для увеличения дохода. Подробности см. в разделе «Настройка SDK для IMA для DAI» .
Отправить запрос на трансляцию
Когда пользователь выберет поток, выполните следующие действия:
Отправьте
POSTзапрос к методу службы прямой трансляции. Подробности см. в разделе Метод: stream .Передайте параметры таргетинга рекламы в форматах
application/x-www-form-urlencodedилиapplication/json. Этот запрос регистрирует сессию потока в Google DAI.В следующем примере выполняется запрос потока данных:
Кодирование формы
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());кодирование JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());В случае успеха вы увидите результат, похожий на следующий:
{ "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }В JSON-ответе найдите идентификатор сеанса потока и сохраните остальные данные для последующих шагов.
Метаданные опроса
Для получения метаданных объявления выполните следующие действия:
Прочитайте значение
metadata_urlиз ответа на запрос регистрации потока.Выполните первоначальный
GETзапрос к конечной точкеmetadata_url.- Параметр запроса
delta_tokenследует опустить. Этот процесс позволяет серверу вернуть полные метаданные для окна цифрового видеорегистратора (DVR) потока. Окно DVR содержит временной интервал трансляции, доступный для перемотки и воспроизведения зрителем. Ответ включает полеnext_delta_token.
- Параметр запроса
Для оптимизации пропускной способности сохраните значение
next_delta_tokenиз последнего ответа.При следующем запросе отправьте это значение в качестве параметра запроса
delta_token. Сервер вернет только метаданные, изменившиеся с момента генерации этого токена. Всегда отправляйте последний полученный токен. Не пытайтесь анализировать, изменять или создавать токен. Подробнее см. Метод: metadata .В следующем примере извлекаются метаданные рекламы:
// Initial request (returns full metadata and next_delta_token) let response = await fetch(metadata_url); let metadata = await response.json(); let deltaToken = metadata.next_delta_token; // Subsequent request (returns only changes since deltaToken) if (deltaToken) { const url = new URL(metadata_url); url.searchParams.append('delta_token', deltaToken); response = await fetch(url.toString()); const deltaMetadata = await response.json(); // Merge deltaMetadata into your local cache mergeMetadata(metadata, deltaMetadata); deltaToken = deltaMetadata.next_delta_token; }В случае успеха вы получите ответ PodMetadata . Если вы укажете параметр
delta_token, ответ будет содержать только объявления, рекламные паузы и теги, которые сервер добавил или обновил с момента генерации токена. Ответ также будет содержать новое значениеnext_delta_token. Если какие-либо рекламные паузы устарели, ответ также будет включать списокobsolete_ad_break_idsрекламных пауз, которые необходимо удалить из вашего кеша.{ "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0", "obsolete_ad_break_ids": ["0003069407"], "tags":{ "google_1022389921":{ "ad":"0003069408_ad1", "ad_break_id":"0003069408", "type":"start" }, ... }, "ads":{ "0003069408_ad1":{ "ad_break_id":"0003069408", "position":1, "duration":10.01, "title":"External - Pod Midroll 1", "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0003069408":{ "type":"mid", "duration":30, "ads":3 }, ... } }Сохраните объект
tagsи объедините обновления с локальным кешем. Если присутствует параметрobsolete_ad_break_ids, удалите эти рекламные паузы, а также связанные с ними объявления и теги из кеша.Установите таймер, используя значение
polling_frequency, для регулярного запроса метаданных. При каждом запросе отправляйте значениеnext_delta_token, полученное в последнем ответе с метаданными, в качестве параметра запросаdelta_token.
Загрузите видеопоток в свой видеоплеер.
Получив идентификатор сессии из ответа на запрос регистрации, передайте его в инструмент обработки манифеста или создайте URL-адрес манифеста для загрузки потока в видеоплеер.
Чтобы передать идентификатор сессии, см. документацию по вашему манипулятору манифестов. Если вы разрабатываете манипулятор манифестов, см. раздел «Манипулятор манифестов для прямых трансляций» .
В следующем примере формируется URL-адрес манифеста:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
Когда ваш плеер будет готов, начните воспроизведение.
Отслеживайте рекламные события.
Проверьте формат контейнера вашего потока на наличие метаданных с указанием времени:
В потоках HLS с контейнерами транспортного потока (TS) для передачи временных метаданных используются метки ID3. Подробнее см. раздел «Общий формат медиаприложений с потоковой передачей HTTP в реальном времени (HLS)» .
В потоках DASH для указания событий в манифесте используются элементы
EventStream.В потоках DASH используются элементы
InbandEventStream, когда сегменты содержат блоки Event Message (emsg) для данных полезной нагрузки, включая теги ID3. Подробнее см. InbandEventStream .В потоках CMAF, включая DASH и HLS, используются блоки
emsg, содержащие теги ID3.
Чтобы получить ID3-теги из вашего потока, обратитесь к руководству пользователя вашего видеоплеера. Подробности см. в руководстве по обработке временных метаданных.
Чтобы получить идентификатор рекламного события из тегов ID3, выполните следующие действия:
- Отфильтруйте события по
scheme_id_uriс помощьюurn:google:dai:2018илиhttps://aomedia.org/emsg/ID3. Извлеките массив байтов из поля
message_data.В следующем примере данные
emsgдекодируются в формат JSON:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1022389921", ... }Отфильтруйте ID3-теги в формате
TXXXgoogle_{ad_event_ID}:TXXXgoogle_1022389921
Показать данные о рекламных событиях
Чтобы найти объект TagSegment , выполните следующие действия:
Получите объект
tagsиз объекта Poll ad metadata . Объектtagsпредставляет собой массив объектовTagSegment.Используйте полный идентификатор события объявления, чтобы найти объект
TagSegmentс типомprogress.Используйте первые 17 символов идентификатора рекламного события, чтобы найти объект
TagSegmentдругих типов.Поскольку ваше клиентское приложение периодически опрашивает метаданные рекламы, может возникнуть задержка между моментом, когда ваш видеоплеер обнаружит тег ID3 в потоке, и моментом, когда связанные с ним метаданные станут доступны. Если ваше клиентское приложение не обнаружит тег ID3 среди сохраненных тегов, поместите тег в очередь и обработайте его повторно после следующего опроса метаданных. Держите тег в очереди до завершения обработки.
Получив
TagSegment, используйте свойствоad_break_idв качестве ключа, чтобы найти объектAdBreakв объекте метаданных объявленияad_breaks.В следующем примере находится объект
AdBreak:{ "type":"mid", "duration":15, "ads":1 }Используйте данные
TagSegmentиAdBreak, чтобы отобразить информацию о позиции объявления в рекламной паузе. Например,Ad 1 of 3.
Отправьте запросы на подтверждение медиафайлов.
Для каждого рекламного события, кроме событий, связанных с progress , отправляйте запрос на подтверждение медиафайла. Google DAI игнорирует события, progress , и частая отправка таких событий может негативно повлиять на производительность вашего приложения.
Для генерации полного URL-адреса подтверждения медиаконтента для рекламного события выполните следующие действия:
Из ответа потока добавьте полный идентификатор рекламного события к значению
media_verification_url.Выполните
GETзапрос, указав полный URL-адрес:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_1022389921`; const response = await fetch(completeUrl);В случае успеха вы получите ответ с кодом
202В противном случае вы получите код ошибки404.
С помощью монитора активности потока (SAM) можно просмотреть историю всех рекламных событий. Подробнее см. раздел «Мониторинг и устранение неполадок в прямом эфире».