Google Cast는 Cast 프로토콜을 통해 모바일 기기에서 TV와 오디오 시스템으로 멀티미디어 콘텐츠를 스트리밍하기 위한 Google의 기술입니다. SDK를 통해 개발자는 Android 및 iOS 애플리케이션에 Chromecast 지원을 추가하고 비디오, 오디오 및 이미지를 큰 화면으로 전송할 수 있습니다. Google Cast Developer Documentation, 2025에 따르면 전 세계적으로 1억 대 이상의 Chromecast 기기가 판매되었으며 Cast SDK는 40,000개 이상의 애플리케이션에서 사용됩니다.
핵심 요점
Google Cast는 Google이 개발한 무선 멀티미디어 콘텐츠 전송 프로토콜로, 모바일 기기, 노트북, 태블릿에서 TV, 스피커 및 기타 화면으로 스트리밍하기 위한 것입니다. AirPlay(Apple) 또는 Miracast와 달리 Cast는 'URL 보내기' 모델(send-to-device)을 사용합니다. 모바일 앱이 Chromecast에 콘텐츠 URL을 보내면 기기 자체가 전화기에 부담을 주지 않고 스트림을 로드하여 재생합니다.
다이렉트 스트리밍(화면 미러링)에 비해 Google Cast의 주요 장점은 에너지 효율성입니다. 재생이 시작된 후 전화기는 리모컨으로만 작동합니다. 사용자는 앱을 최소화하거나 화면을 잠그거나 다른 앱으로 전환할 수 있으며 비디오는 TV에서 계속 재생됩니다. Google(2025)에 따르면 Cast는 미러링 솔루션에 비해 전화기 전력 소비를 80% 줄입니다.
Google Cast는 Chromecast뿐만 아니라 Google TV 또는 Android TV가 탑재된 Sony, TCL, Philips, Hisense 및 기타 제조업체의 TV에 내장된 Cast 수신기도 지원합니다. Cast는 오디오 시스템(Nest Audio, Cast 지원 Sonos) 및 Chromecast Audio에서도 지원됩니다. Cast 프로토콜은 Wi-Fi(2.4/5 GHz)를 통해 작동하며 송신자와 수신자가 동일한 네트워크에 있어야 합니다.
Google Cast 아키텍처는 Sender(모바일 앱), Receiver(Chromecast/TV의 앱) 및 전송 프로토콜의 세 가지 구성 요소로 구성됩니다. 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는 재생 목록을 위한 재생 대기열(미디어 대기열)과 잠금 화면 및 알림 센터(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를 클릭하여 열리는 TV의 전체 화면 재생 컨트롤입니다. Expanded Controller는 다음을 표시합니다: 제목, 설명, 커버 아트, 탐색 기능이 있는 진행률 표시줄, 재생/일시 중지/중지 버튼, 트랙 목록(대기 중인 경우), 볼륨 제어 및 연결 끊기 버튼. CAF는 자동으로 실행되는 미리 만들어진 ExpandedControllerActivity를 제공합니다. 사용자 지정 UI가 필요한 경우 기본 ExpandedControllerActivity를 확장하세요.
사용자 지정 Receiver는 Cast 세션이 시작될 때 Chromecast에 로드되는 웹 애플리케이션(HTML5 + CSS + JavaScript)입니다. Default Receiver와 달리 사용자 지정 Receiver는 TV에서 콘텐츠 모양을 완전히 제어할 수 있습니다: 배경 이미지, 애니메이션, 사용자 지정 컨트롤, 브랜드 로고. 사용자 지정 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를 사용하고 사용자 지정 TV UI, DRM 지원(Widevine) 또는 사용자 지정 로직이 있는 재생 대기열이 필요한 경우에만 사용자 지정 Receiver를 사용할 것을 권장합니다. 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를 사용하세요.
두 번째 문제 — 재생 중 연결 끊김. Chromecast는 약한 신호, 채널 혼잡 또는 전자레인지(2.4 GHz)의 간섭으로 인해 Wi-Fi 연결을 잃을 수 있습니다. 해결책: Chromecast를 라우터 가까이에 두고, 5 GHz(지원되는 경우)를 사용하며, Chromecast 트래픽에 대한 QoS를 구성하세요. 애플리케이션에서 IDLE 상태 및 오류 이유로 onRemoteMediaPlayerStatusUpdated 콜백을 처리하고 연결 끊김 시 알림을 표시하고 다시 연결을 제안하세요.
세 번째 문제 — 콘텐츠가 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가 내장된 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 스트리밍에는 최소 25Mbps의 인터넷 속도와 DRM 콘텐츠(Netflix, Disney+)를 위한 Widevine L1 지원이 필요합니다.
세션을 중지하려면 TV에서 재생을 중지해야 하는 경우 true를, 전화기만 연결 해제하려는 경우 false를 사용하여 CastSession.endSession(boolean stopCasting)을 호출하세요. RemoteMediaClient에서 stop() 메서드를 사용할 수도 있습니다. 사용자는 Cast Button 또는 Mini Controller에서 연결 끊기 버튼을 눌러 세션을 중지할 수도 있습니다.
네, 사용자 지정 메시지(커스텀 메시지)를 통해 가능합니다. Sender는 네임스페이스(예: urn:x-cast:custom.namespace)를 통해 임의의 JSON 객체가 포함된 메시지를 보냅니다. Receiver는 addCustomMessageListener를 통해 메시지를 처리합니다. 사용자 지정 메시지는 사용자 지정 Receiver에서만 지원됩니다. Default Receiver는 사용자 지정 네임스페이스를 처리하지 않습니다. 최대 메시지 크기는 64KB입니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.