Вставляйте объявления с метаданными времени показа рекламы

В этом руководстве описывается, как вставлять рекламные паузы с помощью метода метаданных синхронизации рекламных модулей (ATM) для получения точного времени и продолжительности рекламных пауз, включая рекламу в начале ролика.

Для вставки рекламы в начале ролика и управления возвратом к контенту после рекламных пауз в середине ролика мы рекомендуем вызывать следующие API:

При необходимости для событий прямой трансляции с большим количеством одновременных показов мы рекомендуем вызвать API раннего уведомления о рекламной паузе (EABN), чтобы запланировать решения о рекламе до начала рекламной паузы.

Предпосылки

Для начала вам необходимо настроить событие прямой трансляции для типа перенаправления «Динамическая вставка рекламы (DAI)». Выберите один из следующих способов:

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

Когда пользователь выбирает событие прямой трансляции, клиентское приложение отправляет запрос на трансляцию в Google Ad Manager. В ответе на трансляцию приложение извлекает идентификатор сеанса Google DAI и метаданные для включения в запрос манифеста трансляции.

В следующем примере идентификатор сеанса Google DAI передается манипулятору манифеста:

https://MANIFEST_MANIPULATOR_URL/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY

При обработке запроса на воспроизведение видеоконтента сохраняйте идентификатор сеанса Google DAI и CUSTOM_ASSET_KEY из запроса для подготовки к сшивке рекламы.

Извлечь метаданные времени показа рекламы

Чтобы получить время показа рекламного модуля, выполните следующие действия:

  1. Сгенерируйте токен HMAC.
  2. Вызовите API банкомата с токеном HMAC.

Сгенерировать подписанный токен HMAC

Для аутентификации ваших запросов выполните следующие действия:

  1. Создайте строку токена, объединив следующие параметры в алфавитном порядке, разделив их тильдой ~ :

    Параметр Обязательно или необязательно Описание
    ad_break_id Необходимый Строка, которую вы указываете для обозначения рекламной паузы, например ad-break-1 . Для рекламы в начале ролика используйте preroll .
    custom_asset_key Необходимый Пользовательский ключ актива события прямой трансляции.
    cust_params Необязательный Параметры таргетинга. Подробнее см. в разделе «Установка параметров таргетинга для вашего потока» .
    exp Необходимый Время истечения срока действия токена, измеряемое как общее количество секунд, прошедших с эпохи Unix.
    network_code Необходимый Ваш сетевой код Google Ad Manager. Подробнее см. в разделе «Поиск информации об аккаунте Ad Manager» .
    pd Необходимый Длительность рекламной паузы в миллисекундах. Для рекламы в начале ролика Google DAI переопределяет этот параметр настройками события прямой трансляции.
    scte35 Необязательный Сигнал SCTE-35, закодированный в Base64. Убедитесь, что сигнал верный. Если он неверный, в HTTP-заголовок X-Ad-Manager-Dai-Warning в ответе отправляется сообщение, и сигнал продолжает распространяться для создания рекламной паузы. Подробнее о поддерживаемых маркерах рекламной паузы см. в разделе «Интеграция HLS» .
  2. Загрузите ключ аутентификации Google DAI типа HMAC . Подробнее см. в разделе Аутентификация запросов на видеопоток DAI .

  3. Используйте загруженный ключ HMAC для генерации подписи SHA256 строки токена.

  4. Объедините строку токена и сгенерированную подпись.

  5. Примените URL-кодирование к объединённой строке. Закодированная строка представляет собой подписанный токен HMAC для аутентификации запросов API к метаданным синхронизации (ATM) рекламного модуля.

В следующем примере создается подписанный токен HMAC для рекламы в начале ролика:

custom_asset_key="CUSTOM_ASSET_KEY"
exp="1750700000" # Expired on Mon Jun 23 2025 13:33:20 GMT-0400 (Eastern Daylight Time)
network_code="NETWORK_CODE"
ad_break_id="preroll"
pd="0" # Pod duration value is overridden by the livestream event settings.

# The HMAC authentication key associated with your livestream event in Google Ad Manager.
secret_key="24E96382584C328087546B0E8454F26158564E8466FD2BE3D8A996B38445876C"

# Concatenate the parameters, keep the parameters alphabetically ordered by name.
token_string="ad_break_id=${ad_break_id}~custom_asset_key=${custom_asset_key}~exp=${exp}~network_code=${network_code}~pd=${pd}"

# Calculate the SHA256 signature of the token_string.
hmac_signature=$(echo -n "$token_string" | openssl dgst -sha256 -hmac "$secret_key" | awk '{print $2}')

# Concatenate the token string and the signature.
signed_token="${token_string}~hmac=${hmac_signature}"

url_encode() {
    local string="${1}"
    local strlen=${#string}
    local encoded=""
    local pos c
    for (( pos=0 ; pos<strlen ; pos++ )); do
        c=${string:$pos:1}
        case "$c" in
            [-_.~a-zA-Z0-9] ) o="${c}" ;;
            *   ) printf -v o '%%%02x' "'$c"
        esac
        encoded+="${o}"
    done
    echo "${encoded}"
}

# Apply URL encoding to the concatenated string.
url_encoded_signed_token=$(url_encode "$signed_token")

echo "Signed HMAC token:"
echo "${url_encoded_signed_token}"

# Example output:
# ad_break_id%3Dpreroll~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D21775744923~pd%3D180000~pod_id%3D5~hmac%3D24E96382584C328087546B0E8454F26158564E8466FD2BE3D8A996B38445876C

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

Проверьте настройки предварительной трансляции для вашего мероприятия в прямом эфире, используя следующие параметры:

Чтобы получить результаты решения о показе рекламы в пре-ролле, отправьте запрос к API ATM.

В следующем примере выполняется запрос ATM на рекламу в начале ролика:

curl "https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/pod.json?stream_id=SESSION_ID&ad_break_id=preroll&auth-token=your_signed_HMAC_token"

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

Чтобы получить метаданные рекламного модуля для середины ролика, выполните следующие действия:

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

В следующем примере выполняется запрос ATM на рекламу в середине ролика:

curl "https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/pod.json?stream_id=SESSION_ID&ad_break_id=AD_BREAK_ID&pd=AD_BREAK_DURATION&auth-token=your_signed_HMAC_token"

В случае успеха вы увидите вывод, похожий на следующий объект JSON:

{
  "status": "final",
  "ads": [
    {
      "duration_ms": 5046,
      "variants": {
        "devrel1428000": {
          "segment_extension": "ts",
          "segment_durations": {
            "timescale": 1000,
            "values": [
              5045
            ]
          }
        },
        "devrel1928000": {
          "segment_extension": "ts",
          "segment_durations": {
            "timescale": 1000,
            "values": [
              5045
            ]
          }
        }
      }
    }
  ],
  "slate": {
    "duration_ms": 0,
    "variants": {
      "devrel1428000": {
        "segment_extension": "ts",
        "segment_durations": {
          "timescale": 1000,
          "values": [
            5005,
            ...
            5046
          ]
        }
      },
      "devrel1928000": {
        "segment_extension": "ts",
        "segment_durations": {
          "timescale": 1000,
          "values": [
            5005,
            ...
            5046
          ]
        }
      }
    }
  }
}

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

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

Определите сегменты рекламных пауз и вставьте разрывы

При обработке каждого варианта манифеста определите теги EXT-X-CUE-IN и EXT-X-CUE-OUT в вашем потоке, указывающие начало и конец рекламной паузы.

Замените теги EXT-X-CUE-IN и EXT-X-CUE-OUT на элементы EXT-X-DISCONTINUITY чтобы клиентский видеоплеер мог переключаться между контентом и рекламой.

Следующий пример манифеста заменяет теги EXT-X-CUE-IN и EXT-X-CUE-OUT :

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.000,
contentorigin.com/3.ts
#EXTINF:5.000,
contentorigin.com/4.ts
#EXTINF:5.000,
contentorigin.com/5.ts
#EXT-X-CUE-IN
#EXTINF:5.000,
contentorigin.com/6.ts
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4

В следующем примере показан замененный манифест:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXTINF:5.000,
#EXT-X-DISCONTINUITY
{... Insert ad segments here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/6.mp4
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4

Рекламные сегменты Google DAI не зашифрованы. Если ваш контент зашифрован, снимите шифрование, вставив элемент EXT-X-KEY:METHOD=NONE перед первым рекламным сегментом каждой рекламной паузы. В конце рекламной паузы снова включите шифрование, вставив соответствующий элемент EXT-X-KEY .

Отслеживайте время начала, продолжительность и индекс предстоящей рекламной паузы.

Создание URL-адресов сегментов объявлений

Замените сегменты контента между тегами EXT-X-DISCONTINUITY URL-адресами каждого рекламного сегмента. Чтобы определить количество добавляемых рекламных сегментов, используйте значения ads.segment_durations.values , предоставленные в JSON-ответе API ATM.

Чтобы завершить рекламный блок раньше времени при обнаружении тега EXT-X-CUE-IN , добавьте параметр d= к URL-адресу последнего рекламного сегмента. Этот параметр сокращает сегмент, чтобы не влиять на временную шкалу клиентского видеоплеера.

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

https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/preroll/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID

В следующем примере URL-адрес сегмента рекламы в середине ролика добавляется в манифест:

https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID

В следующем примере сегменты рекламы вставляются в манифест:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.00,
contentorigin.com/1.ts
#EXTINF:5.00,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/1.ts?stream_id=SESSION_ID
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/2.ts?stream_id=SESSION_ID
#EXT-X-DISCONTINUITY
#EXTINF:5.00,
contentorigin.com/6.mp4
#EXTINF:5.00,
contentorigin.com/7.mp4
#EXTINF:5.00,
contentorigin.com/8.mp4

Построить сегменты сланца

Чтобы заполнить пробел между рекламой и контентом, вставьте сегменты рекламной паузы. Используйте массив slates.segment_durations.values ​​из JSON-ответа API ATM для определения длительности каждого сегмента рекламной паузы. Повторяйте последовательность длительностей сегментов по мере необходимости, чтобы заполнить всю рекламную паузу.

В следующем примере собирается сегмент сланца:

https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/slate/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID

В примере slate/0 представляет собой номер итерации слейта. Проверьте совместимость и возможности кэширования вашего клиентского видеоплеера, чтобы определить, следует ли начинать с 0 и увеличивать это число для каждого цикла слейта или оставить его равным 0 для всех итераций.

Управлять возвратом к контенту

После вставки всех сегментов из рекламного блока выберите один из следующих методов для возврата к потоку контента:

Метод Описание Воздействие на клиентский видеоплеер
Заполнить сегментами сланца Вставляет сегменты слэйва и зацикливает слэйв. Заполняет длительность и вставляет элементы EXT-X-DISCONTINUITY между каждой итерацией слэйва. Никаких эффектов.
Видеоплеер возвращается к контенту без изменения временной шкалы.
Повторное выравнивание с одним сегментом сланца Вставляет один сегмент плейса. Использует параметр d= для заполнения длительности до начала контента. Никаких эффектов.
Видеоплеер возвращается к контенту без изменения временной шкалы.
Немедленный возврат Вставьте сегменты контента. Изменена временная шкала видеоплеера.
Ваш клиентский видеоплеер должен поддерживать измененную временную шкалу.

Необязательно: запланируйте рекламную паузу

Чтобы повысить заполняемость, отправьте уведомление о ранней рекламной паузе (EABN) с указанием продолжительности рекламного блока, индивидуальных параметров таргетинга и данных сигнала SCTE-35. Подробнее см. в разделе «Отправка уведомлений о ранней рекламной паузе» .