Cast SDK をウェブ送信者アプリに統合する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このデベロッパー ガイドでは、Cast SDK を使用してウェブ送信者アプリに Google Cast サポートを追加する方法について説明します。

用語

モバイル デバイスまたはブラウザが再生を制御する送信側です。Google Cast デバイスは再生用の画面にコンテンツを表示するレシーバーです。

Web Sender SDK は、Framework API(cast.framework)と Base API(chrome.cast)の 2 つの部分で構成されています。通常は、より単純な上位レベルの Framework API で呼び出しを行い、その後、低レベルの Base API で処理されます。

送信者フレームワークは、下位レベルの機能のラッパーを提供するフレームワーク API、モジュール、関連リソースを指します。送信者アプリまたは Google Cast Chrome アプリとは、送信者のデバイス上の Chrome ブラウザ内で実行されているウェブ(HTML / JavaScript)アプリを指します。ウェブレシーバー アプリとは、Chromecast または Google Cast デバイスで実行される HTML/JavaScript アプリを指します。

送信者のフレームワークは、非同期コールバック設計を使用して、送信者アプリにイベントを通知するとともに、キャストアプリのライフサイクルのさまざまな状態を遷移します。

ライブラリを読み込む

アプリに Google Cast の機能を実装するには、次に示すように、Google Cast Web Sender SDK の場所を認識している必要があります。Web Sender Framework API も読み込むように、loadCastFramework URL クエリ パラメータを追加します。アプリのすべてのページが、次のようにライブラリを参照する必要があります。

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

フレームワーク

Web Sender SDK では cast.framework.* 名前空間が使用されます。名前空間は次のものを表します。

  • API でオペレーションを呼び出すメソッドまたは関数
  • API のリスナー関数用のイベント リスナー

このフレームワークは、次の主要コンポーネントで構成されています。

  • CastContext は、現在のキャスト状態に関する情報を提供し、キャスト状態とキャスト セッション状態の変化のイベントをトリガーするシングルトン オブジェクトです。
  • CastSession オブジェクトはセッションを管理します。状態情報を提供し、デバイスの音量、ミュート状態、アプリのメタデータの変更などのイベントをトリガーします。
  • キャスト アイコン要素。HTML ボタンを拡張するシンプルな HTML カスタム要素です。提供されたキャスト アイコンでは不十分な場合、キャスト状態を使用してキャスト ボタンを実装できます。
  • RemotePlayerController は、リモート プレーヤーの実装を簡素化するためのデータ バインディングを提供します。

名前空間の詳細については、Google Cast Web Sender API リファレンスをご覧ください。

キャスト アイコン

アプリ内のキャスト ボタン コンポーネントは、フレームワークによって完全に処理されます。これには、公開設定の管理やクリック イベントの処理が含まれます。

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

または、プログラムでボタンを作成することもできます。

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

必要に応じて、サイズや位置など、追加のスタイルを要素に適用できます。接続されたウェブレシーバーの状態の色を選択するには --connected-color 属性を使用し、切断された状態の色には --disconnected-color を選択します。

初期化

フレームワーク API の読み込み後、アプリはハンドラ window.__onGCastApiAvailable を呼び出します。送信者ライブラリを読み込む前に、アプリがこのハンドラを window で設定していることを確認します。

このハンドラ内で、CastContextsetOptions(options) メソッドを呼び出して、キャスト インタラクションを初期化します。

例:

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

次に、API を次のように初期化します。

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

アプリはまず、フレームワークが提供する CastContext オブジェクトのシングルトン インスタンスを取得します。次に、CastOptions オブジェクトを使用して setOptions(options) を使用し、applicationID を設定します。

登録が不要なデフォルトのメディア レシーバを使用している場合は、次に示すように、applicationID の代わりに Web Sender SDK によって事前定義された定数を使用します。

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

メディア コントロール

CastContext が初期化されると、アプリは getCurrentSession() を使用して、現在の CastSession をいつでも取得できます。

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

CastSession を使用すると、loadMedia(loadRequest) を使用して、接続されたキャスト デバイスにメディアを読み込むことができます。まず、contentIdcontentType と、コンテンツに関連するその他の情報を使用して、MediaInfo を作成します。次に、そこから LoadRequest を作成し、リクエストに関連するすべての情報を設定します。最後に、CastSessionloadMedia(loadRequest) を呼び出します。

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

loadMedia メソッドは Promise を返します。Promise を使用すると、正常な結果を得るために必要な操作を実行できます。Promise が拒否された場合、関数の引数は chrome.cast.ErrorCode になります。

プレーヤー状態変数には RemotePlayer でアクセスできます。メディア イベントのコールバックやコマンドなど、RemotePlayer のすべての操作は RemotePlayerController で処理されます。

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

RemotePlayerController により、アプリは読み込まれたメディアの再生、一時停止、停止、再生を完全制御できるようになります。

  • 再生 / 一時停止: playerController.playOrPause();
  • 停止: playerController.stop();
  • 参照: playerController.seek();

RemotePlayerRemotePlayerController を、Polymer や Angular などのデータ バインディング フレームワークとともに使用して、リモート プレーヤーを実装できます。

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>

メディアのステータス

メディアの再生中にさまざまなイベントが発生します。これらのイベントは、RemotePlayerController オブジェクトでさまざまな cast.framework.RemotePlayerEventType イベントのリスナーを設定することによりキャプチャできます。

メディア ステータス情報を取得するには、cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED イベントを使用します。このイベントは、再生の変更時と CastSession.getMediaSession().media の変更時にトリガーされます。

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

一時停止、再生、再開、シークなどのイベントが発生した場合、アプリはそれらを処理して、キャスト デバイス上の Web Receiver アプリ間で同期する必要があります。詳しくは、ステータスの更新をご覧ください。

セッション管理の仕組み

Cast SDK のコンセプトは、キャスト セッションのコンセプトを導入したものです。このセッションでは、デバイスへの接続、Web Receiver アプリの起動(または参加)、アプリへの接続、メディア制御チャネルの初期化のステップが組み合わされます。キャスト セッションとウェブレシーバーのライフサイクルについて詳しくは、ウェブレシーバーのアプリケーション ライフサイクル ガイドをご覧ください。

セッションは、CastContext クラスによって管理されます。アプリは cast.framework.CastContext.getInstance() を介して取得できます。個々のセッションは、Session クラスのサブクラスで表されます。たとえば、CastSession はキャスト デバイスとのセッションを表します。アプリは、CastContext.getCurrentSession() を介して現在アクティブなキャスト セッションにアクセスできます。

セッション状態をモニタリングするには、CastContextEventType.SESSION_STATE_CHANGED イベントタイプの CastContext にリスナーを追加します。

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

切断(ユーザーがキャスト ダイアログから「キャストを停止」ボタンをクリックした場合など)については、RemotePlayerEventType.IS_CONNECTED_CHANGED イベントタイプのリスナーをリスナーに追加します。リスナーで、RemotePlayer が切断されているかどうかを確認します。該当する場合は、必要に応じてローカル プレーヤーの状態を更新します。例:

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

ユーザーはフレームワークのキャスト アイコンを介してキャストの終了を直接制御できますが、送信者自体は、現在の CastSession オブジェクトを使用してキャストを停止できます。

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

ストリーミング転送

セッション状態の保持はストリーム転送の基礎であり、ユーザーは音声コマンド、Google Home アプリ、スマートディスプレイを使用して既存の音声ストリームや動画ストリームをデバイス間で移動できます。メディアは、あるデバイス(ソース)で再生を停止し、別のデバイス(宛先)で再生を続けます。最新のファームウェアを搭載したキャスト デバイスは、ストリーミング転送のソースまたは宛先として機能します。

ストリーム転送中に新しい宛先デバイスを取得するには、cast.framework.SessionState.SESSION_RESUMED イベントが呼び出されたときに CastSession#getCastDevice() を呼び出します。

詳細については、Web Receiver でのストリーム転送をご覧ください。