Google Cast:主要な概念、ストリーミングプロトコル、Cast SDK

著者: IT Sectr 公開日: 2026-04-30 読了時間: 10 分

Google Castは、Castプロトコルを介してモバイルデバイスからテレビやオーディオシステムにマルチメディアコンテンツをストリーミングするためのGoogleのテクノロジーです。SDKにより、開発者はAndroidおよびiOSアプリケーションにChromecastサポートを追加し、ビデオ、オーディオ、画像を大画面に送信できます。Google Cast Developer Documentation、2025によると、1億台以上のChromecastデバイスが世界中で販売され、Cast SDKは40,000以上のアプリケーションで使用されています。

重要なポイント

  • Google Cast — モバイルデバイスからテレビやスピーカーにコンテンツをストリーミングするためのプロトコルとSDK
  • Sender — Castデバイスにコンテンツを送信するモバイルアプリケーション
  • Receiver — テレビ(Chromecast)上でコンテンツを受信して再生するアプリケーション
  • CAF SDK — Cast Application Framework、Cast統合のための簡略化されたAPI(Google推奨)
  • Media Streams — 再生制御付きのCast経由のHLS、DASH、MP4ストリーミング

Google Castとは?

Google Castは、Googleが開発したワイヤレスマルチメディアコンテンツ伝送プロトコルで、モバイルデバイス、ラップトップ、タブレットからテレビ、スピーカー、その他の画面にストリーミングするためのものです。AirPlay(Apple)やMiracastとは異なり、Castは「URLを送信」モデル(send-to-device)を使用します。モバイルアプリがChromecastにコンテンツURLを送信し、デバイス自体が電話に負荷をかけずにストリームをロードして再生します。

ダイレクトストリーミング(スクリーンミラーリング)に対するGoogle Castの主な利点はエネルギー効率です。再生開始後、電話はリモコンとしてのみ機能します。ユーザーはアプリを最小化したり、画面をロックしたり、別のアプリに切り替えたりできますが、ビデオはテレビで再生され続けます。Google(2025)によると、Castはミラーリングソリューションと比較して電話の消費電力を80%削減します。

Google CastはChromecastだけでなく、Google TVやAndroid TVを搭載したSony、TCL、Philips、Hisenseなどのメーカーのテレビに組み込まれたCastレシーバーもサポートしています。Castはオーディオシステム(Nest Audio、Cast対応Sonos)やChromecast Audioでもサポートされています。CastプロトコルはWi-Fi(2.4/5 GHz)上で動作し、送信側と受信側が同じネットワーク上にある必要があります。

Castアーキテクチャ:Sender、Receiver、プロトコル

Google Castアーキテクチャは、Sender(モバイルアプリ)、Receiver(Chromecast/TV上のアプリ)、トランスポートプロトコルの3つのコンポーネントで構成されています。SenderはCast SDKを使用してネットワーク上のデバイスを検出し、接続を確立して再生コマンドを送信します。ReceiverはChromecastブラウザで実行されるウェブアプリケーション(HTML5 + CSS + JavaScript)で、コンテンツをロードして再生します。

Google Castプロトコルは、デバイス検出にDIAL(Discovery and Launch)、再生制御にWebSocket上の独自プロトコルに基づいています。DIALはSSDP(Simple Service Discovery Protocol)を使用してローカルネットワーク上のCastデバイスを検出します。検出後、Senderはポート8008または8009でReceiverとのWebSocket接続を確立し、JSON形式でコマンド(LOAD、PLAY、PAUSE、STOP、SEEK)を送信します。

コンポーネントプラットフォームテクノロジー
SenderAndroid / iOS / ChromeCast SDK(Java/Kotlin、Swift、JS)
Default ReceiverChromecast / Android TV組み込み(Google Cast Consoleで設定)
Custom ReceiverChromecast / Android TVウェブアプリケーション(HTML5、CAF Receiver JS)
プロトコルローカルWi-FiネットワークWebSocket + JSON + DIAL/SSDP
メディアトランスポートインターネットHLS、DASH、MP4(直接Chromecast読み込み)

再生制御のためのCastプロトコルv2

SenderはReceiverにコンテンツ自体ではなく、URL(メディアURL)とメタデータ(タイトル、画像、字幕)を送信します。ReceiverはURLから独立してコンテンツをロードするため、データ送信による電話のバッテリーを節約できます。再生開始後、SenderはCast Protocol v2を介して一時停止、巻き戻し、音量制御のコマンドを送信し、再生ステータスを受信できます。

Cast Application Framework(CAF):クイック統合

Cast Application Framework(CAF)は、2018年に導入された、モバイルアプリケーションにCastを統合するためのGoogleの簡略化されたAPIです。CAFはレガシーCast SDK(CastCompanionLibrary)を置き換え、すぐに使えるUIコンポーネントを提供します:Cast Button(デバイス検出アイコン)、Mini Controller(画面下部のミニプレーヤー)、Expanded Controller(全画面リモコン)。CAFはAndroid、iOS、Flutter、React Nativeをサポートしています。

CAFを使用するために、開発者は独自のReceiverを記述する必要はありません。Googleはコンテンツを自動的にロードして再生するDefault Receiverを提供しています。Default ReceiverはHLS、DASH、MP4、WebM、MP3、画像、字幕をサポートしています。Receiverの設定はGoogle Cast Consoleで行います。コンテンツURLを指定するだけで、Default Receiverが残りを処理します。カスタムReceiverは、カスタムTV UI、DRMサポート、再生キューなどの非標準的なシナリオでのみ必要です。

kotlin
// CAF Receiverオプションの設定
val receiverOptions = CastReceiverOptions.Builder(context)
    .setReceiverApplicationId(
        CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID
    )
    .build()

// Cast Contextの接続
val castContext = CastContext.getSharedInstance(context)
castContext.setReceiverOptions(receiverOptions)

Cast Connect:物理デバイスなしでのテスト

CAFは接続ライフサイクルを自動的に処理します:Cast Buttonによるデバイス検出、接続確立、メディア読み込み、一時的な接続損失時の一時停止、再接続。CAFはプレイリスト用の再生キュー(media queues)や、ロック画面と通知センター(Android)のCastボタンもサポートしています。最小バージョン:Android 5.0(API 21)、iOS 14+。

メディアストリーミング:ChromecastでのHLS、DASH、MP4

Google Castは主要なストリーミング形式をサポートしています:AppleのHLS(HTTP Live Streaming)、DASH(Dynamic Adaptive Streaming over HTTP)、プログレッシブMP4。Chromecastはインターネット接続速度に基づいて最適なビデオ品質を自動的に選択します(アダプティブビットレート)。HLSとDASHの場合、Chromecastは再生を停止することなくリアルタイムでストリームを切り替えます。HLSはChromecastファームウェアバージョン1.28+からサポートされています。

Google Castを介したストリーミングでは、コンテンツは公開URL(HTTP/HTTPS)でアクセス可能である必要があります。Chromecastは電話からではなく、サーバーから直接コンテンツをロードします。DRM(デジタル著作権管理)はWidevineを介してサポートされています:ChromecastはWidevine L3(すべてのデバイス)とL1(一部のモデル、例:Chromecast with Google TV)をサポートしています。DRMを使用するには、Shaka PlayerまたはExoPlayerを統合したカスタムReceiverが必要です。Googleによると、Chromecast with Google TVはNetflix、Disney+などのサービス向けにWidevine L1を備えた4K HDRをサポートしています。

kotlin
// CAFを介したChromecastへのメディア読み込み
val mediaInfo = MediaInfo.Builder(Uri.parse(videoUrl))
    .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
    .setContentType("video/mp4")
    .setMetadata(MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE)
        .putString(MediaMetadata.KEY_TITLE, title)
        .putString(MediaMetadata.KEY_SUBTITLE, subtitle))
    .build()

CastSession.RemoteMediaClient
    ?.load(mediaInfo, autoPlay = true)

字幕形式:ChromecastはTTML、WebVTT、CEA-608をサポートしています。字幕はMediaTrackを介してMediaInfoの一部として渡されます。ChromecastはCast Queue APIを介して画像間をスワイプできる非同期画像読み込み(写真)もサポートしています。オーディオについては、ChromecastはMP3、AAC、FLAC、WAV、OGGをサポートしています。Google Castを介したオーディオストリーミングはChromecast AudioとCastスピーカーでサポートされています。

Cast UIコンポーネント:Cast ButtonとMini Controller

Cast ButtonはGoogle Cast SDKの主要なUIコンポーネントで、Castアイコンを表示し、自動的に状態を変更します:非アクティブ(デバイスなし)、利用可能(デバイス検出)、接続済み(アクティブセッション)。クリックすると、Cast Buttonはデバイス選択ダイアログを開きます。このコンポーネントはMediaRouteActionProvider(Android)またはGCKUICastButton(iOS)を介して利用できます。Cast Buttonはネットワーク上にCastデバイスが利用可能な場合にのみ表示されるべきです。CAFはデバイスが見つからない場合、自動的にボタンを非表示にします。

Mini Controllerは画面下部のパネルで、コンテンツのタイトル、カバーアート、再生/一時停止ボタン、セッション終了ボタンを表示します。Mini Controllerは、Castセッションがアクティブでユーザーが再生に関係のない画面にいる場合に自動的に表示されます。CAFはレイアウトに埋め込まれるAndroid用の既製のMiniControllerFragmentを提供します。デフォルトでは、Mini Controllerは画面下部に配置されますが、任意の位置に配置できます。

kotlin
// スタイルによるMini Controllerのカスタマイズ
// styles.xml
// <style name="CastMiniControllerStyle"
//     parent="Theme.GoogleCast">
//     <item name="castMiniBackgroundColor">#FF0000</item>
//     <item name="castShowImageThumbnail">true</item>
// </style>

// Mini Controllerのプログラム制御
val miniController = findViewById<MiniControllerFragment>(
    R.id.miniController
)
miniController.setVisibility(
    isCastSessionActive()
)

Expanded Controllerは、Mini Controllerをクリックして開く、テレビ上の全画面再生コントロールです。Expanded Controllerは以下を表示します:タイトル、説明、カバーアート、シーク可能なプログレスバー、再生/一時停止/停止ボタン、トラックリスト(キューイングされている場合)、音量調節、切断ボタン。CAFは自動的に起動する既製のExpandedControllerActivityを提供します。カスタムUIが必要な場合は、ベースのExpandedControllerActivityを拡張してください。

カスタムReceiver:テレビ上での独自インターフェース

カスタムReceiverは、Castセッション開始時にChromecastに読み込まれるウェブアプリケーション(HTML5 + CSS + JavaScript)です。Default Receiverとは異なり、カスタムReceiverはテレビ上のコンテンツの外観を完全に制御できます:背景画像、アニメーション、カスタムコントロール、ブランドロゴ。カスタムReceiverはGoogle Cast Consoleに登録され、一意のアプリケーションIDを取得します。

カスタムReceiverの開発は、Cast Receiver Framework(CAF Receiver)を使用してJavaScriptで行われます。CAF Receiverは、Senderからの受信メッセージの処理、メディアストリームの管理、キューの処理、DRMとの統合のためのAPIを提供します。ReceiverはChromecast(WebKit)上の隔離されたブラウザ環境で実行され、DOMアクセスは制限されています。最小要件:HTML5、CSS3、JavaScript ES6。ReceiverはHTTPSサーバーでホストされます。

js
// CAFの基本カスタムReceiver
const context = cast.framework.CastReceiverContext.getInstance()
const playerManager = context.getPlayerManager()

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    (loadData) => {
        // メディア読み込みのカスタム処理
        console.log("Loading media:", loadData.media.contentId)
        return loadData
    }
)

context.start()

// Senderからのカスタムメッセージ処理
context.addCustomMessageListener("urn:x-cast:custom", (event) => {
    console.log("Custom data:", event.data)
})

カスタムReceiverの開発とデプロイ

カスタムReceiverは、Cast Developer Consoleを介して実際のデバイスでテストする必要があります。Googleは標準的なシナリオにはDefault Receiverを使用し、カスタムReceiverはカスタムTV UI、DRMサポート(Widevine)、またはカスタムロジックを使用した再生キューが必要な場合にのみ使用することを推奨しています。ReceiverはSenderページのDOMにアクセスできず、Senderから送信されたJavaScriptを実行できません(セキュリティ)。

コード例:AndroidでのGoogle Cast統合

CAFを使用したAndroidアプリケーションへのGoogle Cast統合の完全な例。アプリはビデオを再生し、Cast Buttonを介してChromecastにストリーミングできます。コードには、CastOptionsの構成、CastContextの初期化、接続処理、Castデバイスへのメディア読み込みが含まれています。

kotlin
class CastPlayerActivity : AppCompatActivity() {

    private lateinit var castContext: CastContext

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setupCast()
        setContentView(R.layout.activity_player)
    }

    private fun setupCast() {
        CastOptions.Builder()
            .setReceiverApplicationId(
                CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID
            )
            .build()
            .let {
                castContext = CastContext.getSharedInstance(this)
            }
    }

    fun castVideo(videoUrl: String, title: String) {
        val mediaInfo = MediaInfo.Builder(Uri.parse(videoUrl))
            .setContentType("video/mp4")
            .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
            .setMetadata(MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE)
                .putString(MediaMetadata.KEY_TITLE, title))
            .build()

        castContext.sessionManager.getCurrentCastSession()
            ?.remoteMediaClient
            ?.load(mediaInfo)
    }
}

Google Castをテストするには、Chrome DevTools(Castタブ)または物理的なChromecastを介して仮想Castデバイスを使用します。Googleはテスト用アプリケーションID — CC1AD845(Default Media Receiver)を提供しています。公開前に、Google Cast Consoleでアプリケーションを登録し、プロダクションアプリケーションIDを取得してください。Cast SDKにはGoogle Play Services 21.0.0+とAndroid 5.0+が必要です。

一般的な問題とCastデバッグ

最初の一般的な問題 — Cast Buttonが表示されない。原因:デバイスが同じWi-Fiネットワーク上にない、ChromecastがDIALをサポートしていない(古いファームウェア)、または電話でWi-Fi検出が無効になっている。解決策:電話とChromecastが同じネットワーク(2.4 GHzまたは5 GHz)に接続されていることを確認してください。Google CastはゲストWi-Fiネットワーク、VPN、またはクライアント分離がある企業ネットワークでは機能しません。物理デバイスなしでテストするにはCast Connectを使用してください。

2番目の問題 — 再生中に接続が切れる。Chromecastは、弱い信号、チャネルの混雑、または電子レンジ(2.4 GHz)からの干渉によりWi-Fi接続を失う可能性があります。解決策:Chromecastをルーターの近くに配置し、5 GHz(サポートされている場合)を使用し、ChromecastトラフィックのQoSを設定してください。アプリケーションでは、IDLE状態とエラー理由でonRemoteMediaPlayerStatusUpdatedコールバックを処理し、接続損失時に通知を表示して再接続を提案してください。

3番目の問題 — コンテンツがChromecastで再生されない。確認事項:コンテンツURLがインターネットからアクセス可能である(Chromecastは電話を介さずに直接コンテンツをロードする)、形式がChromecastでサポートされている、CORSブロック(.m3u8および.mpd用)がない。Default Receiverを使用している場合は、アプリケーションIDが正しいことを確認してください。カスタムReceiverの場合は、アプリケーションがHTTPSでホストされていることを確認してください。デバッグにはCast SDK Loggerを使用します:CastContext.getSharedInstance().setCastLogger(...)

よくある質問

Google CastはAirPlayやMiracastとどう違いますか?

Google Castは「URLを送信」モデルを使用します。電話がChromecastにコンテンツリンクを送信し、直接読み込まれます。AirPlay(Apple)はAppleエコシステム向けの同様のプロトコルです。Miracastは電話に負荷をかける直接的な画面ミラーリングです。Castは電話のバッテリー消費を80%削減し、再生を停止せずにアプリを最小化できます。

Google Castを使用するにはChromecastが必要ですか?

Google CastはChromecastだけでなく、Google TVやAndroid TVを内蔵したテレビ、Cast対応のオーディオシステム(Nest Audio、Sonos)でも動作します。開発とテストには、Chrome DevToolsを介して仮想Castデバイスを使用できます。アプリへのCast統合には物理デバイスは必要ありません。エミュレーションにはCast Connectを使用してください。

Google Castは4KとHDRをサポートしていますか?

はい、Chromecast with Google TV(2020)以降のモデルは、Dolby Vision、HDR10、HDR10+を備えた4K HDRをサポートしています。標準のChromecast(第3世代)は1080p 60fpsをサポートしています。Chromecast Ultraは4K HDRをサポートしています。4Kストリーミングには、少なくとも25 Mbpsのインターネット速度とDRMコンテンツ(Netflix、Disney+)用のWidevine L1サポートが必要です。

プログラムでCastセッションを停止するには?

セッションを停止するには、テレビの再生を停止する必要がある場合はtrueを、単に電話を切断する場合はfalseを指定してCastSession.endSession(boolean stopCasting)を呼び出します。RemoteMediaClientのstop()メソッドを使用することもできます。ユーザーはCast ButtonまたはMini Controllerの切断ボタンを押してセッションを停止することもできます。

Google Castを介してカスタムデータを送信できますか?

はい、カスタムメッセージを介して可能です。Senderは名前空間(例:urn:x-cast:custom.namespace)を介して任意のJSONオブジェクトを含むメッセージを送信します。ReceiverはaddCustomMessageListenerを介してメッセージを処理します。カスタムメッセージはカスタムReceiverでのみサポートされています。Default Receiverはカスタム名前空間を処理しません。最大メッセージサイズは64 KBです。

まとめ

  • Google Cast — ChromecastとAndroid TVを介してモバイルデバイスからテレビにコンテンツをストリーミングするプロトコル
  • アーキテクチャ — Sender(アプリ)がコンテンツURLを送信し、Receiver(Chromecast)がロードして再生
  • CAF SDK — 既製のCast Button、Mini Controller、Expanded Controllerコンポーネントを備えたCast Application Framework
  • 形式 — HLS、DASH、MP4、WebM、MP3、AAC、FLAC(アダプティブビットレートと字幕対応)
  • Default Receiver — テレビ側のコードを記述せずに迅速に統合できるGoogleの組み込みレシーバー
  • カスタムReceiver — テレビ上のインターフェースとDRMをカスタマイズするためのHTML5/JSのウェブアプリケーション
  • デバッグ — Wi-Fiネットワーク、コンテンツURL、形式のサポートを確認。Cast SDK Loggerを使用

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください