Mengintegrasikan Cast SDK ke Aplikasi Pengirim Web Anda

Panduan developer ini menjelaskan cara menambahkan dukungan Google Cast ke aplikasi Pengirim Web menggunakan SDK Cast.

Terminologi

Perangkat seluler atau browser adalah pengirim, yang mengontrol pemutaran; perangkat Google Cast adalah penerima, yang menampilkan konten di layar untuk pemutaran.

Web Sender SDK terdiri dari dua bagian: Framework API (cast.framework) dan Base API (chrome.cast) Secara umum, Anda melakukan panggilan di Framework API yang lebih sederhana dan memiliki tingkat lebih tinggi, yang kemudian diproses oleh Base API tingkat lebih rendah.

Framework pengirim mengacu pada Framework API, modul, dan resource terkait yang menyediakan wrapper seputar fungsi tingkat lebih rendah. Aplikasi pengirim atau aplikasi Chrome Google Cast mengacu pada aplikasi web (HTML/JavaScript) yang berjalan di dalam browser Chrome pada perangkat pengirim. Aplikasi Penerima Web mengacu pada aplikasi HTML/JavaScript yang berjalan di Chromecast atau perangkat Google Cast.

Framework pengirim menggunakan desain callback asinkron untuk memberi tahu aplikasi pengirim peristiwa dan untuk melakukan transisi antara berbagai status siklus proses aplikasi Cast.

Memuat library

Agar aplikasi Anda dapat menerapkan fitur Google Cast, aplikasi Anda perlu mengetahui lokasi Google Cast Web Sender SDK, seperti yang ditunjukkan di bawah ini. Tambahkan parameter kueri URL loadCastFramework untuk memuat Web Sender Framework API. Semua halaman aplikasi Anda harus merujuk ke library sebagai berikut:

<script src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"></script>

Framework

Web Sender SDK menggunakan namespace cast.framework.*. Namespace ini mewakili hal-hal berikut:

  • Metode atau fungsi yang memanggil operasi pada API
  • Pemroses peristiwa untuk fungsi pemroses di API

Framework ini terdiri dari komponen utama berikut:

  • CastContext adalah objek singleton yang memberikan informasi tentang status Cast saat ini, serta memicu peristiwa untuk perubahan status Cast dan status sesi Cast.
  • Objek CastSession mengelola sesi, yang menyediakan informasi status dan peristiwa pemicu, seperti perubahan pada volume perangkat, status penonaktifan, dan metadata aplikasi.
  • Elemen tombol Cast, yang merupakan elemen kustom HTML sederhana yang memperluas tombol HTML. Jika tombol Cast yang disediakan tidak memadai, Anda dapat menggunakan status Cast untuk mengimplementasikan tombol Cast.
  • RemotePlayerController menyediakan data binding untuk menyederhanakan implementasi pemutar jarak jauh.

Tinjau Referensi Google Cast Web Sender API untuk mengetahui deskripsi lengkap tentang namespace.

Tombol Cast

Komponen tombol Cast di aplikasi Anda ditangani sepenuhnya oleh framework. Hal ini mencakup pengelolaan visibilitas, serta penanganan peristiwa klik.

<google-cast-launcher></google-cast-launcher>

Atau, Anda dapat membuat tombol secara terprogram:

document.createElement("google-cast-launcher");

Anda dapat menerapkan gaya visual tambahan apa pun, seperti ukuran atau penempatan, ke elemen jika diperlukan. Gunakan atribut --connected-color untuk memilih warna status Penerima Web yang terhubung, dan --disconnected-color untuk status terputus.

Inisialisasi

Setelah memuat API framework, aplikasi akan memanggil pengendali window.__onGCastApiAvailable. Anda harus memastikan bahwa aplikasi menetapkan pengendali ini di window sebelum memuat library pengirim.

Dalam pengendali ini, Anda menginisialisasi interaksi Cast dengan memanggil metode setOptions(options) dari CastContext.

Contoh:

<script>
window['__onGCastApiAvailable'] = function(isAvailable) {
  if (isAvailable) {
    initializeCastApi();
  }
};
</script>

Kemudian, lakukan inisialisasi API sebagai berikut:

initializeCastApi = function() {
  cast.framework.CastContext.getInstance().setOptions({
    receiverApplicationId: applicationId,
    autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
  });
};

Pertama, aplikasi mengambil instance singleton objek CastContext yang disediakan oleh framework. Selanjutnya, proses ini menggunakan setOptions(options) menggunakan objek CastOptions untuk menetapkan applicationID.

Jika menggunakan Penerima Media Default, yang tidak memerlukan pendaftaran, Anda menggunakan konstanta yang telah ditetapkan sebelumnya oleh Web Sender SDK, seperti yang ditunjukkan di bawah ini, bukan applicationID:

cast.framework.CastContext.getInstance().setOptions({
  receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID
});

Kontrol media

Setelah CastContext diinisialisasi, aplikasi dapat mengambil CastSession saat ini kapan saja menggunakan getCurrentSession().

var castSession = cast.framework.CastContext.getInstance().getCurrentSession();

CastSession dapat digunakan untuk memuat media ke perangkat Cast yang terhubung menggunakan loadMedia(loadRequest). Pertama, buat MediaInfo, menggunakan contentId dan contentType serta informasi lain yang terkait dengan konten. Kemudian, buat LoadRequest dari daftar tersebut, yang menetapkan semua informasi yang relevan untuk permintaan tersebut. Terakhir, panggil loadMedia(loadRequest) di CastSession Anda.

var mediaInfo = new chrome.cast.media.MediaInfo(currentMediaURL, contentType);
var request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
  function() { console.log('Load succeed'); },
  function(errorCode) { console.log('Error code: ' + errorCode); });

Metode loadMedia akan menampilkan Promise, yang dapat digunakan untuk melakukan operasi yang diperlukan agar mendapatkan hasil yang sukses. Jika Promise ditolak, argumen fungsi akan berupa chrome.cast.ErrorCode.

Anda dapat mengakses variabel status pemain di RemotePlayer. Semua interaksi dengan RemotePlayer, termasuk callback dan perintah peristiwa media, ditangani dengan RemotePlayerController.

var player = new cast.framework.RemotePlayer();
var playerController = new cast.framework.RemotePlayerController(player);

RemotePlayerController memberi aplikasi kontrol media penuh atas PLAY, PAUSE, STOP, dan SEEK untuk media yang dimuat.

  • PUTAR/JEDA: playerController.playOrPause();
  • HENTIKAN: playerController.stop();
  • LIHAT: playerController.seek();

RemotePlayer dan RemotePlayerController dapat digunakan dengan framework data binding, seperti Polymer atau Angular, untuk mengimplementasikan pemutar jarak jauh.

Berikut adalah cuplikan kode untuk Angular:

<button id="playPauseButton" class="playerButton"
  ng-disabled="!player.canPause"
  ng-click="controller.playOrPause()">
    {{player.isPaused ? 'Play' : 'Pause'}}
</button>
<script>
var player = new cast.framework.RemotePlayer();
var controller = new cast.framework.RemotePlayerController(player);
// Listen to any player update, and trigger angular data binding
update.controller.addEventListener(
  cast.framework.RemotePlayerEventType.ANY_CHANGE,
  function(event) {
    if (!$scope.$$phase) $scope.$apply();
  });
</script>

Status media

Selama pemutaran media, berbagai peristiwa terjadi yang dapat ditangkap dengan menetapkan pemroses untuk berbagai peristiwa cast.framework.RemotePlayerEventType pada objek RemotePlayerController.

Untuk mendapatkan informasi status media, gunakan peristiwa cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, yang terpicu saat pemutaran berubah dan saat CastSession.getMediaSession().media berubah.

playerController.addEventListener(
  cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function() {
    // Use the current session to get an up to date media status.
    let session = cast.framework.CastContext.getInstance().getCurrentSession();

    if (!session) {
        return;
    }

    // Contains information about the playing media including currentTime.
    let mediaStatus = session.getMediaSession();
    if (!mediaStatus) {
        return;
    }

    // mediaStatus also contains the mediaInfo containing metadata and other
    // information about the in progress content.
    let mediaInfo = mediaStatus.media;
  });

Saat peristiwa seperti jeda, putar, lanjutkan, atau cari terjadi, aplikasi harus bertindak berdasarkan peristiwa tersebut dan menyinkronkannya antara aplikasi itu sendiri dan aplikasi Penerima Web di perangkat Transmisi. Lihat Pembaruan status untuk mengetahui informasi selengkapnya.

Cara kerja pengelolaan sesi

SDK Cast memperkenalkan konsep sesi Cast, yang menggabungkan langkah-langkah untuk menghubungkan ke perangkat, meluncurkan (atau bergabung ke) aplikasi Penerima Web, terhubung ke aplikasi tersebut, dan menginisialisasi saluran kontrol media. Lihat Panduan siklus proses aplikasi Penerima Web untuk mengetahui informasi selengkapnya tentang sesi Transmisi dan siklus proses Penerima Web.

Sesi dikelola oleh class CastContext, yang dapat diambil aplikasi Anda melalui cast.framework.CastContext.getInstance(). Sesi individual direpresentasikan oleh subclass class Session. Misalnya, CastSession mewakili sesi dengan perangkat Transmisi. Aplikasi Anda dapat mengakses sesi Cast yang saat ini aktif melalui CastContext.getCurrentSession().

Untuk memantau status sesi, tambahkan pemroses ke CastContext untuk jenis peristiwa CastContextEventType.SESSION_STATE_CHANGED.

var context = cast.framework.CastContext.getInstance();
context.addEventListener(
  cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
  function(event) {
    switch (event.sessionState) {
      case cast.framework.SessionState.SESSION_STARTED:
      case cast.framework.SessionState.SESSION_RESUMED:
        break;
      case cast.framework.SessionState.SESSION_ENDED:
        console.log('CastContext: CastSession disconnected');
        // Update locally as necessary
        break;
    }
  })

Untuk koneksi yang terputus, misalnya saat pengguna mengklik tombol "hentikan transmisi" dari dialog Cast, Anda dapat menambahkan pemroses untuk jenis peristiwa RemotePlayerEventType.IS_CONNECTED_CHANGED di pemroses Anda. Di pemroses, periksa apakah RemotePlayer terputus. Jika ya, perbarui status pemutar lokal sesuai kebutuhan. Contoh:

playerController.addEventListener(
  cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function() {
    if (!player.isConnected) {
      console.log('RemotePlayerController: Player disconnected');
      // Update local player to disconnected state
    }
  });

Meskipun pengguna dapat mengontrol penghentian Cast secara langsung melalui tombol Cast framework, pengirim dapat menghentikan transmisi menggunakan objek CastSession saat ini.

function stopCasting() {
  var castSession = cast.framework.CastContext.getInstance().getCurrentSession();
  // End the session and pass 'true' to indicate
  // that Web Receiver app should be stopped.
  castSession.endSession(true);
}

Transfer streaming

Mempertahankan status sesi adalah dasar transfer streaming, tempat pengguna dapat memindahkan streaming audio dan video yang ada di seluruh perangkat menggunakan perintah suara, Aplikasi Google Home, atau layar smart. Media berhenti diputar di satu perangkat (sumber) dan berlanjut di perangkat lain (tujuan). Setiap perangkat Cast dengan firmware terbaru dapat berfungsi sebagai sumber atau tujuan dalam transfer streaming.

Untuk mendapatkan perangkat tujuan baru selama transfer streaming, panggil CastSession#getCastDevice() saat peristiwa cast.framework.SessionState.SESSION_RESUMED dipanggil.

Lihat Transfer streaming di Penerima Web untuk mengetahui informasi selengkapnya.