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

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

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

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

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

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

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

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

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

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

Обзор обслуживания модулей 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 содержит хранилище дополнительных обязательных полей «ключ-значение».
Поле Содержание
manifestUrl URL-адрес видеопотока, предоставленный вашим манипулятором манифеста или сторонним партнером. Прежде чем делать запрос, вам потребуется ввести идентификатор потока, предоставленный IMA DAI SDK. В этом примере URL-адрес манифеста включает заполнитель [[STREAMID]] , который заменяется идентификатором потока перед выполнением запроса.

MANIFEST_URL

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 = {
manifestUrl: "MANIFEST_URL",
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("manifestUrl", "MANIFEST_URL")
  .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 = @{
  @"manifestUrl": @"MANIFEST_URL",
  @"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 = [
  "liveConfigID": "MANIFEST_URL",
  "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": {
      "liveConfigID": "MANIFEST_URL",
      "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 streamRequest = new google.ima.cast.dai.api.PodStreamRequest();
      const customData = castRequest.media.customData;

      streamRequest.customAssetKey = customData.customAssetKey;
      streamRequest.networkCode = customData.networkCode;
      streamRequest.apiKey = customData.apiKey;

      return streamRequest;
    };

Замените URL-адрес контента URL-адресом манифеста и идентификатором потока.

Если ваш запрос потока успешен, используйтеstreamManager.getStreamId streamManager.getStreamId() чтобы получить идентификатор потока и вставить его в свой манифестUrl, заменив [[STREAMID]] . Затем замените существующий contentUrl новым manifestUrl , чтобы CAF воспроизводил прямую трансляцию со сшитыми рекламными модулями.

    /**
     * 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.');
            const media = castRequestWithPodStreamData.media;
                const manifestUrl = media.customData.manifestUrl || "";
                if (manifestUrl) {
                    console.log('Replacing the contentURL with the manifest URL and stream ID');
                    const streamId = streamManager.getStreamId();
                    castRequestWithPodStreamData.media.contentUrl = manifestUrl.replace('[[STREAMID]]', streamId);

            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;
          });
    };

Теперь вы можете запрашивать и воспроизводить потоки обслуживания модулей с помощью Cast Application Framework и IMA DAI SDK для CAF.