Kapsül hizmeti DAI ile ayarlama

Platform seçin: HTML5 Android iOS tvOS Yayınla Roku

IMA SDK'ları, multimedya reklamları web sitelerinize ve uygulamalarınıza entegre etmeyi kolaylaştırır.

IMA SDK'ları, herhangi bir VAST uyumlu reklam sunucusundan reklam isteyebilir ve uygulamalarınızda reklam oynatmayı yönetebilir.

IMA DAI SDK'ları sayesinde uygulamalar, VOD veya canlı içerik için reklam ve içerik videosu akış isteği gönderir. SDK daha sonra birleştirilmiş bir video akışı döndürür. Böylece uygulamanızda reklam ve içerik videosu arasında geçişi yönetmeniz gerekmez.

Bu kılavuzda, CAF için IMA DAI SDK'yı kullanarak DAI kapsül yayınlama akışının nasıl oynatılacağı gösterilmektedir.

Bu kılavuzu kullanmadan önce Chromecast Uygulama Çerçevesi'nin Web Alıcısı protokolü hakkında bilgi edinin. Bu kılavuzda, CAF alıcı kavramları (ör. mesaj dinleyiciler ve mediaInformation nesneleri) hakkında temel bilgilere sahip olduğunuz ve CAF gönderenini taklit etmek için Cast Command and Control aracını kullanmayı bildiğiniz varsayılmaktadır.

IMA DAI Kapsül Yayınlama'yı kullanmak için bir kapsül yayınlama iş ortağıyla çalışıyor ve Ad Manager 360 Advanced hesabınızın olması gerekir. Ad Manager hesabınız varsa daha fazla bilgi için hesap yöneticinizle iletişime geçin. Ad Manager'a kaydolma hakkında bilgi edinmek için Ad Manager Yardım Merkezi'ni ziyaret edin.

Diğer platformlarla entegrasyon veya IMA istemci tarafı SDK'larını kullanma hakkında bilgi edinmek için Interactive Media Ads SDK'ları bölümüne bakın.

IMA DAI Kapsül Yayınlama'ya genel bakış

IMA CAF DAI SDK'yı kullanarak kapsül yayınlamayı uygulamak, bu kılavuzda gösterilen iki ana bileşeni içerir:

  • StreamRequest: Google'ın reklam sunucularına yönelik bir akış isteğini tanımlayan nesne. İstekler bir ağ kodu, özel öğe anahtarı ve isteğe bağlı bir API anahtarının yanı sıra diğer isteğe bağlı parametreleri belirtir.
  • StreamManager: Video akışı ile IMA DAI SDK'sı arasındaki iletişimi yöneten bir nesne. Örneğin, izleme ping'lerini tetikler ve akış etkinliklerini yayıncıya iletir.

Ön koşullar

  • Kayıtlı test cihazlarının bulunduğu bir Cast Developer Console hesabı.
  • Cast Developer Console'unuza kayıtlı olan ve bu kılavuzda sağlanan kodu barındıracak şekilde değiştirilebilen barındırılan bir web alıcı uygulaması.
  • Web alıcı uygulamanızı kullanacak şekilde yapılandırılmış bir gönderen uygulama. Bu örnekte, gönderen olarak Cast Command and Control aracını kullanın.

Gönderenin MediaInfo nesnelerini yapılandırma

Öncelikle, gönderen uygulamanızın MediaInfo nesnesini aşağıdaki alanları içerecek şekilde yapılandırın:

Alan İçindekiler
contentId Bu medya öğesi için benzersiz bir tanımlayıcı.

CONTENT_ID

contentUrl İsteğe bağlıdır. DAI yayını yüklenemezse oynatılacak yedek yayın URL'si.

BACKUP_STREAM_URL

contentType İsteğe bağlıdır. İçerik yedekleme akışlarının MIME türü. Yalnızca DASH akışları için gereklidir.

CONTENT_STREAM_MIMETYPE

streamType Bu değer için kullanılan dize değişmezi veya sabit, gönderen platforma göre değişir.
customData customData alanı, gerekli diğer alanların anahtar/değer deposunu içerir. Bu örnekte, DAI akış parametrelerinizi içerir. Üretim uygulamasında, bunun yerine, yayın alıcı uygulamanızın bu parametreleri sunucu tarafı isteğiyle almak için kullanacağı bir tanımlayıcı iletebilirsiniz.
Alan İçindekiler
daiStreamType DAI akışınızın türü. "LIVE" veya "VOD" değerlerinden biri

DAI_STREAM_TYPE

networkCode Google Ad Manager 360 hesabınızın ağ kodu.

NETWORK_CODE

customAssetKey Bu alan yalnızca canlı yayınlar için gereklidir. Google Ad Manager 360'ta kapsül yayınlama etkinliğinizi tanımlayan özel öğe anahtarı.

CUSTOM_ASSET_KEY

apiKey IMA DAI SDK'dan akış kimliği almak için isteğe bağlı bir API anahtarı.

API_KEY

Başlamanıza yardımcı olacak bazı kod örnekleri:

Web

Bu değerleri bir Cast web göndericisinde yapılandırmak için önce gerekli verileri içeren bir MediaInfo nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.

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

Android

Bu değerleri bir Cast web göndericisinde yapılandırmak için önce gerekli verileri içeren bir MediaInfo nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.

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 (Obj-C)

Bu değerleri bir Cast web göndericisinde yapılandırmak için önce gerekli verileri içeren bir GCKMediaInformation nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.

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 (Swift)

Bu değerleri bir Cast web göndericisinde yapılandırmak için önce gerekli verileri içeren bir GCKMediaInformation nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.

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 aracı

Cast Command and Control aracında bu değerleri yapılandırmak için Load Media (Medya Yükle) sekmesini tıklayın ve özel yükleme isteği türünü LOAD (YÜKLE) olarak ayarlayın. Ardından, metin alanındaki JSON verilerini şu JSON ile değiştirin:

{
  "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"
    }
  }
}

Bu özel yükleme isteği, adımların geri kalanını test etmek için alıcıya gönderilebilir.

Temel CAF alıcısı oluşturma

CAF SDK Özel Web Alıcısı Kılavuzu'nda gösterildiği gibi özel bir web alıcısı oluşturun.

Alıcınızın kodu aşağıdaki gibi görünmelidir:

<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'yı içe aktarma ve Player Manager'ı edinme

CAF için IMA DAI SDK'sını web alıcınıza aktarmak üzere CAF'yi yükleyen komut dosyasından hemen sonra bir komut dosyası etiketi ekleyin. Komut dosyası etiketinde, alıcıyı başlatmadan önce alıcı bağlamını ve oynatıcı yöneticisini sabit olarak depolayın.

<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 Stream Manager'ı başlatma

IMA Stream Manager'ı başlatın.

<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 Load Interceptor'ı oluşturma

Medya öğeleriniz CAF'ye iletilmeden önce akış isteğinizi bir LOAD mesajı yakalayıcıda oluşturun.

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

Akış isteğini oluşturma

CAF yükleme isteğine göre kapsül sunma akışı oluşturmak için createStreamRequest işlevini tamamlayın.

    /**
     * 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;
    };

Birleştirilmiş manifesti VTP'nizden alma

Yayın isteğiniz başarılı olursa yayının kimliğini almak için streamManager.getStreamId() kullanın. Video Teknoloji İş Ortağınız (VTP) veya özel manifest düzenleyiciniz, bu akış kimliğini kullanarak manifest URL'sini alma talimatlarını sağlar.

Manifest URL'nizi aldıktan sonra mevcut contentUrl değerini yeni manifestUrl değeriyle değiştirin.

Son olarak, değiştirilen akış manifestini döndürmeden önce streamManager üzerinde loadStreamMetadata yöntemini çağırarak IMA SDK'ya akış meta verilerini güvenli bir şekilde isteyebileceğini bildirin. Bu çağrı yalnızca VOD akışları için gereklidir.

    /**
     * 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 öğelerini temizleme

IMA DAI SDK ile kapsül sunma akışında reklam isteme ve gösterme işlemlerini başarıyla tamamladığınızda, kapsül sunma oturumu tamamlandıktan sonra tüm kaynakları temizlemenizi öneririz. Canlı yayın oynatmayı durdurmak, tüm reklam izlemeyi durdurmak ve yüklenen tüm canlı yayın öğelerini serbest bırakmak için StreamManager.destroy() yöntemini çağırın.