Google Cast هي تقنية من Google لبث المحتوى الوسائط المتعددة من الأجهزة المحمولة إلى أجهزة التلفزيون وأنظمة الصوت عبر بروتوكول Cast. يسمح SDK للمطورين بإضافة دعم Chromecast إلى تطبيقات Android و iOS، وإرسال الفيديو والصوت والصور إلى الشاشات الكبيرة. وفقًا لـ Google Cast Developer Documentation, 2025، تم بيع أكثر من 100 مليون جهاز Chromecast في جميع أنحاء العالم، ويُستخدم Cast SDK في أكثر من 40,000 تطبيق.
الخلاصة
Google Cast هو بروتوكول نقل محتوى وسائط متعددة لاسلكي طورته Google للبث من الأجهزة المحمولة وأجهزة الكمبيوتر المحمولة والأجهزة اللوحية إلى أجهزة التلفزيون ومكبرات الصوت والشاشات الأخرى. على عكس AirPlay (Apple) أو Miracast، يستخدم Cast نموذج «إرسال URL» (send-to-device): يرسل التطبيق المحمول رابط المحتوى إلى Chromecast، ويقوم الجهاز نفسه بتحميل البث وتشغيله دون إثقال الهاتف.
الميزة الرئيسية لـ Google Cast مقارنة بالبث المباشر (screen mirroring) هي كفاءة الطاقة. بعد بدء التشغيل، يعمل الهاتف فقط كجهاز تحكم عن بعد: يمكن للمستخدم تصغير التطبيق أو قفل الشاشة أو التبديل إلى تطبيق آخر — يستمر الفيديو في التشغيل على التلفزيون. وفقًا لـ Google (2025)، يستهلك Cast طاقة أقل بنسبة 80% على الهاتف مقارنة بحلول 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 SDK Cast لاكتشاف الأجهزة على الشبكة وإنشاء الاتصال وإرسال أوامر التشغيل. 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 (رابط الوسائط) والبيانات الوصفية (العنوان والصورة والترجمة). يقوم Receiver بتحميل المحتوى بشكل مستقل من الرابط، مما يوفر بطارية الهاتف من نقل البيانات. بعد بدء التشغيل، يمكن لـ Sender إرسال أوامر الإيقاف المؤقت والتراجع والتحكم في مستوى الصوت واستلام حالة التشغيل عبر Cast Protocol v2.
Cast Application Framework (CAF) هي واجهة برمجة تطبيقات مبسطة من Google لدمج Cast في التطبيقات المحمولة، تم تقديمها في 2018. يحل CAF محل SDK Cast القديم (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 —只需 تحديد رابط المحتوى، وسيتولى DefaultReceiver الباقي. 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 تلقائيًا جودة الفيديو المثلى بناءً على سرعة اتصال الإنترنت (معدل البت التكيفي). بالنسبة لـ HLS و DASH، يبدل Chromecast التدفقات في الوقت الفعلي دون إيقاف التشغيل. HLS مدعوم من إصدار البرنامج الثابت Chromecast 1.28+.
للبث عبر Google Cast، يجب أن يكون المحتوى متاحًا عبر رابط عام (HTTP/HTTPS) — يقوم Chromecast بتحميل المحتوى مباشرة من الخادم، وليس من الهاتف. DRM (إدارة الحقوق الرقمية) مدعوم عبر 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 هو مكون رئيسي لواجهة مستخدم SDK Google Cast يعرض أيقونة Cast ويغير حالته تلقائيًا: غير نشط (لا توجد أجهزة)، متاح (تم العثور على أجهزة)، متصل (جلسة نشطة). عند النقر على Cast Button، يفتح حوار اختيار الجهاز. المكون متاح عبر MediaRouteActionProvider (Android) أو GCKUICastButton (iOS). يجب أن يكون زر Cast مرئيًا فقط عندما تكون أجهزة Cast متاحة على الشبكة — يخفي CAF الزر تلقائيًا إذا لم يتم العثور على أجهزة.
Mini Controller هو لوحة في أسفل الشاشة تعرض عنوان المحتوى وصورته المصغرة وأزرار التشغيل/الإيقاف المؤقت وزر إغلاق الجلسة. يظهر Mini Controller تلقائيًا عندما تكون جلسة Cast نشطة والمستخدم على شاشة غير مرتبطة بالتشغيل. يوفر CAF MiniControllerFragment جاهزًا لـ Android يتم تضمينه في التخطيط. افتراضيًا، يكون 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 الأساسية.
المستقبل المخصص هو تطبيق ويب (HTML5 + CSS + JavaScript) يتم تحميله على Chromecast عند بدء جلسة Cast. على عكس Default Receiver، يسمح المستقبل المخصص بالتحكم الكامل في مظهر المحتوى على التلفزيون: صور الخلفية والرسوم المتحركة وعناصر التحكم المخصصة وشعار العلامة التجارية. يتم تسجيل المستقبل المخصص في Google Cast Console ويحصل على معرف تطبيق فريد.
يتم تطوير المستقبل المخصص باستخدام 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("Loading media:", loadData.media.contentId)
return loadData
}
)
context.start()
// معالجة الرسائل المخصصة من Sender
context.addCustomMessageListener("urn:x-cast:custom", (event) => {
console.log("Custom data:", event.data)
})يجب اختبار المستقبل المخصص على جهاز حقيقي عبر Cast Developer Console. توصي Google باستخدام Default Receiver للسيناريوهات القياسية والمستقبل المخصص فقط عند الحاجة إلى واجهة مستخدم مخصصة على التلفزيون أو دعم DRM (Widevine) أو قوائم تشغيل بمنطق مخصص. Receiver ليس لديه إمكانية الوصول إلى DOM لصفحة Sender ولا يمكنه تنفيذ JavaScript مرسل من Sender (لأسباب أمنية).
مثال كامل لدمج Google Cast في تطبيق Android باستخدام CAF. يقوم التطبيق بتشغيل الفيديو ويسمح ببثه إلى Chromecast عبر زر Cast. يتضمن الكود تكوين 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 معرف تطبيق اختبار — CC1AD845 (Default Media Receiver). قبل النشر، سجل تطبيقك في Google Cast Console واحصل على معرف تطبيق إنتاج. يتطلب Cast SDK Google Play Services 21.0.0+ و Android 5.0+.
المشكلة الأولى الشائعة — زر Cast لا يظهر. الأسباب: الأجهزة ليست على نفس شبكة 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. في التطبيق، تعامل مع رد الاتصال onRemoteMediaPlayerStatusUpdated بحالة IDLE وسبب الخطأ — عند فقدان الاتصال، اعرض إشعارًا واقترح إعادة الاتصال.
المشكلة الثالثة — المحتوى لا يعمل على Chromecast. تحقق من: رابط المحتوى متاح من الإنترنت (Chromecast يحمل المحتوى مباشرة وليس عبر الهاتف)، والتنسيق مدعوم من Chromecast، ولا يوجد حظر CORS (لـ .m3u8 و .mpd). إذا كنت تستخدم Default Receiver، تأكد من أن معرف التطبيق صحيح. للمستقبل المخصص، تحقق من أن التطبيق مستضاف على HTTPS. استخدم Cast SDK Logger لتصحيح الأخطاء: CastContext.getSharedInstance().setCastLogger(...).
الأسئلة الشائعة
Google Cast يستخدم نموذج «إرسال URL» — يرسل الهاتف إلى Chromecast رابط المحتوى الذي يتم تحميله مباشرة. AirPlay (Apple) هو بروتوكول مشابه لنظام Apple البيئي. Miracast هو عكس شاشة مباشر (screen mirroring) يثقل الهاتف. يستهلك Cast طاقة بطارية هاتف أقل بنسبة 80% ويسمح بتصغير التطبيق دون إيقاف التشغيل.
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 أو Mini Controller بالضغط على زر قطع الاتصال.
نعم، عبر الرسائل المخصصة (custom messages). يرسل Sender رسالة عبر namespace (مثل urn:x-cast:custom.namespace) مع كائن JSON عشوائي. يعالج Receiver الرسالة عبر addCustomMessageListener. الرسائل المخصصة مدعومة فقط مع Receiver مخصص — Default Receiver لا يعالج namespaces المخصصة. الحد الأقصى لحجم الرسالة هو 64 كيلوبايت.
ملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا