Манипулятор манифеста для потоков VOD

API обслуживания модулей обеспечивает доступ к модулям видеорекламы с адаптивным битрейтом, подготовленным таким образом, что их можно вставлять непосредственно в пользовательский плейлист мультимедиа HLS или MPEG-DASH.

Это руководство сосредоточено на реализации базового сервера манипуляции манифестами Pod Serving для потоков VOD.

Получение запросов манифеста потока

Ваш манипулятор манифеста должен предоставить конечную точку API для прослушивания запросов манифеста от клиентского приложения видеопроигрывателя. Как минимум, эта конечная точка должна получить идентификатор потока из клиентского приложения проигрывателя. Этот идентификатор потока используется для идентификации сеанса потоковой передачи в Менеджере рекламы в запросах вашего пакета объявлений.

Вам также необходимо собрать некоторую другую информацию для идентификации соответствующего потока контента, например идентификатор контента.

Пример конечной точки запроса манифеста

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
Параметры пути
stream_id Идентификатор потока Менеджера рекламы из клиентского видеоплеера.
content_id Гипотетический идентификатор, соответствующий видеоконтенту в вашей системе.
format Гипотетический параметр, соответствующий формату потока. Один из следующих вариантов:
mpd Для потоков MPEG-DASH
m3u8 Для HLS-потоков

Получить поток контента

Используйте идентификатор контента, полученный из запроса манифеста, чтобы выбрать поток контента для объединения с рекламой.

Запрос манифестов рекламных пакетов

Чтобы запросить рекламу из Менеджера рекламы, ваш сервер должен отправить POST-запрос к конечной точке модулей объявлений, передав запрошенные профили кодирования и тег объявления. Этот запрос также включает идентификатор потока, который вы собрали на шаге 1.

Взамен вы получаете список объектов рекламных модулей, содержащий файлы манифеста для рекламных модулей, запрошенных рекламным тегом издателя, а также информацию о том, когда и где они должны быть вставлены в ваш контент.

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
Параметры пути
network_code Сетевой код Менеджера рекламы 360 издателя.
stream_id Идентификатор потока из клиентского приложения видеоплеера.

Тело JSON

Параметры тела
encoding_profiles Required Список JSON-представлений профилей кодировки, которые вы хотите получать для каждой рекламной паузы. Подробности смотрите ниже

Чтобы сделать воспроизведение максимально плавным, оно должно соответствовать набору профилей кодирования, используемых в вашем потоке контента.

ad_tag Required Рекламный тег для запроса рекламы VMAP.
cuepoints Optional Список ключевых точек в потоке контента, куда будут вставлены рекламные паузы в середине ролика. Метки измеряются в секундах с плавающей запятой.

Требуется только для ответов VMAP, содержащих промежуточные ролики с использованием позиционных смещений времени. Это редкость.

content_duration_seconds Optional Продолжительность контента в секундах.

Требуется только для ответов VMAP, содержащих промежуточные ролики с процентными смещениями по времени. Это редкость.

manifest_type Optional Формат запрашиваемых рекламных потоков: hls или dash . Значение по умолчанию — hls .
dai_options Optional Дополнительные параметры, управляющие аспектами отображения манифестов. Подробности смотрите ниже
Профиль кодирования
profile_name Required Идентификатор этого профиля кодирования. Это значение может быть любой строкой по вашему выбору, но вы не можете иметь несколько профилей кодирования с одним и тем же именем в одном потоке.
type Required Тип кодирования потока, описываемого этим профилем кодирования. Типы контента: media , iframe , subtitles .
container_type Required Формат контейнера, используемый этим профилем кодирования. Форматы контейнеров: mpeg2ts , fmp4cmaf , hls_packed_audio
video_settings Optional Требуется, если тип профиля кодировки — iframe . В противном случае разрешено только в том случае, если тип мультимедиа содержит видео. Подробности смотрите ниже
audio_settings Optional Требуется, если профиль кодирования содержит аудио. Разрешено только в том случае, если тип медиа. Подробности смотрите ниже
subtitle_settings Optional Требуется, если профиль кодирования содержит субтитры. Подробности смотрите ниже
Настройки видео
codec Required Строка кодека RFC6381.

Пример: avc1.4d000c

bitrate Required Целое число, представляющее максимальный битрейт видео этого профиля в байтах в секунду.
frames_per_second Required Частота кадров видео с плавающей запятой.
resolution Required Значение в формате JSON, содержащее ширину и высоту видео в пикселях.

Пример: {"width": 640, "height": 320}

Настройки звука
codec Required Строка кодека RFC6381.

Пример: mp4a.40.5

bitrate Required Целое число, представляющее максимальный битрейт аудио этого профиля в байтах в секунду.

Пример: 300000

channels Required Целое число, представляющее количество аудиоканалов, включая низкочастотные каналы.
sample_rate Required Целое число, представляющее частоту дискретизации звука в герцах.

Пример: 4800

Настройки субтитров
format Required Формат файла, используемый внутриполосными субтитрами. Поддерживаемые значения: webvtt или ttml .
language Optional Язык субтитров в виде языковой строки RFC5646. Если это значение указано, оно используется только для рендеринга DASH.

Пример: en-us

Опции DAI
dash_profile Optional Профиль MPEG-DASH для применения к манифестам рекламных модулей. Этот параметр используется только для манифестов DASH. Допустимые значения — live или on-demand . Значение по умолчанию — on-demand .

Значение live соответствует профилю MPEG-DASH "urn:mpeg:dash:profile:isoff-live:2011" .

Значение on-demand соответствует профилю MPEG-DASH urn:mpeg:dash:profile:isoff-on-demand:2011 .

ad_pod_timeout Optional Максимальное время, затрачиваемое на выбор объявлений и создание рекламных модулей, в секундах с плавающей запятой. По истечении этого времени Менеджер рекламы возвращает все объявления, уже выбранные в ответе ad_pods , и прекращает обработку.
sam_id Optional Указывает альтернативный ключ отладки, который можно использовать для поиска сеансов в мониторе активности потока .

Ответ

Параметры ответа
valid_for Продолжительность действия этих плейлистов рекламных модулей в формате dhms (дни, часы, минуты, секунды).
valid_until Дата и время, до которых эти плейлисты модулей объявлений действительны в виде строки даты и времени ISO8601, в формате yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm .
ad_pods Список модулей объявлений, выбранных для этого потока.
Рекламный блок
manifest_uris Только для потоков HLS. Сопоставление идентификаторов профилей кодирования с URI манифеста HLS.
mpd_uri Только для потоков DASH. URI DASH MPD.
type Тип рекламного пакета. Типы рекламных блоков: pre , mid и post .
start Только для пакетов объявлений в середине ролика. Позиция в потоке, куда следует вставить этот рекламный блок, в секундах с плавающей запятой.
duration Продолжительность этого рекламного пакета в секундах с плавающей запятой.
midroll_index Только для пакетов объявлений в середине ролика. Индекс текущего рекламного блока в середине ролика. Индексация начинается с 1 .

Пример запроса (cURL)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

Пример тела запроса

Это содержимое request-body.json , указанное в вызове cURL выше.

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

Пример ответа

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

Встраивайте рекламные блоки в контент

Процесс встраивания рекламных модулей в ваши потоки контента зависит от вашей реализации, формата потока и того, какие функции вы выбираете для реализации из спецификаций формата. Следующие рабочие процессы представляют собой предложения по управлению этим процессом. Точные детали вашей реализации могут различаться в зависимости от потребностей вашего бизнеса и потоков контента.

HLS-потоки

Если вы сшиваете поток в формате HLS, ваш поток контента будет представлять собой многовариантный список воспроизведения со ссылками на отдельные манифесты потока, по одному для каждого профиля кодирования. Ваши рекламные блоки необходимо вставить в каждый из этих вариантов манифеста. Один из способов сделать это — подготовить все манифесты вариантов и передать их в сеть доставки контента (CDN) для размещения. Итоговый многовариантный плейлист представляет собой набор ссылок на эти манифесты, размещенные в CDN.

Перебирать профили кодирования

Для каждого профиля кодирования соберите все связанные манифесты модулей объявлений из ответа Менеджера рекламы вместе с соответствующим временем начала. Для модулей объявлений в начале ролика установите время начала 0 . Для пост-роллов используйте продолжительность контента в качестве времени начала рекламного блока. Определите вариантный поток в многовариантном списке воспроизведения, который соответствует настройкам аудио и видео каждого профиля кодирования.

Пример массива модулей объявлений
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
Пример плейлиста с многовариантным контентом
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
Пример собранных данных о вариантах
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

Вставьте рекламу в каждый вариант манифеста.

Для каждого потока вариантов просмотрите сегменты манифеста контента, сохраняя общее количество затраченного времени контента. Когда вы дойдете до начальной позиции рекламного модуля, извлеките список сегментов из манифеста рекламного модуля, оберните список сегментов двумя тегами #EXT-X-DISCONTINUITY и вставьте список в текущее местоположение манифеста контента. . Продолжайте этот процесс, пока не будут обработаны все блоки объявлений и варианты потоков.

Полученные манифесты должны соответствовать стандарту HLS. Таким образом, в зависимости от того, какие функции спецификации включает в себя ваш манифест контента, вам может потребоваться выполнить окончательный просмотр объединенного манифеста, чтобы исправить порядковые номера мультимедиа, продолжительность контента, порядковые номера разрывов и любые другие теги, которые необходимо обновить, чтобы принять учитывать новые рекламные сегменты. После устранения любых несоответствий со стандартом отправьте манифест каждого конкретного пользовательского варианта в свою CDN для хостинга.

Если ваш манифест контента зашифрован, вам необходимо сохранить последний ключ шифрования, найденный перед началом текущего рекламного модуля, в теге #EXT-X-KEY . Затем вам нужно добавить тег #EXT-X-KEY:METHOD=NONE чтобы удалить шифрование перед первым сегментом каждого рекламного модуля. Наконец, вы должны добавить копию сохраненного тега #EXT-X-KEY перед первым сегментом контента после каждого рекламного модуля, чтобы восстановить шифрование контента.

Пример собранных данных о вариантах
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
Пример манифеста контента

Это содержимое манифеста https://{...}/1080p.m3u8 указанного в собранных данных о вариантах.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
Пример манифеста рекламного блока

Это содержимое манифеста https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 , указанного в собранных данных о вариантах.

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
Пример манифеста сшитого варианта

Это будет итоговый сшитый вариант манифеста, переданный в CDN и размещенный по https://cdn.{...}/{userid}/1080p.m3u8 .

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

Создайте многовариантный плейлист

Соберите адреса CDN для каждого заполненного вариантного манифеста, а также соответствующие сведения о профиле кодирования и соберите результаты в новый многовариантный манифест. Этот пользовательский манифест возвращается как ответ на запрос манифеста, который вы получили на шаге 1.

Пример итогового многовариантного плейлиста
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

Потоки MPEG DASH

Если вы объединяете поток в формате MPEG DASH, вам нужно создать только один файл. Это может упростить объединение потоков DASH, чем HLS.

Правильно подготовленный файл описания медиапрезентации (MPD) MPEG DASH должен состоять из нескольких периодов, каждый из которых содержит несколько представлений. Каждое представление должно соответствовать одному из ваших профилей кодирования. Каждый модуль объявлений, возвращаемый из Менеджера рекламы, также представляет собой файл MPD, содержащий последовательность периодов с совпадающими представлениями.

Чтобы объединить эти файлы MPD, начните с запоминания времени начала каждого рекламного модуля. Для предварительной рекламы вставьте периоды модуля рекламы в начале ролика перед любым периодом контента. Для построллов вставляйте периоды рекламных блоков после роликов после всех периодов контента. Перебирайте периоды в MPD контента, отслеживая прошедшее время воспроизведения для всех периодов обработанного контента. Когда вы достигнете границы между периодами, которая соответствует времени начала рекламного блока, вставьте периоды из MPD-файла соответствующего рекламного блока в середине ролика на эту границу.

Окончательный сшитый файл MPD должен полностью соответствовать спецификациям MPEG_DASH, поэтому вам, возможно, придется перебрать окончательный файл еще раз, корректируя время начала периода, фиксируя продолжительность мультимедийного представления с учетом вновь вставленных рекламных периодов и разрешая любые другие конфликты, которые могли возникнуть в процессе сшивания.

Пример содержания MPD

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Пример рекламного блока в формате JSON

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

Пример рекламного блока MPD

Это содержимое mpd_uri из JSON рекламного модуля выше.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

Пример сшитого MPD

Используйте это как ответ на первоначальный запрос манифеста потока.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Дополнительные ресурсы

,

API обслуживания модулей обеспечивает доступ к модулям видеорекламы с адаптивным битрейтом, подготовленным таким образом, что их можно вставлять непосредственно в пользовательский плейлист мультимедиа HLS или MPEG-DASH.

Это руководство сосредоточено на реализации базового сервера манипуляции манифестами Pod Serving для потоков VOD.

Получение запросов манифеста потока

Ваш манипулятор манифеста должен предоставить конечную точку API для прослушивания запросов манифеста от клиентского приложения видеопроигрывателя. Как минимум, эта конечная точка должна получить идентификатор потока из клиентского приложения проигрывателя. Этот идентификатор потока используется для идентификации сеанса потоковой передачи в Менеджере рекламы в запросах вашего пакета объявлений.

Вам также необходимо собрать некоторую другую информацию для идентификации соответствующего потока контента, например идентификатор контента.

Пример конечной точки запроса манифеста

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
Параметры пути
stream_id Идентификатор потока Менеджера рекламы из клиентского видеоплеера.
content_id Гипотетический идентификатор, соответствующий видеоконтенту в вашей системе.
format Гипотетический параметр, соответствующий формату потока. Один из следующих вариантов:
mpd Для потоков MPEG-DASH
m3u8 Для HLS-потоков

Получить поток контента

Используйте идентификатор контента, полученный из запроса манифеста, чтобы выбрать поток контента для объединения с рекламой.

Запрос манифестов рекламных пакетов

Чтобы запросить рекламу из Менеджера рекламы, ваш сервер должен отправить POST-запрос к конечной точке модулей объявлений, передав запрошенные профили кодирования и тег объявления. Этот запрос также включает идентификатор потока, который вы собрали на шаге 1.

Взамен вы получаете список объектов рекламных модулей, содержащий файлы манифеста для рекламных модулей, запрошенных рекламным тегом издателя, а также информацию о том, когда и где они должны быть вставлены в ваш контент.

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
Параметры пути
network_code Сетевой код Менеджера рекламы 360 издателя.
stream_id Идентификатор потока из клиентского приложения видеоплеера.

Тело JSON

Параметры тела
encoding_profiles Required Список JSON-представлений профилей кодировки, которые вы хотите получать для каждой рекламной паузы. Подробности смотрите ниже

Чтобы сделать воспроизведение максимально плавным, оно должно соответствовать набору профилей кодирования, используемых в вашем потоке контента.

ad_tag Required Рекламный тег для запроса рекламы VMAP.
cuepoints Optional Список ключевых точек в потоке контента, куда будут вставлены рекламные паузы в середине ролика. Метки измеряются в секундах с плавающей запятой.

Требуется только для ответов VMAP, содержащих промежуточные ролики с использованием позиционных смещений времени. Это редкость.

content_duration_seconds Optional Продолжительность контента в секундах.

Требуется только для ответов VMAP, содержащих промежуточные ролики с процентными смещениями по времени. Это редкость.

manifest_type Optional Формат запрашиваемых рекламных потоков: hls или dash . Значение по умолчанию — hls .
dai_options Optional Дополнительные параметры, управляющие аспектами отображения манифестов. Подробности смотрите ниже
Профиль кодирования
profile_name Required Идентификатор этого профиля кодирования. Это значение может быть любой строкой по вашему выбору, но вы не можете иметь несколько профилей кодирования с одним и тем же именем в одном потоке.
type Required Тип кодирования потока, описываемого этим профилем кодирования. Типы контента: media , iframe , subtitles .
container_type Required Формат контейнера, используемый этим профилем кодирования. Форматы контейнеров: mpeg2ts , fmp4cmaf , hls_packed_audio
video_settings Optional Требуется, если тип профиля кодировки — iframe . В противном случае разрешено только в том случае, если тип мультимедиа содержит видео. Подробности смотрите ниже
audio_settings Optional Требуется, если профиль кодирования содержит аудио. Разрешено только в том случае, если тип медиа. Подробности смотрите ниже
subtitle_settings Optional Требуется, если профиль кодирования содержит субтитры. Подробности смотрите ниже
Настройки видео
codec Required Строка кодека RFC6381.

Пример: avc1.4d000c

bitrate Required Целое число, представляющее максимальный битрейт видео этого профиля в байтах в секунду.
frames_per_second Required Частота кадров видео с плавающей запятой.
resolution Required Значение в формате JSON, содержащее ширину и высоту видео в пикселях.

Пример: {"width": 640, "height": 320}

Настройки звука
codec Required Строка кодека RFC6381.

Пример: mp4a.40.5

bitrate Required Целое число, представляющее максимальный битрейт аудио этого профиля в байтах в секунду.

Пример: 300000

channels Required Целое число, представляющее количество аудиоканалов, включая низкочастотные каналы.
sample_rate Required Целое число, представляющее частоту дискретизации звука в герцах.

Пример: 4800

Настройки субтитров
format Required Формат файла, используемый внутриполосными субтитрами. Поддерживаемые значения: webvtt или ttml .
language Optional Язык субтитров в виде языковой строки RFC5646. Если это значение указано, оно используется только для рендеринга DASH.

Пример: en-us

Опции DAI
dash_profile Optional Профиль MPEG-DASH для применения к манифестам рекламных модулей. Этот параметр используется только для манифестов DASH. Допустимые значения — live или on-demand . Значение по умолчанию — on-demand .

Значение live соответствует профилю MPEG-DASH "urn:mpeg:dash:profile:isoff-live:2011" .

Значение on-demand соответствует профилю MPEG-DASH urn:mpeg:dash:profile:isoff-on-demand:2011 .

ad_pod_timeout Optional Максимальное время, затрачиваемое на выбор объявлений и создание рекламных модулей, в секундах с плавающей запятой. По истечении этого времени Менеджер рекламы возвращает все объявления, уже выбранные в ответе ad_pods , и прекращает обработку.
sam_id Optional Указывает альтернативный ключ отладки, который можно использовать для поиска сеансов в мониторе активности потока .

Ответ

Параметры ответа
valid_for Продолжительность действия этих плейлистов рекламных модулей в формате dhms (дни, часы, минуты, секунды).
valid_until Дата и время, до которых эти плейлисты модулей объявлений действительны в виде строки даты и времени ISO8601, в формате yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm .
ad_pods Список модулей объявлений, выбранных для этого потока.
Рекламный блок
manifest_uris Только для потоков HLS. Сопоставление идентификаторов профилей кодирования с URI манифеста HLS.
mpd_uri Только для потоков DASH. URI DASH MPD.
type Тип рекламного пакета. Типы рекламных блоков: pre , mid и post .
start Только для пакетов объявлений в середине ролика. Позиция в потоке, куда следует вставить этот рекламный блок, в секундах с плавающей запятой.
duration Продолжительность этого рекламного пакета в секундах с плавающей запятой.
midroll_index Только для пакетов объявлений в середине ролика. Индекс текущего рекламного блока в середине ролика. Индексация начинается с 1 .

Пример запроса (cURL)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

Пример тела запроса

Это содержимое request-body.json , указанное в вызове cURL выше.

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

Пример ответа

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

Встраивайте рекламные блоки в контент

Процесс встраивания рекламных модулей в ваши потоки контента зависит от вашей реализации, формата потока и того, какие функции вы выбираете для реализации из спецификаций формата. Следующие рабочие процессы представляют собой предложения по управлению этим процессом. Точные детали вашей реализации могут различаться в зависимости от потребностей вашего бизнеса и потоков контента.

HLS-потоки

Если вы сшиваете поток в формате HLS, ваш поток контента будет представлять собой многовариантный список воспроизведения со ссылками на отдельные манифесты потока, по одному для каждого профиля кодирования. Ваши рекламные блоки необходимо вставить в каждый из этих вариантов манифеста. Один из способов сделать это — подготовить все манифесты вариантов и передать их в сеть доставки контента (CDN) для размещения. Итоговый многовариантный плейлист представляет собой набор ссылок на эти манифесты, размещенные в CDN.

Перебирать профили кодирования

Для каждого профиля кодирования соберите все связанные манифесты модулей объявлений из ответа Менеджера рекламы вместе с соответствующим временем начала. Для модулей объявлений в начале ролика установите время начала 0 . Для пост-роллов используйте продолжительность контента в качестве времени начала рекламного блока. Определите вариантный поток в многовариантном списке воспроизведения, который соответствует настройкам аудио и видео каждого профиля кодирования.

Пример массива модулей объявлений
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
Пример плейлиста с многовариантным контентом
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
Пример собранных данных о вариантах
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

Вставьте рекламу в каждый вариант манифеста.

Для каждого потока вариантов просмотрите сегменты манифеста контента, сохраняя общее количество затраченного времени контента. Когда вы дойдете до начальной позиции рекламного модуля, извлеките список сегментов из манифеста рекламного модуля, оберните список сегментов двумя тегами #EXT-X-DISCONTINUITY и вставьте список в текущее местоположение манифеста контента. . Продолжайте этот процесс, пока не будут обработаны все блоки объявлений и варианты потоков.

Полученные манифесты должны соответствовать стандарту HLS. Таким образом, в зависимости от того, какие функции спецификации включает в себя ваш манифест контента, вам может потребоваться выполнить окончательный просмотр объединенного манифеста, чтобы исправить порядковые номера мультимедиа, продолжительность контента, порядковые номера разрывов и любые другие теги, которые необходимо обновить, чтобы принять учитывать новые рекламные сегменты. После устранения любых несоответствий со стандартом отправьте манифест каждого конкретного пользовательского варианта в свою CDN для хостинга.

Если ваш манифест контента зашифрован, вам необходимо сохранить последний ключ шифрования, найденный перед началом текущего рекламного модуля, в теге #EXT-X-KEY . Затем вам нужно добавить тег #EXT-X-KEY:METHOD=NONE чтобы удалить шифрование перед первым сегментом каждого рекламного модуля. Наконец, вы должны добавить копию сохраненного тега #EXT-X-KEY перед первым сегментом контента после каждого рекламного модуля, чтобы восстановить шифрование контента.

Пример собранных данных о вариантах
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
Пример манифеста контента

Это содержимое манифеста https://{...}/1080p.m3u8 указанного в собранных данных о вариантах.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
Пример манифеста рекламного блока

Это содержимое манифеста https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 , указанного в собранных данных о вариантах.

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
Пример манифеста сшитого варианта

Это будет итоговый сшитый вариант манифеста, переданный в CDN и размещенный по https://cdn.{...}/{userid}/1080p.m3u8 .

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

Создайте многовариантный плейлист

Соберите адреса CDN для каждого заполненного вариантного манифеста, а также соответствующие сведения о профиле кодирования и соберите результаты в новый многовариантный манифест. Этот пользовательский манифест возвращается как ответ на запрос манифеста, который вы получили на шаге 1.

Пример итогового многовариантного плейлиста
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

Потоки MPEG DASH

Если вы объединяете поток в формате MPEG DASH, вам нужно создать только один файл. Это может упростить объединение потоков DASH, чем HLS.

Правильно подготовленный файл описания медиапрезентации (MPD) MPEG DASH должен состоять из нескольких периодов, каждый из которых содержит несколько представлений. Каждое представление должно соответствовать одному из ваших профилей кодирования. Каждый модуль объявлений, возвращаемый из Менеджера рекламы, также представляет собой файл MPD, содержащий последовательность периодов с совпадающими представлениями.

Чтобы объединить эти файлы MPD, начните с запоминания времени начала каждого рекламного модуля. Для предварительной рекламы вставьте периоды модуля объявлений в начале ролика перед любым периодом контента. Для построллов вставляйте периоды рекламных блоков после роликов после всех периодов контента. Перебирайте периоды в MPD контента, отслеживая прошедшее время воспроизведения для всех периодов обработанного контента. Когда вы достигнете границы между периодами, которая соответствует времени начала рекламного блока, вставьте периоды из MPD-файла соответствующего рекламного блока в середине ролика на эту границу.

Окончательный сшитый файл MPD должен полностью соответствовать спецификациям MPEG_DASH, поэтому вам, возможно, придется перебрать окончательный файл еще раз, корректируя время начала периода, фиксируя продолжительность мультимедийного представления с учетом вновь вставленных рекламных периодов и разрешая любые другие конфликты, которые могли возникнуть в процессе сшивания.

Пример содержимого MPD

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Пример рекламного блока в формате JSON

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

Пример рекламного блока MPD

Это содержимое mpd_uri из JSON рекламного модуля выше.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

Пример сшитого MPD

Используйте это как ответ на первоначальный запрос манифеста потока.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Дополнительные ресурсы

,

API обслуживания модулей обеспечивает доступ к модулям видеорекламы с адаптивным битрейтом, подготовленным таким образом, что их можно вставлять непосредственно в пользовательский плейлист мультимедиа HLS или MPEG-DASH.

Это руководство сосредоточено на реализации базового сервера манипуляции манифестами Pod Serving для потоков VOD.

Получение запросов манифеста потока

Ваш манипулятор манифеста должен предоставить конечную точку API для прослушивания запросов манифеста от клиентского приложения видеопроигрывателя. Как минимум, эта конечная точка должна получить идентификатор потока из клиентского приложения проигрывателя. Этот идентификатор потока используется для идентификации сеанса потоковой передачи в Менеджере рекламы в запросах вашего пакета объявлений.

Вам также необходимо собрать некоторую другую информацию для идентификации соответствующего потока контента, например идентификатор контента.

Пример конечной точки запроса манифеста

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
Параметры пути
stream_id Идентификатор потока Менеджера рекламы из клиентского видеоплеера.
content_id Гипотетический идентификатор, соответствующий видеоконтенту в вашей системе.
format Гипотетический параметр, соответствующий формату потока. Один из следующих вариантов:
mpd Для потоков MPEG-DASH
m3u8 Для HLS-потоков

Получить поток контента

Используйте идентификатор контента, полученный из запроса манифеста, чтобы выбрать поток контента для объединения с рекламой.

Запрос манифестов рекламных пакетов

Чтобы запросить рекламу из Менеджера рекламы, ваш сервер должен отправить POST-запрос к конечной точке модулей объявлений, передав запрошенные профили кодирования и тег объявления. Этот запрос также включает идентификатор потока, который вы собрали на шаге 1.

Взамен вы получаете список объектов рекламных модулей, содержащий файлы манифеста для рекламных модулей, запрошенных рекламным тегом издателя, а также информацию о том, когда и где они должны быть вставлены в ваш контент.

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
Параметры пути
network_code Сетевой код Менеджера рекламы 360 издателя.
stream_id Идентификатор потока из клиентского приложения видеоплеера.

Тело JSON

Параметры тела
encoding_profiles Required Список JSON-представлений профилей кодировки, которые вы хотите получать для каждой рекламной паузы. Подробности смотрите ниже

Чтобы сделать воспроизведение максимально плавным, оно должно соответствовать набору профилей кодирования, используемых в вашем потоке контента.

ad_tag Required Рекламный тег для запроса рекламы VMAP.
cuepoints Optional Список ключевых точек в потоке контента, куда будут вставлены рекламные паузы в середине ролика. Метки измеряются в секундах с плавающей запятой.

Требуется только для ответов VMAP, содержащих промежуточные ролики с использованием позиционных смещений времени. Это редкость.

content_duration_seconds Optional Продолжительность контента в секундах.

Требуется только для ответов VMAP, содержащих промежуточные ролики с процентными смещениями по времени. Это редкость.

manifest_type Optional Формат запрашиваемых рекламных потоков: hls или dash . Значение по умолчанию — hls .
dai_options Optional Дополнительные параметры, управляющие аспектами отображения манифестов. Подробности смотрите ниже
Профиль кодирования
profile_name Required Идентификатор этого профиля кодирования. Это значение может быть любой строкой по вашему выбору, но вы не можете иметь несколько профилей кодирования с одним и тем же именем в одном потоке.
type Required Тип кодирования потока, описываемого этим профилем кодирования. Типы контента: media , iframe , subtitles .
container_type Required Формат контейнера, используемый этим профилем кодирования. Форматы контейнеров: mpeg2ts , fmp4cmaf , hls_packed_audio
video_settings Optional Требуется, если тип профиля кодировки — iframe . В противном случае разрешено только в том случае, если тип мультимедиа содержит видео. Подробности смотрите ниже
audio_settings Optional Требуется, если профиль кодирования содержит аудио. Разрешено только в том случае, если тип медиа. Подробности смотрите ниже
subtitle_settings Optional Требуется, если профиль кодирования содержит субтитры. Подробности смотрите ниже
Настройки видео
codec Required Строка кодека RFC6381.

Пример: avc1.4d000c

bitrate Required Целое число, представляющее максимальный битрейт видео этого профиля в байтах в секунду.
frames_per_second Required Частота кадров видео с плавающей запятой.
resolution Required Значение в формате JSON, содержащее ширину и высоту видео в пикселях.

Пример: {"width": 640, "height": 320}

Настройки звука
codec Required Строка кодека RFC6381.

Пример: mp4a.40.5

bitrate Required Целое число, представляющее максимальный битрейт аудио этого профиля в байтах в секунду.

Пример: 300000

channels Required Целое число, представляющее количество аудиоканалов, включая низкочастотные каналы.
sample_rate Required Целое число, представляющее частоту дискретизации звука в герцах.

Пример: 4800

Настройки субтитров
format Required Формат файла, используемый внутриполосными субтитрами. Поддерживаемые значения: webvtt или ttml .
language Optional Язык субтитров в виде языковой строки RFC5646. Если это значение указано, оно используется только для рендеринга DASH.

Пример: en-us

Опции DAI
dash_profile Optional Профиль MPEG-DASH для применения к манифестам рекламных модулей. Этот параметр используется только для манифестов DASH. Допустимые значения — live или on-demand . Значение по умолчанию — on-demand .

Значение live соответствует профилю MPEG-DASH "urn:mpeg:dash:profile:isoff-live:2011" .

Значение on-demand соответствует профилю MPEG-DASH urn:mpeg:dash:profile:isoff-on-demand:2011 .

ad_pod_timeout Optional Максимальное время, затрачиваемое на выбор объявлений и создание рекламных модулей, в секундах с плавающей запятой. По истечении этого времени Менеджер рекламы возвращает все объявления, уже выбранные в ответе ad_pods , и прекращает обработку.
sam_id Optional Указывает альтернативный ключ отладки, который можно использовать для поиска сеансов в мониторе активности потока .

Ответ

Параметры ответа
valid_for Продолжительность действия этих плейлистов рекламных модулей в формате dhms (дни, часы, минуты, секунды).
valid_until Дата и время, до которых эти плейлисты модулей объявлений действительны в виде строки даты и времени ISO8601, в формате yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm .
ad_pods Список рекламных стручков, выбранных для этого потока.
Ad Pod
manifest_uris Только для потоков HLS. Карта идентификаторов профиля кодирования в HLS Manifest Uris.
mpd_uri Только для приборных потоков. URI of the Dash MPD.
type Тип AD POD. pre mid post
start Только для AD-стручков в среднем ролле. Положение в потоке, в которое должен быть вставлен этот AD POD, в плавающие температуры секунды.
duration Продолжительность этого AD POD в плавающей запятой секундах.
midroll_index Только для AD-стручков в среднем ролле. Индекс текущего AD-Pod в средней рулете. Индексация начинается с 1 .

Пример запроса (curl)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

Пример запроса тело

Это содержимое request-body.json упомянутое в вызове скручивания выше.

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

Пример ответа

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

Стичка рекламных аппаратов в контент

Процесс сшивания AD -стручков в потоки контента варьируется в зависимости от вашей реализации, формата потока и какие функции вы выбираете для реализации из спецификаций формата. Следующие рабочие процессы являются предложениями о том, как справиться с этим процессом. Точные детали вашей реализации могут варьироваться в зависимости от потребностей вашего бизнеса и потоков вашего контента.

HLS -потоки

Если вы сшиваете поток в формате HLS, ваш поток контента будет многовалентным списком воспроизведения ссылок для отдельных манифестов потока, по одному для каждого профиля кодирования. Ваши рекламные капсулы должны быть вставлены в каждый из этих вариантов манифестов. Один из способов сделать это - подготовить все варианты манифестов и передать их в сеть доставки контента (CDN) для хостинга. Последний многовариантный плейлист-это набор ссылок на эти манифесты с CDN.

Итерация над профилями кодирования

Для каждого профиля кодирования соберите все связанные AD POD, манифестные из ответа менеджера AD, а также их связанные времена начала. Для предварительных рекламных стручков установите время начала на 0 . Для Post-Rolls используйте продолжительность контента в качестве времени начала AD Pod. Определите поток вариантов в многоиварном плейлисте, который соответствует настройкам аудио и видео кодирования профиля.

Пример AD
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
Пример многовалентного плейлиста контента
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
Пример собранных данных варианта
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

Вставить рекламу в каждый вариант манифеста

Для каждого потока варианта проходите через сегменты контента манифеста, сохраняя общее время истекающего времени. Когда вы попадаете в начальную позицию AD POD, извлеките список сегментов из манифеста AD Pod, оберните список сегментов в два тега #EXT-X-DISCONTINUITY и вставьте список в текущем месте в Manifest Content Manifest . Продолжайте этот процесс до тех пор, пока не будут обработаны все AD -стручки и потоки вариантов.

Полученные манифесты должны соответствовать стандарту HLS. Следовательно, в зависимости от того, какие функции спецификации, проявляющих ваш контент. Новые сегменты рекламы во внимание. После того, как любые расхождения со стандартом были отремонтированы, подтолкните каждый конкретный пользовательский вариант, манифест на ваш CDN для хостинга.

Если ваш контент манифест зашифрован, вам необходимо сохранить последний ключ шифрования, найденный до начала текущего AD POD в теге #EXT-X-KEY . Затем вам нужно добавить Tag #EXT-X-KEY:METHOD=NONE чтобы удалить шифрование перед первым сегментом каждого AD Pod. Наконец, вы должны добавить копию хранимой тега #EXT-X-KEY перед первым сегментом контента после каждого AD POD, чтобы восстановить шифрование контента.

Пример собранных данных варианта
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
Пример контента проявляется

Это содержимое манифеста https://{...}/1080p.m3u8 указанного в данных собранных вариантов.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
Пример AD POD MANIFEST

Это содержимое https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 , указанное в собранных данных.

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
Пример сшитого варианта манифеста

Это будет полученный сшитый вариант манифеста, переданный в CDN и размещенную по https://cdn.{...}/{userid}/1080p.m3u8 .

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

Построить многовариантный плейлист

Соберите адреса CDN для каждого заполненного варианта манифеста, а также соответствующие детали профиля кодирования и собирайте результаты в новый многовариантный манифест. Этот специфичный для пользователя манифест возвращается как ответ на манифестный запрос, который вы получили на шаге 1.

Пример финального многовариантного плейлиста
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

Mpeg Dash Streams

Если вы сшиваете поток в формате Dash Mpeg, вам нужно только создать один файл. Это может облегчить прошивку рубных потоков, чем HLS.

Правильно подготовленное файл презентации MPEG Dash Media Description (MPD) должен состоять из нескольких периодов, каждый из которых содержит несколько представлений. Каждое представление должно соответствовать одному из ваших профилей кодирования. Каждый AD POD, возвращаемый из Ad Manager, также является файлом MPD, содержащим последовательность периодов с соответствующими представлениями.

Чтобы сшить эти файлы MPD вместе, начните с того, что обратите внимание на время начала для каждого AD POD. Для предварительного ролля вставьте периоды Peroll AD Pod до любого периода контента. Для пост-роллов вставьте периоды Postroll AD Pod после всех периодов содержания. Итерация в течение периодов в контенте MPD, отслеживая истекшее время игрового времени для всех обработанных периодов контента. Когда вы достигаете границы между периодами, которые соответствуют временю начала AD POD, вставьте периоды из соответствующего файла MPD в средней рулоне AD на этой границе.

Окончательный сшитый файл MPD должен полностью соответствовать спецификациям MPEG_DASH, поэтому вам может потребоваться итерация по окончательному файлу еще раз, исправляя время начала периода, исправляя продолжительность презентации носителя для учета вновь вставленных рекламных периодов и разрешения любых других Конфликты, которые могли возникнуть в результате процесса сшивания.

Пример контента MPD

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Пример Ad Pod json

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

Пример AD POD MPD

Это содержание mpd_uri из AD Pod JSON выше.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

Пример сшита MPD

Служите это в качестве ответа на первоначальный запрос Manifest Stream.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Дополнительные ресурсы

,

API POD API обеспечивает доступ к видео AD-AD-AD-стручкам, подготовленным таким образом, что их можно сшить непосредственно в пользовательский HLS или MPEG-Dash Media Playlist.

Это руководство сосредоточено на реализации базового сервера манипуляций с манипуляцией, обслуживающего базовый POD для потоков VOD.

Получить запросы на манифест потока

Ваш манипулятор Manifest должен предоставить конечную точку API для прослушивания манифестных запросов в приложении клиента видеоплеера. Как минимум, эта конечная точка должна собирать идентификатор потока из приложения клиентского игрока. Этот идентификатор потока используется для идентификации сеанса потоковой передачи для Ad Manager в ваших запросах AD POD.

Вам также необходимо собрать некоторую другую информацию для определения соответствующего потока контента, например, идентификатора контента.

Пример манифестной конечной точки запроса

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
Параметры пути
stream_id Ad Manager Stream ID из приложения клиентского видеоплета.
content_id Гипотетический идентификатор, соответствующий видео контента в вашей системе.
format Гипотетический параметр, соответствующий формату потока. Один из любого:
mpd Для потоков Mpeg-Dash
m3u8 Для потоков HLS

Получить поток контента

Используйте идентификатор контента, собранную из Manifest -запроса, чтобы выбрать поток контента для строительства с помощью рекламы.

Запросить AD POD Manifests

Чтобы запросить рекламу у диспетчера объявлений, ваш сервер должен сделать запрос на сообщение в конечной точке AD PODS, передавая запрошенные профили кодирования и тег AD. Этот запрос также включает в себя идентификатор потока, который вы собрали на шаге 1.

В свою очередь, вы получаете список объектов AD POD, содержащих манифестные файлы для AD POD, запрашиваемых тегом AD издателя и информацией о том, когда и где они должны быть вставлены в ваш контент.

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
Параметры пути
network_code Сетевой код рекламного менеджера издателя 360.
stream_id Идентификатор потока из приложения клиентского видео проигрывателя.

Json Body

Параметры тела
encoding_profiles Required Список представлений JSON профилей кодирования, которые вы хотите получить для каждого рекламного перерыва. Смотрите подробности ниже

Чтобы сделать воспроизведение как можно более плавным, это должно соответствовать набору профилей кодирования, используемых в вашем потоке контента.

ad_tag Required AD TAG для запроса VMAP рекламы.
cuepoints Optional Список точек сигнала в потоке контента, где будут вставлены разрывы AD Midroll. Точки сигнала измеряются в плавающих темпах секунд.

Требуется только для ответов VMAP, которые содержат средние рулеты, используя позиционные временные смещения. Это необычно.

content_duration_seconds Optional Продолжительность содержания за считанные секунды.

Требуется только для ответов VMAP, которые содержат средние рулеты с использованием процентных смещений. Это необычно.

manifest_type Optional Формат запрошенных потоков рекламы, либо hls , либо dash . Значение по умолчанию - hls .
dai_options Optional Дополнительные варианты контролируют аспекты того, как отображаются манифесты. Смотрите подробности ниже
Профиль кодирования
profile_name Required Идентификатор этого профиля кодирования. Это значение может быть любой строкой, которую вы выберете, но вы не можете иметь несколько профилей кодирования с тем же именем в одном и том же потоке.
type Required Тип кодирования потока, описанный этим профилем кодирования. Типы контента: media , iframe , subtitles .
container_type Required Формат контейнера, используемый этим профилем кодирования. Форматы контейнеров: mpeg2ts , fmp4cmaf , hls_packed_audio
video_settings Optional Требуется, если тип профиля кодирования является iframe . В противном случае разрешено, только если тип медиа содержит видео. Смотрите подробности ниже
audio_settings Optional Требуется, если профиль кодирования содержит аудио. Разрешено только в том случае, если тип является носителем. Смотрите подробности ниже
subtitle_settings Optional Требуется, если профиль кодирования содержит субтитры. Смотрите подробности ниже
Настройки видео
codec Required RFC6388 -Codec String.

Пример: avc1.4d000c

bitrate Required Целое число, представляющее максимальную битрейт этого профиля в байтах в секунду.
frames_per_second Required Плавающая точка FPS видео.
resolution Required Кодируемое JSON значение, содержащее видео `width` и` height 'в пикселях.

Пример: {"width": 640, "height": 320}

Настройки звука
codec Required RFC6388 -Codec String.

Пример: mp4a.40.5

bitrate Required Целое число, представляющее максимальную аудио битрейт этого профиля в байтах в секунду.

Пример: 300000

channels Required Целое число, представляющее количество аудиоканалов, включая низкочастотные каналы.
sample_rate Required Целое число, представляющее скорость отбора проб звука в Герце.

Пример: 4800

Настройки субтитров
format Required Формат файла, используемый внутриполосными субтитрами. Поддерживаемые значения - webvtt или ttml .
language Optional Язык субтитров как языковой строки RFC5646. Если предоставлено, это значение используется только для рендеринга DASH.

Пример: en-us

Варианты DAI
dash_profile Optional Профиль MPEG-Dash для применения к AD POD Manifests. Эта настройка используется только для манифестов DASH. Разрешенные значения являются live или on-demand . Значение по умолчанию on-demand .

Value live соответствует профилю MPEG-DASH "urn:mpeg:dash:profile:isoff-live:2011" .

Значение on-demand соответствует урне профиля MPEG- urn:mpeg:dash:profile:isoff-on-demand:2011 .

ad_pod_timeout Optional Максимальное время для выбора рекламы и строительства рекламных аппаратов, в плавающих запятой. После этого времени прошло, AD Manager возвращает любые объявления, уже выбранные в ответе ad_pods , и прекращает обработку.
sam_id Optional Определяет альтернативный ключ отладки, который можно использовать для поиска сеансов в мониторе активности потока .

Ответ

Параметры ответа
valid_for Продолжительность, для которой эти плейлисты AD Pod действительны в формате dhms (дни, часы, минуты, секунды).
valid_until The date and time until which these ad pod playlists are valid as an ISO8601 datetime string, in yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm format.
ad_pods Список рекламных стручков, выбранных для этого потока.
Ad Pod
manifest_uris Только для потоков HLS. Карта идентификаторов профиля кодирования в HLS Manifest Uris.
mpd_uri Только для приборных потоков. URI of the Dash MPD.
type Тип AD POD. pre mid post
start Только для AD-стручков в среднем ролле. Положение в потоке, в которое должен быть вставлен этот AD POD, в плавающие температуры секунды.
duration Продолжительность этого AD POD в плавающей запятой секундах.
midroll_index Только для AD-стручков в среднем ролле. Индекс текущего AD-Pod в средней рулете. Индексация начинается с 1 .

Пример запроса (curl)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

Пример запроса тело

Это содержимое request-body.json упомянутое в вызове скручивания выше.

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

Пример ответа

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

Стичка рекламных аппаратов в контент

Процесс сшивания AD -стручков в потоки контента варьируется в зависимости от вашей реализации, формата потока и какие функции вы выбираете для реализации из спецификаций формата. Следующие рабочие процессы являются предложениями о том, как справиться с этим процессом. Точные детали вашей реализации могут варьироваться в зависимости от потребностей вашего бизнеса и потоков вашего контента.

HLS -потоки

Если вы сшиваете поток в формате HLS, ваш поток контента будет многовалентным списком воспроизведения ссылок для отдельных манифестов потока, по одному для каждого профиля кодирования. Ваши рекламные капсулы должны быть вставлены в каждый из этих вариантов манифестов. Один из способов сделать это - подготовить все варианты манифестов и передать их в сеть доставки контента (CDN) для хостинга. Последний многовариантный плейлист-это набор ссылок на эти манифесты с CDN.

Итерация над профилями кодирования

Для каждого профиля кодирования соберите все связанные AD POD, манифестные из ответа менеджера AD, а также их связанные времена начала. Для предварительных рекламных стручков установите время начала на 0 . Для Post-Rolls используйте продолжительность контента в качестве времени начала AD Pod. Определите поток вариантов в многоиварном плейлисте, который соответствует настройкам аудио и видео кодирования профиля.

Пример AD
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
Пример многовалентного плейлиста контента
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
Пример собранных данных варианта
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

Вставить рекламу в каждый вариант манифеста

Для каждого потока варианта проходите через сегменты контента манифеста, сохраняя общее время истекающего времени. Когда вы попадаете в начальную позицию AD POD, извлеките список сегментов из манифеста AD Pod, оберните список сегментов в два тега #EXT-X-DISCONTINUITY и вставьте список в текущем месте в Manifest Content Manifest . Продолжайте этот процесс до тех пор, пока не будут обработаны все AD -стручки и потоки вариантов.

Полученные манифесты должны соответствовать стандарту HLS. Следовательно, в зависимости от того, какие функции спецификации, проявляющих ваш контент. Новые сегменты рекламы во внимание. После того, как любые расхождения со стандартом были отремонтированы, подтолкните каждый конкретный пользовательский вариант, манифест на ваш CDN для хостинга.

Если ваш контент манифест зашифрован, вам необходимо сохранить последний ключ шифрования, найденный до начала текущего AD POD в теге #EXT-X-KEY . Затем вам нужно добавить Tag #EXT-X-KEY:METHOD=NONE чтобы удалить шифрование перед первым сегментом каждого AD Pod. Наконец, вы должны добавить копию хранимой тега #EXT-X-KEY перед первым сегментом контента после каждого AD POD, чтобы восстановить шифрование контента.

Пример собранных данных варианта
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
Пример контента проявляется

Это содержимое манифеста https://{...}/1080p.m3u8 указанного в данных собранных вариантов.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
Пример AD POD MANIFEST

Это содержимое https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 , указанное в собранных данных.

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
Пример сшитого варианта манифеста

Это будет полученный сшитый вариант манифеста, переданный в CDN и размещенную по https://cdn.{...}/{userid}/1080p.m3u8 .

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

Построить многовариантный плейлист

Соберите адреса CDN для каждого заполненного варианта манифеста, а также соответствующие детали профиля кодирования и собирайте результаты в новый многовариантный манифест. Этот специфичный для пользователя манифест возвращается как ответ на манифестный запрос, который вы получили на шаге 1.

Пример финального многовариантного плейлиста
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

Mpeg Dash Streams

Если вы сшиваете поток в формате Dash Mpeg, вам нужно только создать один файл. Это может облегчить прошивку рубных потоков, чем HLS.

Правильно подготовленное файл презентации MPEG Dash Media Description (MPD) должен состоять из нескольких периодов, каждый из которых содержит несколько представлений. Каждое представление должно соответствовать одному из ваших профилей кодирования. Каждый AD POD, возвращаемый из Ad Manager, также является файлом MPD, содержащим последовательность периодов с соответствующими представлениями.

Чтобы сшить эти файлы MPD вместе, начните с того, что обратите внимание на время начала для каждого AD POD. Для предварительного ролля вставьте периоды Peroll AD Pod до любого периода контента. Для пост-роллов вставьте периоды Postroll AD Pod после всех периодов содержания. Итерация в течение периодов в контенте MPD, отслеживая истекшее время игрового времени для всех обработанных периодов контента. Когда вы достигаете границы между периодами, которые соответствуют временю начала AD POD, вставьте периоды из соответствующего файла MPD в средней рулоне AD на этой границе.

Окончательный сшитый файл MPD должен полностью соответствовать спецификациям MPEG_DASH, поэтому вам может потребоваться итерация по окончательному файлу еще раз, исправляя время начала периода, исправляя продолжительность презентации носителя для учета вновь вставленных рекламных периодов и разрешения любых других Конфликты, которые могли возникнуть в результате процесса сшивания.

Пример контента MPD

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Пример Ad Pod json

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

Пример AD POD MPD

Это содержание mpd_uri из AD Pod JSON выше.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

Пример сшита MPD

Служите это в качестве ответа на первоначальный запрос Manifest Stream.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Дополнительные ресурсы