Google Cast เป็นเทคโนโลยีจาก Google สำหรับสตรีมเนื้อหามัลติมีเดียจากอุปกรณ์มือถือไปยังทีวีและระบบเสียงผ่านโปรโตคอล Cast SDK ช่วยให้นักพัฒนาสามารถเพิ่มการรองรับ Chromecast ในแอปพลิเคชัน Android และ iOS ส่งวิดีโอ เสียง และรูปภาพไปยังหน้าจอขนาดใหญ่ ตามข้อมูลจาก Google Cast Developer Documentation, 2025 มีการขายอุปกรณ์ Chromecast มากกว่า 100 ล้านเครื่องทั่วโลก และ Cast SDK ถูกใช้ในแอปพลิเคชันกว่า 40,000+ รายการ
ประเด็นสำคัญ
Google Cast เป็นโปรโตคอลการส่งเนื้อหามัลติมีเดียแบบไร้สายที่พัฒนาโดย Google สำหรับสตรีมจากอุปกรณ์มือถือ แล็ปท็อปและแท็บเล็ตไปยังทีวี ลำโพงและหน้าจออื่นๆ ต่างจาก AirPlay (Apple) หรือ Miracast ตรงที่ Cast ใช้โมเดล “ส่ง URL” (send-to-device): แอปมือถือส่ง URL เนื้อหาไปยัง Chromecast และอุปกรณ์จะโหลดและเล่นสตรีมด้วยตัวเองโดยไม่ทำให้โทรศัพท์ทำงานหนัก
ข้อได้เปรียบหลักของ Google Cast เหนือการสตรีมโดยตรง (screen mirroring) คือประสิทธิภาพการใช้พลังงาน หลังจากเริ่มเล่น โทรศัพท์จะทำหน้าที่เป็นรีโมทคอนโทรลเท่านั้น: ผู้ใช้สามารถย่อแอป ล็อคหน้าจอ หรือสลับไปยังแอปอื่น — วิดีโอยังคงเล่นบนทีวีต่อไป ตามข้อมูลจาก Google (2025) Cast ใช้พลังงานบนโทรศัพท์น้อยกว่า 80% เมื่อเทียบกับโซลูชัน mirroring
Google Cast รองรับไม่เพียงแค่ Chromecast แต่ยังรองรับตัวรับ Cast ในตัวในทีวีจาก Sony, TCL, Philips, Hisense และผู้ผลิตรายอื่นๆ ที่มี Google TV หรือ Android TV อีกทั้งยังรองรับในระบบเสียง (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 (URL มีเดีย) และเมตาดาต้า (ชื่อเรื่อง รูปภาพ คำบรรยาย) Receiver โหลดเนื้อหาจาก URL อย่างอิสระ ซึ่งช่วยประหยัดแบตเตอรี่ของโทรศัพท์จากการส่งข้อมูล หลังจากเริ่มเล่น Sender สามารถส่งคำสั่งหยุดชั่วคราว กรอกลับ ปรับระดับเสียง และรับสถานะการเล่นผ่าน Cast Protocol v2
Cast Application Framework (CAF) เป็น API ที่เรียบง่ายจาก Google สำหรับรวม Cast ในแอปพลิเคชันมือถือ เปิดตัวในปี 2018 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 ที่กำหนดเองจำเป็นสำหรับสถานการณ์ที่ไม่ได้มาตรฐานเท่านั้น: 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) สำหรับเพลย์ลิสต์และปุ่ม 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 เป็นส่วนประกอบ UI หลักของ Google Cast SDK ที่แสดงไอคอน 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 พร้อมใช้ที่เริ่มต้นโดยอัตโนมัติ หากต้องการ UI ที่กำหนดเอง ให้ขยาย ExpandedControllerActivity พื้นฐาน
Receiver ที่กำหนดเอง คือแอปพลิเคชันเว็บ (HTML5 + CSS + JavaScript) ที่โหลดบน Chromecast เมื่อเซสชัน Cast เริ่มต้น ต่างจาก Default Receiver ตรงที่ Receiver ที่กำหนดเองช่วยให้ควบคุมลักษณะของเนื้อหาบนทีวีได้อย่างสมบูรณ์: รูปพื้นหลัง อนิเมชั่น การควบคุมที่กำหนดเอง โลโก้แบรนด์ Receiver ที่กำหนดเองจะถูกลงทะเบียนใน Google Cast Console และได้รับ 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("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 ที่กำหนดเองเฉพาะเมื่อจำเป็นต้องมี UI ทีวีที่กำหนดเอง การรองรับ 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 มี ID แอปพลิเคชันทดสอบ — CC1AD845 (Default Media Receiver) ก่อนเผยแพร่ ให้ลงทะเบียนแอปพลิเคชันของคุณใน Google Cast Console และรับ ID แอปพลิเคชันสำหรับโปรดักชัน 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 ในแอปพลิเคชัน ให้จัดการ callback onRemoteMediaPlayerStatusUpdated ด้วยสถานะ IDLE และสาเหตุข้อผิดพลาด — เมื่อสูญเสียการเชื่อมต่อ ให้แสดงการแจ้งเตือนและเสนอให้เชื่อมต่อใหม่
ปัญหาที่สาม — เนื้อหาไม่เล่นบน 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) สำหรับการพัฒนาและทดสอบ คุณสามารถใช้อุปกรณ์ Cast เสมือนผ่าน Chrome DevTools สำหรับการรวม Cast ในแอป ไม่จำเป็นต้องใช้อุปกรณ์จริง — ใช้ Cast Connect สำหรับการจำลอง
ใช่ Chromecast with Google TV (2020) และรุ่นใหม่กว่าฮะรองรับ 4K HDR ด้วย Dolby Vision, HDR10 และ HDR10+ Chromecast มาตรฐาน (รุ่นที่ 3) รองรับ 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 สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม