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 | Гипотетический параметр, соответствующий формату потока. Один из следующих вариантов:
|
Получить поток контента
Используйте идентификатор контента, полученный из запроса манифеста, чтобы выбрать поток контента для объединения с рекламой.
Запрос манифестов рекламных пакетов
Чтобы запросить рекламу из Менеджера рекламы, ваш сервер должен отправить 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. Пример: |
bitrate | Required | Целое число, представляющее максимальный битрейт видео этого профиля в байтах в секунду. |
frames_per_second | Required | Частота кадров видео с плавающей запятой. |
resolution | Required | Значение в формате JSON, содержащее ширину и высоту видео в пикселях. Пример: |
Настройки звука | ||
codec | Required | Строка кодека RFC6381. Пример: |
bitrate | Required | Целое число, представляющее максимальный битрейт аудио этого профиля в байтах в секунду. Пример: |
channels | Required | Целое число, представляющее количество аудиоканалов, включая низкочастотные каналы. |
sample_rate | Required | Целое число, представляющее частоту дискретизации звука в герцах. Пример: |
Настройки субтитров | ||
format | Required | Формат файла, используемый внутриполосными субтитрами. Поддерживаемые значения: webvtt или ttml . |
language | Optional | Язык субтитров в виде языковой строки RFC5646. Если это значение указано, оно используется только для рендеринга DASH. Пример: |
Опции DAI | ||
dash_profile | Optional | Профиль MPEG-DASH для применения к манифестам рекламных модулей. Этот параметр используется только для манифестов DASH. Допустимые значения — live или on-demand . Значение по умолчанию — on-demand . Значение Значение |
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>
Дополнительные ресурсы
- Модуль для воспроизведения с помощью IMA SDK:
- Модуль для воспроизведения с помощью DAI API
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 | Гипотетический параметр, соответствующий формату потока. Один из следующих вариантов:
|
Получить поток контента
Используйте идентификатор контента, полученный из запроса манифеста, чтобы выбрать поток контента для объединения с рекламой.
Запрос манифестов рекламных пакетов
Чтобы запросить рекламу из Менеджера рекламы, ваш сервер должен отправить 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. Пример: |
bitrate | Required | Целое число, представляющее максимальный битрейт видео этого профиля в байтах в секунду. |
frames_per_second | Required | Частота кадров видео с плавающей запятой. |
resolution | Required | Значение в формате JSON, содержащее ширину и высоту видео в пикселях. Пример: |
Настройки звука | ||
codec | Required | Строка кодека RFC6381. Пример: |
bitrate | Required | Целое число, представляющее максимальный битрейт аудио этого профиля в байтах в секунду. Пример: |
channels | Required | Целое число, представляющее количество аудиоканалов, включая низкочастотные каналы. |
sample_rate | Required | Целое число, представляющее частоту дискретизации звука в герцах. Пример: |
Настройки субтитров | ||
format | Required | Формат файла, используемый внутриполосными субтитрами. Поддерживаемые значения: webvtt или ttml . |
language | Optional | Язык субтитров в виде языковой строки RFC5646. Если это значение указано, оно используется только для рендеринга DASH. Пример: |
Опции DAI | ||
dash_profile | Optional | Профиль MPEG-DASH для применения к манифестам рекламных модулей. Этот параметр используется только для манифестов DASH. Допустимые значения — live или on-demand . Значение по умолчанию — on-demand . Значение Значение |
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>
Дополнительные ресурсы
- Модуль для воспроизведения с помощью IMA SDK:
- Модуль для воспроизведения с помощью DAI API
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 | Гипотетический параметр, соответствующий формату потока. Один из следующих вариантов:
|
Получить поток контента
Используйте идентификатор контента, полученный из запроса манифеста, чтобы выбрать поток контента для объединения с рекламой.
Запрос манифестов рекламных пакетов
Чтобы запросить рекламу из Менеджера рекламы, ваш сервер должен отправить 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. Пример: |
bitrate | Required | Целое число, представляющее максимальный битрейт видео этого профиля в байтах в секунду. |
frames_per_second | Required | Частота кадров видео с плавающей запятой. |
resolution | Required | Значение в формате JSON, содержащее ширину и высоту видео в пикселях. Пример: |
Настройки звука | ||
codec | Required | Строка кодека RFC6381. Пример: |
bitrate | Required | Целое число, представляющее максимальный битрейт аудио этого профиля в байтах в секунду. Пример: |
channels | Required | Целое число, представляющее количество аудиоканалов, включая низкочастотные каналы. |
sample_rate | Required | Целое число, представляющее частоту дискретизации звука в герцах. Пример: |
Настройки субтитров | ||
format | Required | Формат файла, используемый внутриполосными субтитрами. Поддерживаемые значения: webvtt или ttml . |
language | Optional | Язык субтитров в виде языковой строки RFC5646. Если это значение указано, оно используется только для рендеринга DASH. Пример: |
Опции DAI | ||
dash_profile | Optional | Профиль MPEG-DASH для применения к манифестам рекламных модулей. Этот параметр используется только для манифестов DASH. Допустимые значения — live или on-demand . Значение по умолчанию — on-demand . Значение Значение |
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>
Дополнительные ресурсы
- POD Подает воспроизведение с IMA SDK:
- POD, подающий воспроизведение с DAI API
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 | Гипотетический параметр, соответствующий формату потока. Один из любого:
|
Получить поток контента
Используйте идентификатор контента, собранную из 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. Пример: |
bitrate | Required | Целое число, представляющее максимальную битрейт этого профиля в байтах в секунду. |
frames_per_second | Required | Плавающая точка FPS видео. |
resolution | Required | Кодируемое JSON значение, содержащее видео `width` и` height 'в пикселях. Пример: |
Настройки звука | ||
codec | Required | RFC6388 -Codec String. Пример: |
bitrate | Required | Целое число, представляющее максимальную аудио битрейт этого профиля в байтах в секунду. Пример: |
channels | Required | Целое число, представляющее количество аудиоканалов, включая низкочастотные каналы. |
sample_rate | Required | Целое число, представляющее скорость отбора проб звука в Герце. Пример: |
Настройки субтитров | ||
format | Required | Формат файла, используемый внутриполосными субтитрами. Поддерживаемые значения - webvtt или ttml . |
language | Optional | Язык субтитров как языковой строки RFC5646. Если предоставлено, это значение используется только для рендеринга DASH. Пример: |
Варианты DAI | ||
dash_profile | Optional | Профиль MPEG-Dash для применения к AD POD Manifests. Эта настройка используется только для манифестов DASH. Разрешенные значения являются live или on-demand . Значение по умолчанию on-demand . Value Значение |
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>
Дополнительные ресурсы
- POD Подает воспроизведение с IMA SDK:
- POD, подающий воспроизведение с DAI API