В этом руководстве рассматривается разработка клиентского приложения для загрузки прямой трансляции HLS или DASH с помощью API обслуживания Pod и вашего манипулятора манифестов.
Предпосылки
Прежде чем продолжить, вам необходимо иметь следующее:
- Пользовательский ключ ресурса для события прямой трансляции, настроенного с типом DAI " - Pod serving redirect". Чтобы получить этот ключ, выполните следующие действия:- Используйте клиентскую библиотеку SOAP API для вызова метода - LiveStreamEventService.createLiveStreamEventsс объектом- LiveStreamEventи свойством- dynamicAdInsertionType, установленным в значение перечисления- POD_SERVING_REDIRECT. Сведения обо всех клиентских библиотеках см. в разделе «Клиентские библиотеки и примеры кода» .
 
- Проверьте, доступен ли Interactive Media Ads (IMA) SDK для вашей платформы. Мы рекомендуем использовать IMA SDK для увеличения дохода. Подробнее см. в разделе «Настройка IMA SDK для 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для последующих шагов.
- Установите таймер, используя значение - polling_frequency, чтобы регулярно запрашивать метаданные для всех последовательных рекламных пауз.
Загрузите трансляцию в свой видеоплеер
Получив идентификатор сеанса из ответа на регистрацию, передайте его манипулятору манифеста или создайте 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 с контейнерами Transport Stream (TS) используют синхронизированные теги ID3 для передачи синхронизированных метаданных. Подробнее см. в разделе «О формате Common Media Application Format с HTTP Live Streaming (HLS)» . 
- Потоки DASH используют элементы - EventStreamдля указания событий в манифесте.
- Потоки DASH используют элементы - InbandEventStream, когда сегменты содержат блоки сообщений о событиях (- 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_1234567890123456789", ... }
- Отфильтруйте теги ID3 в формате - TXXXgoogle_{ad_event_ID}:- TXXXgoogle_1234567890123456789
Показать данные о событиях рекламы
 Чтобы найти объект TagSegment , выполните следующие действия:
- Извлеките объект - tagsметаданных объявления из метаданных объявления Poll . Объект- 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) для просмотра истории всех рекламных событий. Подробнее см. в разделе Мониторинг и устранение неполадок в прямой трансляции.