IMA DAI SDK'sını kullanmaya başlama

İlgilendiğiniz DAI çözümünü seçin

Kapsül Yayınlama DAI

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 yayın isteği gönderir. Ardından SDK, birleştirilmiş bir video akışı döndürür. Böylece uygulamanızda reklam ve içerik videosu arasında geçiş yapmanız gerekmez.

Bu kılavuzda, CAF için IMA DAI SDK'sı kullanılarak 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ünü öğrenin. Bu kılavuzda, CAF gönderenini taklit etmek için mesaj tutucular ve mediaInformation nesneleri gibi CAF alıcı kavramları hakkında temel düzeyde bilgi sahibi olduğunuz ve Cast Komut ve Kontrol Aracı'nı kullanma konusunda bilgi sahibi olduğunuz varsayılmaktadır.

IMA DAI Kapsül Yayınlama'yı kullanmak için bir Kapsül Yayınlama iş ortağıyla çalışıyor olmanız ve Ad Manager 360 Gelişmiş hesabınız 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ı başlıklı makaleyi inceleyin.

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

IMA CAF DAI SDK'sını kullanarak kapsül yayınlama özelliğini uygulamak, bu kılavuzda gösterilen iki ana bileşenden oluşur:

  • StreamRequest: Google'ın reklam sunucularına bir akış isteği tanımlayan bir nesne. İstekler; bir ağ kodu, özel öğe anahtarı ve isteğe bağlı 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 (ör. izleme ping'lerini gönderme ve yayın etkinliklerini yayıncıya yönlendirme).

Ön koşullar

  • Kayıtlı test cihazları olan bir Cast Geliştirici Konsolu hesabı.
  • Cast Developer Console'unuza kayıtlı 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 uygulaması. Bu örnekte, gönderen olarak Cast Komut ve Kontrol 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 öğesinin benzersiz tanımlayıcısıdır.

CONTENT_ID

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

BACKUP_STREAM_URL

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

CONTENT_STREAM_MIMETYPE

streamType Bu değer için kullanılan dize değişmezi veya sabit değer, gönderen platformuna göre değişir.
customData customData alanı, ek zorunlu alanların anahtar/değer mağazasını içerir. Bu örnekte DAI akış parametrelerinizi içerir. Bunun yerine, üretim uygulamasında yayınlama alıcı uygulamanızın bu parametreleri sunucu tarafı istekle almak için kullanacağı bir tanımlayıcı iletebilirsiniz.
Alan İçindekiler
daiStreamType DAI akışınızın türü. "LIVE" veya "VOD" seçeneklerinden 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'sından bir akış kimliği almak için isteğe bağlı bir API anahtarı.

API_KEY

Başlamanıza yardımcı olacak bazı kod örneklerini aşağıda bulabilirsiniz:

Web

Bu değerleri bir Cast web göndereninde 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); });

Yapay Zeka

Bu değerleri bir Cast web göndereninde yapılandırmak için önce gerekli verileri içeren bir MediaInfo nesnesi oluşturun, ardından web alıcısına 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öndereninde 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öndereninde 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ı

Yayınlama Komut ve Kontrol Aracı'nda bu değerleri yapılandırmak için Medya Yükle sekmesini tıklayın ve özel yükleme istek türünü LOAD 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 bir 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ı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'sını içe aktarma ve Oynatıcı Yöneticisi'ni alma

Komut dosyası CAF'yi yükledikten hemen sonra, CAF için IMA DAI SDK'sını web alıcınıza içe aktarmak üzere bir komut dosyası etiketi ekleyin. Alıcıyı başlatmadan önce alıcı bağlamını ve oynatıcı yöneticisini komut dosyası etiketinde sabit olarak saklayı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 Akış Yöneticisi'ni 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 Yük Engelleyicisi'ni oluşturma

Medya öğeleriniz CAF'ye iletilmeden önce akış isteğinizi bir LOAD mesajı alıcısı içinde 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 bir Pod Yayınlama 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;
    };

VTP'nizden birleştirilmiş manifest'i alma

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

Manifest URL'nizi aldıktan sonra mevcut contentUrl yerine yeni manifestUrl değerini girin.

Son olarak, değiştirilmiş yayın manifestini döndürmeden önce IMA SDK'ya yayın meta verilerini güvenli bir şekilde isteyebileceğini bildirmek için streamManager üzerinde loadStreamMetadata yöntemini çağırın. Bu çağrı yalnızca seç-izle yayınlar 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'sını kullanarak bir Pod Yayınlama akışında reklam isteğinde bulunma ve görüntüleme işlemlerini başarıyla tamamladığınızda, Pod Yayınlama oturumu tamamlandıktan sonra tüm kaynakları temizlemenizi öneririz. Akış oynatmayı durdurmak, tüm reklam izlemeyi durdurmak ve yüklü tüm akış öğelerini serbest bırakmak için StreamManager.destroy() çağrısı yapın.