В этом руководстве рассматривается разработка клиентского приложения для загрузки потокового видео 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": "8d2b2292-6356-4c0e-94be-cece01d2df2e: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запрос к указанной конечной точке. Подробности см. в разделе Метод: метаданные .В следующем примере извлекаются метаданные рекламы:
const response = await fetch(metadata_url); console.log(await response.json());В случае успеха вы получите ответ PodMetadata с информацией о текущих и предстоящих рекламных паузах:
{ "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 }, ... } }Сохраните объект
tagsдля последующих шагов.Set a timer using the
polling_frequencyvalue to regularly request metadata for all successive ad breaks.
Загрузите видеопоток в свой видеоплеер.
Получив идентификатор сессии из ответа на запрос регистрации, передайте его в инструмент обработки манифеста или создайте 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.
To retrieve ID3 tags from your stream, refer to your video player's guide. For details, see Handle timed metadata guide
Чтобы получить идентификатор рекламного события из тегов 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_1234567890123456789", ... }Отфильтруйте ID3-теги в формате
TXXXgoogle_{ad_event_ID}:TXXXgoogle_1234567890123456789
Показать данные о рекламных событиях
Чтобы найти объект TagSegment , выполните следующие действия:
Получите объект
tagsиз объекта Poll ad metadata . Объектtagsпредставляет собой массив объектовTagSegment.Используйте полный идентификатор события объявления, чтобы найти объект
TagSegmentс типомprogress.Используйте первые 17 символов идентификатора рекламного события, чтобы найти объект
TagSegmentдругих типов.Получив
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_5555555555123456789`; const response = await fetch(completeUrl);В случае успеха вы получите ответ с кодом
202В противном случае вы получите код ошибки404.
С помощью монитора активности потока (SAM) можно просмотреть историю всех рекламных событий. Подробнее см. раздел «Мониторинг и устранение неполадок в прямом эфире».