Google Cast — فناوری از Google برای استریم محتوای چندرسانهای از دستگاههای موبایل به تلویزیونها و سیستمهای صوتی از طریق پروتکل Cast است. SDK به توسعهدهندگان امکان افزودن پشتیبانی از Chromecast را در برنامههای Android و iOS، با ارسال ویدئو، صدا و تصاویر به صفحههای بزرگ میدهد. طبق مستندات توسعهدهندگان Google Cast، 2025، بیش از ۱۰۰ میلیون دستگاه Chromecast در سراسر جهان فروخته شده است و Cast SDK در بیش از ۴۰٬۰۰۰ برنامه استفاده میشود.
نکات اصلی
Google Cast — پروتکل انتقال بیسیم محتوای چندرسانهای است که توسط Google برای استریم از دستگاههای موبایل، لپتاپها و تبلتها به تلویزیونها، بلندگوها و سایر صفحهها توسعه یافته است. بر خلاف AirPlay (Apple) یا Miracast، Cast از مدل «ارسال URL» (send-to-device) استفاده میکند: برنامه موبایل URL محتوا را به Chromecast ارسال میکند و دستگاه خود جریان را بارگذاری و پخش میکند، بدون اینکه تلفن را تحت فشار قرار دهد.
مزیت کلیدی Google Cast نسبت به استریمینگ مستقیم (screen mirroring) — بهرهوری انرژی است. پس از شروع پخش، تلفن فقط به عنوان کنترل از راه دور عمل میکند: کاربر میتواند برنامه را کوچک کند، صفحه را قفل کند یا به برنامه دیگری برود — ویدئو همچنان روی تلویزیون پخش میشود. طبق Google (2025)، Cast ۸۰٪ انرژی کمتری در تلفن نسبت به راهحلهای mirroring مصرف میکند.
Google Cast نه تنها از Chromecast، بلکه از گیرندههای Cast داخلی در تلویزیونهای Sony، TCL، Philips، Hisense و سایر تولیدکنندگان با Google TV یا Android TV پشتیبانی میکند. همچنین Cast در سیستمهای صوتی (Nest Audio، Sonos با Cast) و Chromecast Audio پشتیبانی میشود. پروتکل Cast از طریق Wi-Fi (2.4/5 GHz) کار میکند و نیاز دارد دستگاه فرستنده و گیرنده در یک شبکه باشند.
معماری Google Cast از سه مؤلفه تشکیل شده است: Sender (برنامه موبایل)، Receiver (برنامه روی Chromecast/تلویزیون) و پروتکل انتقال. Sender از Cast SDK برای کشف دستگاهها در شبکه، برقراری ارتباط و ارسال دستورات پخش استفاده میکند. Receiver یک برنامه وب (HTML5 + CSS + JavaScript) است که در مرورگر Chromecast اجرا میشود و محتوا را بارگذاری و پخش میکند.
پروتکل Google Cast مبتنی بر DIAL (Discovery and Launch) برای کشف دستگاهها و پروتکل اختصاصی روی WebSocket برای کنترل پخش است. DIAL از SSDP (Simple Service Discovery Protocol) برای جستجوی دستگاههای Cast در شبکه محلی استفاده میکند. پس از کشف، Sender یک اتصال WebSocket با Receiver از طریق پورت 8008 یا 8009 برقرار کرده و دستورات را در قالب 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 (media URL) و فراداده (نام، تصویر، زیرنویس) را ارسال میکند. Receiver به طور مستقل محتوا را از طریق URL بارگذاری میکند، که به تلفن اجازه میدهد باتری را برای انتقال داده هدر ندهد. پس از شروع پخش، Sender میتواند دستورات مکث، عقبکشی، تنظیم صدا را ارسال کرده و وضعیت پخش را از طریق Cast Protocol v2 دریافت کند.
Cast Application Framework (CAF) — یک API سادهشده از Google برای یکپارچهسازی Cast در برنامههای موبایل است که در سال ۲۰۱۸ معرفی شد. CAF جایگزین Cast SDK قدیمی (CastCompanionLibrary) میشود و اجزای آماده رابط کاربری را ارائه میدهد: 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 سفارشی فقط برای سناریوهای غیراستاندارد مورد نیاز است: رابط کاربری سفارشی روی تلویزیون، پشتیبانی از 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) برای لیستهای پخش و دکمه «Cast» در صفحه قفل و مرکز اعلانها (Android) پشتیبانی میکند. حداقل نسخه: Android 5.0 (API 21)، iOS 14+.
Google Cast از فرمتهای اصلی استریمینگ پشتیبانی میکند: HLS (HTTP Live Streaming) از Apple، DASH (Dynamic Adaptive Streaming over HTTP) و MP4 پیشرونده. Chromecast به طور خودکار کیفیت بهینه ویدئو را بر اساس سرعت اتصال اینترنت انتخاب میکند (adaptive bitrate). برای HLS و DASH، Chromecast جریانها را در زمان واقعی بدون توقف پخش تغییر میدهد. HLS از نسخه سفتافزار Chromecast 1.28+ پشتیبانی میشود.
برای استریمینگ از طریق Google Cast، محتوا باید از طریق URL عمومی (HTTP/HTTPS) قابل دسترسی باشد — Chromecast محتوا را مستقیماً از سرور بارگذاری میکند، نه از تلفن. DRM (Digital Rights Management) از طریق Widevine پشتیبانی میشود: Chromecast از Widevine L3 (همه دستگاهها) و L1 (برخی مدلها، مانند Chromecast with Google TV) پشتیبانی میکند. برای کار با DRM به Receiver سفارشی با یکپارچهسازی Shaka Player یا ExoPlayer نیاز است. طبق Google، Chromecast with Google TV از 4K HDR با Widevine L1 برای Netflix، Disney+ و سایر سرویسها پشتیبانی میکند.
// بارگذاری رسانه در Chromecast از طریق CAF
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 پشتیبانی میکند. زیرنویسها به عنوان بخشی از MediaInfo از طریق MediaTrack ارسال میشوند. Chromecast همچنین از بارگذاری ناهمگام تصاویر (عکس) با قابلیت سوایپ بین تصاویر از طریق Cast Queue API پشتیبانی میکند. برای صدا، Chromecast از MP3، AAC، FLAC، WAV و OGG پشتیبانی میکند. استریمینگ صدا از طریق Google Cast در Chromecast Audio و بلندگوهای Cast پشتیبانی میشود.
Cast Button — مؤلفه کلیدی رابط کاربری Google Cast SDK است که آیکون Cast را نمایش میدهد و به طور خودکار وضعیت را تغییر میدهد: غیرفعال (دستگاهی وجود ندارد)، در دسترس (دستگاهها پیدا شدند)، متصل (جلسه فعال). با کلیک روی Cast Button، دیالوگ انتخاب دستگاه باز میشود. این مؤلفه از طریق MediaRouteActionProvider (Android) یا GCKUICastButton (iOS) در دسترس است. Cast Button فقط زمانی باید قابل مشاهده باشد که دستگاههای Cast در شبکه در دسترس هستند — CAF به طور خودکار دکمه را در صورت عدم وجود دستگاه مخفی میکند.
Mini Controller — پنلی در پایین صفحه که نام محتوا، جلد، دکمههای پخش/مکث و بستن جلسه را نمایش میدهد. Mini Controller به طور خودکار زمانی که جلسه Cast فعال است و کاربر در صفحهای غیر از صفحه پخش قرار دارد ظاهر میشود. CAF یک MiniControllerFragment آماده برای Android ارائه میدهد که در layout جاسازی میشود. به طور پیشفرض، 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 آماده ارائه میدهد که به طور خودکار اجرا میشود. اگر به رابط کاربری سفارشی نیاز دارید — کلاس پایه ExpandedControllerActivity را گسترش دهید.
Receiver سفارشی — یک برنامه وب (HTML5 + CSS + JavaScript) است که در زمان شروع جلسه Cast روی Chromecast بارگذاری میشود. بر خلاف Default Receiver، Receiver سفارشی به شما امکان میدهد ظاهر محتوا روی تلویزیون را به طور کامل کنترل کنید: تصاویر پسزمینه، انیمیشنها، عناصر کنترل سفارشی، لوگوی برند. Receiver سفارشی در Google Cast Console ثبت میشود و یک Application ID منحصر به فرد دریافت میکند.
توسعه Receiver سفارشی با استفاده از JavaScript و Cast Receiver Framework (CAF Receiver) انجام میشود. CAF Receiver API برای پردازش پیامهای ورودی از Sender، مدیریت جریان رسانه، پردازش صفها و یکپارچهسازی با DRM ارائه میدهد. Receiver در محیط مرورگر ایزوله Chromecast (WebKit) با دسترسی محدود به DOM اجرا میشود. حداقل نیازمندیها: HTML5، CSS3، JavaScript ES6. Receiver روی سرور HTTPS میزبانی میشود.
// Receiver سفارشی پایه روی CAF
const context = cast.framework.CastReceiverContext.getInstance()
const playerManager = context.getPlayerManager()
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
(loadData) => {
// پردازش سفارشی بارگذاری رسانه
console.log("در حال بارگذاری رسانه:", loadData.media.contentId)
return loadData
}
)
context.start()
// پردازش پیامهای سفارشی از Sender
context.addCustomMessageListener("urn:x-cast:custom", (event) => {
console.log("داده سفارشی:", event.data)
})Receiver سفارشی باید روی یک دستگاه واقعی از طریق Cast Developer Console تست شود. Google توصیه میکند از Default Receiver برای سناریوهای استاندارد و از Receiver سفارشی فقط در صورت نیاز به رابط کاربری سفارشی روی تلویزیون، پشتیبانی از DRM (Widevine) یا صفهای پخش با منطق سفارشی استفاده کنید. Receiver به DOM صفحه Sender دسترسی ندارد و نمیتواند JavaScript ارسال شده از Sender را اجرا کند (امنیت).
نمونه کامل یکپارچهسازی Google Cast در برنامه Android با استفاده از CAF. برنامه ویدئو را پخش میکند و امکان استریم آن به Chromecast از طریق Cast Button را فراهم میکند. کد شامل تنظیم 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 از دستگاه Cast مجازی از طریق Chrome DevTools (تب Cast) یا Chromecast فیزیکی استفاده کنید. Google یک Application ID تست — CC1AD845 (Default Media Receiver) ارائه میدهد. قبل از انتشار، برنامه خود را در Google Cast Console ثبت کنید و Production Application 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 ممکن است اتصال Wi-Fi را به دلیل سیگنال ضعیف، ازدحام کانال یا تداخل مایکروویو (2.4 GHz) از دست بدهد. راهحل: Chromecast را نزدیکتر به روتر قرار دهید، از 5 GHz استفاده کنید (در صورت پشتیبانی)، QoS را برای ترافیک Chromecast تنظیم کنید. در برنامه، callback onRemoteMediaPlayerStatusUpdated با وضعیت IDLE و دلیل خطا را مدیریت کنید — در صورت قطع اتصال، اعلان نشان داده و پیشنهاد اتصال مجدد دهید.
سومین مشکل — محتوا در Chromecast پخش نمیشود. بررسی کنید: URL محتوا از اینترنت قابل دسترسی است (Chromecast محتوا را مستقیماً بارگذاری میکند، نه از طریق تلفن)، فرمت توسط Chromecast پشتیبانی میشود، هیچ مسدودیتی توسط CORS وجود ندارد (برای .m3u8 و .mpd). اگر از Default Receiver استفاده میکنید، مطمئن شوید Application ID صحیح است. برای Receiver سفارشی، بررسی کنید برنامه روی HTTPS میزبانی میشود. از Cast SDK Logger برای رفع اشکال استفاده کنید: CastContext.getSharedInstance().setCastLogger(...).
سوالات متداول
Google Cast از مدل «ارسال URL» استفاده میکند — تلفن لینک محتوا را به Chromecast ارسال میکند که به طور مستقیم بارگذاری میشود. AirPlay (Apple) — پروتکل مشابه برای اکوسیستم Apple. Miracast — انتقال مستقیم صفحه (screen mirroring) که تلفن را تحت فشار قرار میدهد. Cast ۸۰٪ انرژی کمتری از تلفن مصرف میکند و امکان کوچک کردن برنامه بدون توقف پخش را فراهم میکند.
Google Cast نه تنها روی Chromecast، بلکه روی تلویزیونهای دارای Google TV داخلی، Android TV و همچنین سیستمهای صوتی با پشتیبانی از Cast (Nest Audio، Sonos) کار میکند. برای توسعه و تست میتوانید از دستگاه Cast مجازی از طریق Chrome DevTools استفاده کنید. برای یکپارچهسازی Cast در برنامه، دستگاه فیزیکی الزامی نیست — از Cast Connect برای شبیهسازی استفاده کنید.
بله، Chromecast with Google TV (2020) و مدلهای جدیدتر از 4K HDR با Dolby Vision، HDR10 و HDR10+ پشتیبانی میکنند. Chromecast استاندارد (نسل سوم) از 1080p 60fps پشتیبانی میکند. Chromecast Ultra — 4K HDR. برای استریم 4K به سرعت اینترنت حداقل 25 Mbps و پشتیبانی از Widevine L1 برای محتوای DRM (Netflix، Disney+) نیاز است.
برای توقف جلسه، CastSession.endSession(boolean stopCasting) را با پارامتر true فراخوانی کنید اگر نیاز به توقف پخش روی تلویزیون دارید، یا false اگر فقط میخواهید تلفن را قطع کنید. همچنین میتوانید از متد stop() روی RemoteMediaClient استفاده کنید. کاربر همچنین میتواند جلسه را از طریق Cast Button یا Mini Controller با کلیک روی دکمه قطع اتصال متوقف کند.
بله، از طریق پیامهای سفارشی (custom messages). Sender پیام را از طریق namespace (مثلاً urn:x-cast:custom.namespace) با یک شی JSON دلخواه ارسال میکند. Receiver پیام را از طریق addCustomMessageListener پردازش میکند. پیامهای سفارشی فقط با Receiver سفارشی پشتیبانی میشوند — Default Receiver namespaceهای سفارشی را پردازش نمیکند. حداکثر اندازه پیام — 64 KB.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید