Menggunakan IMA DAI SDK di Chromecast

Memutar livestream yang terdaftar dengan Google Cloud Video Stitcher API

Panduan ini menunjukkan cara menggunakan IMA DAI SDK untuk Penerima Web CAF guna meminta dan memutar livestream untuk acara yang terdaftar dengan Google Cloud Video Stitcher API, serta menyisipkan jeda iklan selama pemutaran.

Panduan ini memperluas contoh dasar dari DAI layanan lengkap, dengan menambahkan dukungan untuk streaming yang terdaftar dengan Google Cloud Video Stitcher API.

Pastikan format streaming Anda didukung oleh penerima web CAF sebelum melanjutkan.

Untuk mengetahui informasi tentang cara berintegrasi dengan platform lain atau menggunakan IMA SDK sisi klien, lihat IMA SDK.

Latar belakang

Sebelum menggunakan panduan ini, pahami protokol Penerima Web Chromecast Application Framework.

Panduan ini mengasumsikan tingkat pemahaman dasar tentang konsep penerima CAF, seperti pemroses pesan, MediaInformation objek, dan penggunaan alat Perintah dan Kontrol Cast untuk meniru pengirim CAF.

Komponen dan arsitektur aplikasi

Implementasi pemutaran livestream dengan Google Cloud Video Stitcher API menggunakan IMA CAF DAI SDK melibatkan dua komponen utama seperti yang ditunjukkan dalam panduan ini:

  • VideoStitcherLiveStreamRequest: Objek yang menentukan permintaan streaming ke server Google. Permintaan ini menentukan instance Cloud Video Stitcher API, ID konfigurasi live, dan parameter opsional lainnya.
  • StreamManager: Objek yang menangani komunikasi antara streaming video dan IMA DAI SDK, seperti mengirim ping pelacakan dan meneruskan peristiwa streaming ke penayang.

Prasyarat

Anda memerlukan variabel berikut untuk IMA SDK:

  • ID Konfigurasi Live: Ini adalah ID konfigurasi live yang Anda tentukan saat membuat konfigurasi live Video Stitcher API.

    LIVE_CONFIG_ID

  • Lokasi: Region Google Cloud tempat Konfigurasi Live Anda dibuat.

    LOCATION

  • Nomor Project: Nomor project Google Cloud yang menggunakan Video Stitcher API.

    PROJECT_NUMBER

  • Token OAuth: Token OAuth jangka pendek akun layanan dengan peran pengguna Video Stitcher. Baca lebih lanjut tentang membuat kredensial jangka pendek untuk akun layanan.

    OAUTH_TOKEN

  • Kode Jaringan: Kode jaringan Google Ad Manager untuk meminta iklan.

    NETWORK_CODE

  • Kunci Aset Kustom: Kunci aset kustom Google Ad Manager yang dibuat selama proses pembuatan konfigurasi untuk acara livestream dengan Video Stitcher API.

    CUSTOM_ASSET_KEY

Anda memerlukan hal berikut untuk penerima Cast kustom:

  • Akun Konsol Developer Cast dengan perangkat pengujian dalam daftar yang diizinkan.

  • Aplikasi penerima web yang dihosting dan terdaftar di Konsol Developer Cast, serta dapat diubah untuk menghosting kode yang disediakan oleh panduan ini.

  • Aplikasi pengirim yang dikonfigurasi untuk menggunakan aplikasi penerima web Anda. Untuk tujuan contoh ini, panduan ini menggunakan alat Perintah dan Kontrol Cast sebagai pengirim.

Menyiapkan pengirim untuk meneruskan data streaming ke penerima

Pertama, konfigurasi aplikasi pengirim Anda untuk membuat permintaan pemuatan ke penerima web, yang berisi kolom berikut dalam objek platform Anda MediaInformation.

Kolom Daftar Isi
contentId ID unik untuk item media ini, seperti yang ditentukan dalam Cast dokumentasi referensi. ID ini tidak boleh digunakan kembali untuk beberapa item dalam antrean media yang sama.

CONTENT_ID

contentUrl URL streaming Backup opsional untuk diputar jika streaming DAI gagal dimuat.

BACKUP_STREAM_URL

contentType Mimetype opsional dari URL streaming backup untuk diputar jika streaming DAI gagal dimuat.

BACKUP_STREAM_MIMETYPE

streamType Literal atau konstanta string yang digunakan untuk nilai ini bervariasi menurut platform pengirim.

LIVE

customData

Kolom customData berisi penyimpanan nilai kunci dari kolom tambahan yang diperlukan. Dalam hal ini, customData berisi data streaming DAI yang Anda kumpulkan.

Kolom Daftar Isi
liveConfigID LIVE_CONFIG_ID
region LOCATION
projectNumber PROJECT_NUMBER
oAuthToken OAUTH_TOKEN
networkCode NETWORK_CODE
customAssetKey CUSTOM_ASSET_KEY

Berikut beberapa contoh kode untuk membantu Anda memulai:

Web

Untuk mengonfigurasi nilai ini di pengirim web Cast, buat objek MediaInfo dengan data yang diperlukan terlebih dahulu, lalu buat permintaan pemuatan ke penerima web.

// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "BACKUP_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
liveConfigID: "LIVE_CONFIG_ID",
region: "LOCATION",
projectNumber: "PROJECT_NUMBER",
oAuthToken: "OAUTH_TOKEN",
networkCode: "NETWORK_CODE",
customAssetKey: "CUSTOM_ASSET_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

Untuk mengonfigurasi nilai ini di pengirim web Cast, buat objek MediaInfo dengan data yang diperlukan terlebih dahulu, lalu buat permintaan pemuatan ke penerima web.

JSONObject customData = new JSONObject()
  .put("liveConfigID", "LIVE_CONFIG_ID")
  .put("region", "LOCATION")
  .put("projectNumber", "PROJECT_NUMBER")
  .put("oAuthToken", "OAUTH_TOKEN")
  .put("networkCode", "NETWORK_CODE")
  .put("customAssetKey", "CUSTOM_ASSET_KEY");

MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
  .setContentUrl("BACKUP_STREAM_URL")
  .setContentType("BACKUP_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)

Untuk mengonfigurasi nilai ini di pengirim web Cast, buat GCKMediaInformation objek dengan data yang diperlukan terlebih dahulu, lalu buat permintaan pemuatan ke penerima web.

NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
  @"liveConfigID": @"LIVE_CONFIG_ID",
  @"region": @"LOCATION",
  @"projectNumber": @"PROJECT_NUMBER",
  @"oAuthToken": @"OAUTH_TOKEN",
  @"networkCode": @"NETWORK_CODE",
  @"customAssetKey": @"CUSTOM_ASSET_KEY"
};

GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"BACKUP_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)

Untuk mengonfigurasi nilai ini di pengirim web Cast, buat GCKMediaInformation objek dengan data yang diperlukan terlebih dahulu, lalu buat permintaan pemuatan ke penerima web.

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

let customData = [
  "liveConfigID": "LIVE_CONFIG_ID",
  "region": "LOCATION",
  "projectNumber": "PROJECT_NUMBER",
  "oAuthToken": "OAUTH_TOKEN",
  "networkCode": "NETWORK_CODE",
  "customAssetKey": "CUSTOM_ASSET_KEY"
]

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = "BACKUP_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
}

Alat CAC

Untuk mengonfigurasi nilai ini di alat Perintah dan Kontrol Cast, klik tab Muat Media, dan tetapkan jenis permintaan pemuatan kustom ke LOAD. Kemudian, ganti data JSON di area teks dengan JSON ini:

{
  "media": {
    "contentId": "CONTENT_ID",
    "contentUrl": "BACKUP_STREAM_URL",
    "contentType": "BACKUP_STREAM_MIMETYPE",
    "streamType": "LIVE",
    "customData": {
      "liveConfigID": "LIVE_CONFIG_ID",
      "region": "LOCATION",
      "projectNumber": "PROJECT_NUMBER",
      "oAuthToken": "OAUTH_TOKEN",
      "networkCode": "NETWORK_CODE",
      "customAssetKey": "CUSTOM_ASSET_KEY"
    }
  }
}

Permintaan pemuatan kustom ini dapat dikirim ke penerima untuk menguji langkah-langkah lainnya.

Membuat penerima web CAF kustom

Buat penerima web kustom, seperti yang terlihat di Panduan Penerima Web Kustom CAF SDK.

Kode penerima Anda akan terlihat seperti berikut:

<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>
    const castContext = cast.framework.CastReceiverContext.getInstance()
    castContext.start();
  </script>
</body>
</html>

Mengimpor IMA DAI SDK dan mendapatkan Pengelola Pemutar

Tambahkan tag skrip untuk mengimpor IMA DAI SDK untuk CAF ke penerima web Anda, tepat setelah skrip memuat CAF. Kemudian, di tag skrip yang mengikuti, simpan konteks penerima dan pengelola pemutar sebagai konstanta sebelum memulai penerima.

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

Menginisialisasi Pengelola Streaming IMA

Inisialisasi Pengelola Streaming 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>

Membuat Pemroses Pemuatan Pengelola Streaming

Sebelum item media Anda diteruskan ke CAF, buat permintaan streaming di a pemroses pesan LOAD interceptor.

    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 the Video Stitcher API.
     * @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((castRequestWithStreamData) => {
            console.log('Successfully made DAI stream request.');
            return castRequestWithStreamData;
          })
          .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();

Membuat permintaan streaming

Lengkapi fungsi createStreamRequest untuk membuat permintaan livestream Video Stitcher API, berdasarkan permintaan pemuatan CAF.

    /**
     * Creates a livestream request object for the Video Stitcher API.
     * @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.VideoStitcherLiveStreamRequest();
      const customData = castRequest.media.customData;

      streamRequest.liveStreamEventId = customData.liveConfigID;
      streamRequest.region = customData.region;
      streamRequest.projectNumber = customData.projectNumber;
      streamRequest.oAuthToken = customData.oAuthToken;
      streamRequest.networkCode = customData.networkCode;
      streamRequest.customAssetKey = customData.customAssetKey;

      return streamRequest;
    };

(Opsional) Menambahkan opsi sesi streaming

Sesuaikan permintaan streaming Anda dengan menambahkan opsi sesi untuk mengganti konfigurasi Cloud Video Stitcher API default menggunakan VideoStitcherLiveStreamRequest.videoStitcherSessionOptions. Jika Anda memberikan opsi yang tidak dikenali, Cloud Video Stitcher API akan merespons dengan error HTTP 400. Lihat panduan pemecahan masalah untuk mendapatkan bantuan.

Misalnya, Anda dapat mengganti opsi manifes dengan cuplikan kode berikut, yang meminta dua manifes streaming dengan rendering yang diurutkan dari bitrate terendah hingga tertinggi.

...

// The following session options are examples. Use session options
// that are compatible with your video stream.
streamRequest.videoStitcherSessionOptions = {
  "manifestOptions": {
    "bitrateOrder": "ascending"
  }
};

streamManager.requestStream(streamRequest);