Google Castは、Castプロトコルを介してモバイルデバイスからテレビやオーディオシステムにマルチメディアコンテンツをストリーミングするためのGoogleのテクノロジーです。SDKにより、開発者はAndroidおよびiOSアプリケーションにChromecastサポートを追加し、ビデオ、オーディオ、画像を大画面に送信できます。Google Cast Developer Documentation、2025によると、1億台以上のChromecastデバイスが世界中で販売され、Cast SDKは40,000以上のアプリケーションで使用されています。
重要なポイント
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)上で動作し、送信側と受信側が同じネットワーク上にある必要があります。
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)を送信します。
| コンポーネント | プラットフォーム | テクノロジー |
|---|---|---|
| Sender | Android / iOS / Chrome | Cast SDK(Java/Kotlin、Swift、JS) |
| Default Receiver | Chromecast / Android TV | 組み込み(Google Cast Consoleで設定) |
| Custom Receiver | Chromecast / Android TV | ウェブアプリケーション(HTML5、CAF Receiver JS) |
| プロトコル | ローカルWi-Fiネットワーク | WebSocket + JSON + DIAL/SSDP |
| メディアトランスポート | インターネット | HLS、DASH、MP4(直接Chromecast読み込み) |
SenderはReceiverにコンテンツ自体ではなく、URL(メディアURL)とメタデータ(タイトル、画像、字幕)を送信します。ReceiverはURLから独立してコンテンツをロードするため、データ送信による電話のバッテリーを節約できます。再生開始後、SenderはCast Protocol v2を介して一時停止、巻き戻し、音量制御のコマンドを送信し、再生ステータスを受信できます。
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サポート、再生キューなどの非標準的なシナリオでのみ必要です。
// 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)CAFは接続ライフサイクルを自動的に処理します:Cast Buttonによるデバイス検出、接続確立、メディア読み込み、一時的な接続損失時の一時停止、再接続。CAFはプレイリスト用の再生キュー(media queues)や、ロック画面と通知センター(Android)のCastボタンもサポートしています。最小バージョン:Android 5.0(API 21)、iOS 14+。
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をサポートしています。
// 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 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は画面下部に配置されますが、任意の位置に配置できます。
// スタイルによる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は、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サーバーでホストされます。
// 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は、Cast Developer Consoleを介して実際のデバイスでテストする必要があります。Googleは標準的なシナリオにはDefault Receiverを使用し、カスタムReceiverはカスタムTV UI、DRMサポート(Widevine)、またはカスタムロジックを使用した再生キューが必要な場合にのみ使用することを推奨しています。ReceiverはSenderページのDOMにアクセスできず、Senderから送信されたJavaScriptを実行できません(セキュリティ)。
CAFを使用したAndroidアプリケーションへのGoogle Cast統合の完全な例。アプリはビデオを再生し、Cast Buttonを介してChromecastにストリーミングできます。コードには、CastOptionsの構成、CastContextの初期化、接続処理、Castデバイスへのメディア読み込みが含まれています。
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 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は「URLを送信」モデルを使用します。電話がChromecastにコンテンツリンクを送信し、直接読み込まれます。AirPlay(Apple)はAppleエコシステム向けの同様のプロトコルです。Miracastは電話に負荷をかける直接的な画面ミラーリングです。Castは電話のバッテリー消費を80%削減し、再生を停止せずにアプリを最小化できます。
Google CastはChromecastだけでなく、Google TVやAndroid TVを内蔵したテレビ、Cast対応のオーディオシステム(Nest Audio、Sonos)でも動作します。開発とテストには、Chrome DevToolsを介して仮想Castデバイスを使用できます。アプリへのCast統合には物理デバイスは必要ありません。エミュレーションにはCast Connectを使用してください。
はい、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サポートが必要です。
セッションを停止するには、テレビの再生を停止する必要がある場合はtrueを、単に電話を切断する場合はfalseを指定してCastSession.endSession(boolean stopCasting)を呼び出します。RemoteMediaClientのstop()メソッドを使用することもできます。ユーザーはCast ButtonまたはMini Controllerの切断ボタンを押してセッションを停止することもできます。
はい、カスタムメッセージを介して可能です。Senderは名前空間(例:urn:x-cast:custom.namespace)を介して任意のJSONオブジェクトを含むメッセージを送信します。ReceiverはaddCustomMessageListenerを介してメッセージを処理します。カスタムメッセージはカスタムReceiverでのみサポートされています。Default Receiverはカスタム名前空間を処理しません。最大メッセージサイズは64 KBです。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。