ตั้งแต่ Android 8.0 (ระดับ API 26) เป็นต้นไป MediaPlayer มี API ที่รองรับการเล่นเนื้อหาที่ป้องกันด้วย DRM API DRM ของ MediaPlayer มีลักษณะคล้ายกับ API ระดับต่ำที่ MediaDrm มีให้ แต่ทำงานในระดับที่สูงกว่าและไม่แสดงออบเจ็กต์ตัวแยก DRM และการเข้ารหัสที่อยู่เบื้องหลัง
แม้ว่า API DRM ของ MediaPlayer จะไม่มีฟังก์ชันการทำงานทั้งหมดของ
MediaDrm แต่ก็รองรับกรณีการใช้งานที่พบบ่อยที่สุด การใช้งานปัจจุบันสามารถจัดการเนื้อหาประเภทต่อไปนี้ได้
- ไฟล์สื่อในเครื่องที่ป้องกันด้วย Widevine
- ไฟล์สื่อระยะไกลหรือไฟล์สื่อสตรีมมิงที่ป้องกันด้วย Widevine
ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้เมธอด MediaPlayer DRM ใหม่ในการใช้งานแบบซิงโครนัส
หากต้องการจัดการสื่อที่ควบคุมด้วย DRM คุณต้องใส่เมธอดใหม่ควบคู่ไปกับโฟลว์การเรียก MediaPlayer ตามปกติ ดังที่แสดงในตัวอย่างนี้
Kotlin
mediaPlayer?.apply {
setDataSource()
setOnDrmConfigHelper() // optional, for custom configuration
prepare()
drmInfo?.also {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
// MediaPlayer is now ready to use
start()
// ...play/pause/resume...
stop()
releaseDrm()
}
Java
setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();
เริ่มต้นด้วยการเริ่มต้นออบเจ็กต์ MediaPlayer และตั้งค่าแหล่งที่มาโดยใช้
setDataSource() ตามปกติ จากนั้นทำตามขั้นตอนต่อไปนี้เพื่อใช้ DRM
- หากต้องการให้แอปทำการกำหนดค่าที่กำหนดเอง ให้กำหนดอินเทอร์เฟซ
OnDrmConfigHelperและแนบอินเทอร์เฟซดังกล่าวกับเพลเยอร์โดยใช้setOnDrmConfigHelper() - เรียก
prepare() - เรียก
getDrmInfo()หากแหล่งที่มามีเนื้อหา DRM เมธอดจะแสดงผล ค่าที่ไม่ใช่ค่า NullMediaPlayer.DrmInfo
หาก MediaPlayer.DrmInfo มีอยู่ ให้ทำดังนี้
- ตรวจสอบแผนที่ UUID ที่พร้อมใช้งานและเลือก UUID รายการใดรายการหนึ่ง
- เตรียมการกำหนดค่า DRM สำหรับแหล่งที่มาปัจจุบันโดยเรียก
prepareDrm()- หากคุณสร้างและลงทะเบียนการเรียกกลับ
OnDrmConfigHelperระบบจะเรียกการเรียกกลับนี้ขณะที่prepareDrm()กำลังทำงาน ซึ่งจะช่วยให้คุณกำหนดค่าพร็อพเพอร์ตี้ DRM ที่กำหนดเองได้ก่อนที่จะเปิดเซสชัน DRM ระบบจะเรียกการเรียกกลับแบบซิงโครนัสในเธรดที่เรียกprepareDrm()หากต้องการเข้าถึงพร็อพเพอร์ตี้ DRM ให้เรียกgetDrmPropertyString()และsetDrmPropertyString()หลีกเลี่ยงการดำเนินการที่ใช้เวลานาน - หากยังไม่ได้จัดสรรอุปกรณ์
prepareDrm()จะเข้าถึงเซิร์ฟเวอร์การจัดสรรเพื่อจัดสรรอุปกรณ์ด้วย ซึ่งอาจใช้เวลาไม่แน่นอน ขึ้นอยู่กับการเชื่อมต่อเครือข่าย
- หากคุณสร้างและลงทะเบียนการเรียกกลับ
- หากต้องการรับอาร์เรย์ไบต์คำขอคีย์แบบทึบแสงเพื่อส่งไปยังเซิร์ฟเวอร์ใบอนุญาต ให้เรียก
getKeyRequest() - หากต้องการแจ้งให้กลไก DRM ทราบเกี่ยวกับคำขอคีย์ที่ได้รับจากเซิร์ฟเวอร์ใบอนุญาต
ให้เรียก
provideKeyResponse()ผลลัพธ์จะขึ้นอยู่กับประเภทคำขอคีย์ ดังนี้- หากการตอบกลับเป็นคำขอคีย์แบบออฟไลน์ ผลลัพธ์จะเป็นตัวระบุชุดคีย์ คุณสามารถใช้ตัวระบุชุดคีย์นี้กับ
restoreKeys()เพื่อกู้คืนคีย์ไปยังเซสชันใหม่ - หากการตอบกลับเป็นคำขอสตรีมมิงหรือคำขอเผยแพร่ ผลลัพธ์จะเป็นค่า Null
- หากการตอบกลับเป็นคำขอคีย์แบบออฟไลน์ ผลลัพธ์จะเป็นตัวระบุชุดคีย์ คุณสามารถใช้ตัวระบุชุดคีย์นี้กับ
เตรียม DRM แบบอะซิงโครนัส
โดยค่าเริ่มต้น prepareDrm() จะทำงานแบบซิงโครนัส โดยจะบล็อกไว้จนกว่าการเตรียม
จะเสร็จสิ้น อย่างไรก็ตาม การเตรียม DRM ครั้งแรกในอุปกรณ์ใหม่ยังอาจต้องมีการจัดสรร ซึ่ง prepareDrm() จะจัดการภายใน และอาจใช้เวลาสักครู่ในการดำเนินการให้เสร็จสิ้นเนื่องจากมีการดำเนินการเครือข่ายที่เกี่ยวข้อง คุณสามารถหลีกเลี่ยง
การบล็อกใน prepareDrm() ได้โดยการกำหนดและตั้งค่า
MediaPlayer.OnDrmPreparedListener
ตั้งค่า OnDrmPreparedListener. prepareDrm() จะทำการจัดสรร (หากจำเป็น) และเตรียมการในเบื้องหลัง เมื่อการจัดสรรและการเตรียมการเสร็จสิ้น ระบบจะเรียก Listener อย่าตั้งสมมติฐานใดๆ เกี่ยวกับลำดับการเรียกหรือเธรดที่ Listener ทำงาน (เว้นแต่คุณจะลงทะเบียน Listener กับเธรด Handler) ระบบสามารถเรียก
Listener ก่อนหรือหลัง prepareDrm() แสดงผล
ตั้งค่า DRM แบบอะซิงโครนัส
คุณสามารถเริ่มต้น DRM แบบอะซิงโครนัสได้โดยการสร้างและลงทะเบียน
MediaPlayer.OnDrmInfoListener สำหรับการเตรียม DRM และ
MediaPlayer.OnDrmPreparedListener เพื่อเริ่มเพลเยอร์ โดย Listener เหล่านี้จะทำงานร่วมกับ prepareAsync() ดังที่แสดงในตัวอย่างนี้
Kotlin
setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
mediaPlayer.apply {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
mediaPlayer.start()
}
Java
setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {
start();
}
จัดการสื่อที่เข้ารหัส
MediaPlayer ยังสามารถถอดรหัสสื่อที่เข้ารหัสระดับตัวอย่าง Common Encryption Scheme (CENC) และ HLS (METHOD=SAMPLE-AES) สำหรับประเภทสตรีมพื้นฐาน H.264 และ AAC ได้ตั้งแต่ Android 8.0 (ระดับ API 26) เป็นต้นไป ก่อนหน้านี้ระบบรองรับสื่อที่เข้ารหัสทั้งส่วน (METHOD=AES-128)
ดูข้อมูลเพิ่มเติม
Jetpack Media3 เป็นโซลูชันที่แนะนำสำหรับการเล่นสื่อในแอป อ่าน เพิ่มเติม
หน้าเว็บเหล่านี้ครอบคลุมหัวข้อที่เกี่ยวข้องกับการบันทึก จัดเก็บ และเล่นเสียงและวิดีโอ