Начало работы с IMA DAI SDK

Выберите решение DAI, которое вас интересует

Модуль, обслуживающий DAI

IMA SDK упрощают интеграцию мультимедийной рекламы на ваши веб-сайты и приложения.

IMA SDK могут запрашивать рекламу с любого рекламного сервера , совместимого с VAST, и управлять воспроизведением рекламы в ваших приложениях.

С помощью SDK IMA DAI приложения отправляют потоковые запросы на рекламу и видеоконтент для VOD или живого контента. Затем SDK возвращает объединенный видеопоток, так что вам не придется управлять переключением между рекламой и видеоконтентом в вашем приложении.

В этом руководстве показано, как воспроизвести поток обслуживания модулей DAI с помощью IMA DAI SDK для CAF.

Прежде чем использовать это руководство, ознакомьтесь с протоколом веб-приемника Chromecast Application Framework . В этом руководстве предполагается базовое понимание концепций приемников CAF, таких как перехватчики сообщений и объекты mediaInformation , а также знакомство с использованием инструмента Cast Command and Control для эмуляции отправителя CAF.

Чтобы использовать обслуживание пакетов IMA DAI, вы должны работать с партнером по обслуживанию пакетов и иметь учетную запись Менеджера рекламы 360 Advanced . Если у вас есть учетная запись Менеджера рекламы, обратитесь к менеджеру своего аккаунта за более подробной информацией. Информацию о регистрации в Менеджере рекламы можно найти в Справочном центре Менеджера рекламы .

Информацию об интеграции с другими платформами или использовании клиентских SDK IMA см. в разделе SDK интерактивной медиарекламы .

Обзор обслуживания модулей IMA DAI

Реализация обслуживания модулей с помощью IMA CAF DAI SDK включает два основных компонента, которые продемонстрированы в этом руководстве:

  • StreamRequest : объект, определяющий запрос потока к рекламным серверам Google. В запросах указывается сетевой код, пользовательский ключ актива и дополнительный ключ API, а также другие необязательные параметры.
  • StreamManager : объект, который обрабатывает связь между видеопотоком и IMA DAI SDK, например отправляет запросы отслеживания и пересылает события потока издателю.

Предварительные условия

  • Учетная запись Cast Developer Console с зарегистрированными тестовыми устройствами.
  • Размещенное веб-приложение-приемник , зарегистрированное в вашей консоли разработчика Cast и которое можно изменить для размещения кода, представленного в этом руководстве.
  • Приложение-отправитель, настроенное на использование вашего веб-приложения-приемника. В этом примере в качестве отправителя используйте инструмент Cast Command and Control .

Настройте объекты MediaInfo отправителя.

Сначала настройте объект MediaInfo вашего приложения-отправителя, включив в него следующие поля:

Поле Содержание
contentId Уникальный идентификатор этого медиа-элемента.

CONTENT_ID

contentUrl Необязательный. URL резервного потока для воспроизведения, если поток DAI не загружается.

BACKUP_STREAM_URL

contentType Необязательный. Mimetype потоков резервного копирования контента. Требуется только для потоков DASH .

CONTENT_STREAM_MIMETYPE

streamType Строковый литерал или константа, используемые для этого значения, зависят от платформы отправителя.
customData Поле customData содержит хранилище дополнительных обязательных полей «ключ-значение». В этом примере он содержит параметры потока DAI. В рабочем приложении вы можете вместо этого передать идентификатор, который ваше приложение-приемник трансляции будет использовать для получения этих параметров с помощью запроса на стороне сервера.
Поле Содержание
daiStreamType Тип вашего потока DAI. один из "LIVE" или "VOD"

DAI_STREAM_TYPE

networkCode Сетевой код вашего аккаунта Google Ad Manager 360.

NETWORK_CODE

customAssetKey Это поле необходимо только для прямых трансляций. Пользовательский ключ ресурса, который идентифицирует событие показа вашего модуля в Google Ad Manager 360.

CUSTOM_ASSET_KEY

apiKey Дополнительный ключ API для получения идентификатора потока из IMA DAI SDK.

API_KEY

Вот несколько примеров кода, которые помогут вам начать работу:

Интернет

Чтобы настроить эти значения в веб-отправителе Cast, сначала создайте объект MediaInfo с необходимыми данными, а затем отправьте запрос на загрузку веб-приемнику.

// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "CONTENT_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
  daiStreamType: "DAI_STREAM_TYPE",
  networkCode: "NETWORK-CODE",
  customAssetKey: "CUSTOM_ASSET_KEY",
  apiKey: "API_KEY"
};

// Make load request to cast web receiver
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
const request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
  () => { console.log('Load succeed'); },
  (errorCode) => { console.log('Error code: ' + errorCode); });

Андроид

Чтобы настроить эти значения в веб-отправителе Cast, сначала создайте объект MediaInfo с необходимыми данными, а затем отправьте запрос на загрузку веб-приемнику.

JSONObject customData = new JSONObject()?
  .put("daiStreamType", "DAI_STREAM_TYPE")
  .put("networkCode", "NETWORK-CODE")
  .put("customAssetKey", "CUSTOM_ASSET_KEY")
  .put("apiKey", "API_KEY");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
  .setContentUrl("BACKUP_STREAM_URL")
  .setContentType("CONTENT_STREAM_MIMETYPE")
  .setStreamType(MediaInfo.STREAM_TYPE_LIVE)
  .setCustomData(customData)
  .build();

RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
remoteMediaClient.load(new MediaLoadRequestData.Builder().setMediaInfo(mediaInfo).build());

iOS (Объект C)

Чтобы настроить эти значения в веб-отправителе Cast, сначала создайте объект GCKMediaInformation с необходимыми данными, а затем отправьте запрос на загрузку веб-получателю.

NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
  @"daiStreamType": @"DAI_STREAM_TYPE",
  @"networkCode": @"NETWORK-CODE",
  @"customAssetKey": @"CUSTOM_ASSET_KEY",
  @"apiKey": @"API_KEY"};
mediaInfoBuilder.customData = customData;

GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE";
mediaInfoBuilder.streamType = GCKMediaStreamTypeLive;
mediaInfoBuilder.customData = customData;
self.mediaInformation = [mediaInfoBuilder build];

GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
  request.delegate = self;
}

iOS (Свифт)

Чтобы настроить эти значения в веб-отправителе Cast, сначала создайте объект GCKMediaInformation с необходимыми данными, а затем отправьте запрос на загрузку веб-получателю.

let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
  print("invalid mediaURL")
  return
}

let customData = [
  "daiStreamType": "DAI_STREAM_TYPE",
  "networkCode": "NETWORK-CODE",
  "customAssetKey": "CUSTOM_ASSET_KEY",
  "region": "API_KEY"
]

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE"
mediaInfoBuilder.streamType = GCKMediaStreamType.Live
mediaInfoBuilder.customData = customData
mediaInformation = mediaInfoBuilder.build()

guard let mediaInfo = mediaInformation else {
  print("invalid mediaInformation")
  return
}

if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia
(mediaInfo) {
  request.delegate = self
}

инструмент CAC

Чтобы настроить эти значения в инструменте Cast Command and Control , перейдите на вкладку «Загрузка носителя» и установите для типа пользовательского запроса загрузки значение «ЗАГРУЗКА». Затем замените данные JSON в текстовой области на этот JSON:

{
  "media": {
    "contentId": "CONTENT_ID",
    "contentUrl": "BACKUP_STREAM_URL",
    "contentType": ""CONTENT_STREAM_MIMETYPE"",
    "streamType": "LIVE",
    "customData": {
      "daiStreamType": "DAI_STREAM_TYPE",
      "networkCode": "NETWORK-CODE",
      "customAssetKey": "CUSTOM_ASSET_KEY",
      "oAuthToken": "API_KEY"
    }
  }
}

Этот пользовательский запрос на загрузку можно отправить получателю для проверки остальных шагов.

Создайте базовый приемник CAF

Создайте собственный веб-приемник, как показано в Руководстве по пользовательскому веб-приемнику CAF SDK .

Код вашего получателя должен выглядеть следующим образом:

<html>
<head>
  <script
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
  </script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    // ...
  </script>
</body>
</html>

Импортируйте IMA DAI SDK и получите Player Manager.

Добавьте тег сценария, чтобы импортировать IMA DAI SDK для CAF в веб-приемник сразу после загрузки CAF сценарием. В теге сценария сохраните контекст приемника и менеджер проигрывателя как константы перед запуском приемника.

<html>
<head>
  <script
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
  <script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();

    castContext.start();
  </script>
</body>
</html>

Инициализируйте диспетчер потоков IMA

Инициализируйте диспетчер потоков IMA.

<html>
<head>
  <script type="text/javascript"
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
  <script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();
    const streamManager = new google.ima.cast.dai.api.StreamManager();

    castContext.start();
  </script>
</body>
</html>

Создайте перехватчик нагрузки Stream Manager.

Прежде чем ваши медиа-элементы будут переданы в CAF, создайте запрос потока в перехватчике сообщений LOAD .

    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();
    const streamManager = new google.ima.cast.dai.api.StreamManager();

    /**
     * Creates a livestream request object for a Pod Serving stream.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {StreamRequest} an IMA stream request
     */
    const createStreamRequest = (castRequest) => { /* ... */};

    /**
     * Initates a DAI stream request for the final stream manifest.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
     */
    const createDAICastRequest = (castRequest) => {
        return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
          .then((castRequestWithPodStreamData) => {
            console.log('Successfully made DAI stream request.');
            // ...
            return castRequestWithPodStreamData;
          })
          .catch((error) => {
            console.log('Failed to make DAI stream request.');
            // CAF will automatically fallback to the content URL
            // that it can read from the castRequest object.
            return castRequest;
          });
    };

    playerManager.setMessageInterceptor(
        cast.framework.messages.MessageType.LOAD, createDAICastRequest);

    castContext.start();

Создайте запрос потока

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

    /**
     * Creates a livestream request object for a Pod Serving stream.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {StreamRequest} an IMA stream request
     */
    const createStreamRequest = (castRequest) => {
      const customData = castRequest.media.customData;
      let streamRequest;
      if (customData.daiStreamType == "LIVE") {
        streamRequest = new google.ima.cast.dai.api.PodStreamRequest();
        streamRequest.customAssetKey = customData.customAssetKey;
        streamRequest.networkCode = customData.networkCode;
        streamRequest.apiKey = customData.apiKey;
      } else if (customData.daiStreamType == "VOD") {
        streamRequest = new google.ima.cast.dai.api.PodVodStreamRequest();
        streamRequest.networkCode = customData.networkCode;
        streamRequest.apiKey = customData.apiKey;
      }
      return streamRequest;
    };

Получите сшитый манифест из вашего VTP.

Если ваш запрос потока успешен, используйтеstreamManager.getStreamId streamManager.getStreamId() для получения идентификатора потока. Ваш технический партнер по видео (VTP) или специальный манипулятор манифеста предоставит инструкции по получению URL-адреса манифеста, используя этот идентификатор потока.

Получив URL-адрес манифеста, замените существующий contentUrl новым manifestUrl .

Наконец, прежде чем возвращать измененный манифест потока, вызовите метод loadStreamMetadata в streamManager , чтобы сообщить IMA SDK, что он может безопасно запрашивать метаданные потока. Этот вызов необходим только для потоков VOD.

    /**
     * Initates a DAI stream request for the final stream manifest.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
     */
    const createDAICastRequest = (castRequest) => {
        return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
          .then((castRequestWithPodStreamData) => {
            console.log('Successfully made DAI stream request.');

            // This is a sample VTP integration. Consult your VTP documentation
            // for how to retrieve an ad-stitched stream manifest URL.
            const manifestTemplate = "https://.../manifest.m3u8?gam_stream_id=[[STREAMID]]";
            const streamId = streamManager.getStreamId();
            const manifestUrl = manifestTemplate.replace('[[STREAMID]]', streamId)
            // Assign your manifestUrl to the request's content URL.
            castRequestWithPodStreamData.media.contentUrl = manifestUrl;

            // After generating the manifest URL, VOD streams must notify the
            // IMA SDK that it is safe to request ad pod metadata.
            // This is only necessary for VOD streams. It is a no-op for
            // livestreams, so no conditional is needed.
            streamManager.loadStreamMetadata();

            return castRequestWithPodStreamData;
          })
          .catch((error) => {
            console.log('Failed to make DAI stream request.');
            // CAF will automatically fallback to the content URL
            // that it can read from the castRequest object.
            return castRequest;
          });
    };

Очистите активы IMA DAI

После успешного завершения запроса и отображения рекламы в потоке обслуживания модулей с помощью IMA DAI SDK мы предлагаем вам очистить все ресурсы после завершения сеанса обслуживания модулей. Вызовите StreamManager.destroy() чтобы остановить воспроизведение потока, остановить отслеживание всей рекламы и освободить все загруженные ресурсы потока.