ตั้งแต่ Android 8.0 (API ระดับ 26) เป็นต้นไป MediaPlayer
จะมี API ที่รองรับการเล่นเนื้อหาที่มีการป้องกัน DRM MediaPlayer DRM API จะคล้ายกับ API ระดับล่างที่ MediaDrm
ให้บริการ แต่ทำงานในระดับที่สูงขึ้นและไม่แสดงเครื่องมือแยก DRM และออบเจ็กต์การเข้ารหัสที่อยู่เบื้องหลัง
แม้ว่า MediaPlayer DRM API จะไม่มีฟังก์ชันการทำงานทั้งหมดของ MediaDrm
แต่รองรับ Use Case ที่พบบ่อยที่สุด การใช้งานปัจจุบันสามารถจัดการเนื้อหาประเภทต่อไปนี้
- ไฟล์สื่อในเครื่องที่ได้รับการป้องกันโดย 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 เมธอดจะแสดงผลค่าMediaPlayer.DrmInfo
ที่ไม่ใช่ค่าว่าง
หากมี MediaPlayer.DrmInfo
อยู่แล้ว ให้ทำดังนี้
- ตรวจสอบแผนที่ 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 ก่อนหรือหลังจากที่ prepareDrm()
แสดงผล
ตั้งค่า DRM แบบไม่พร้อมกัน
คุณสามารถเริ่มต้น DRM แบบไม่พร้อมกันได้โดยการสร้างและลงทะเบียน MediaPlayer.OnDrmInfoListener
เพื่อเตรียม DRM และ MediaPlayer.OnDrmPreparedListener
เพื่อเริ่มโปรแกรมเล่น ซึ่งทำงานร่วมกับ 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();
}
จัดการสื่อที่เข้ารหัส
ตั้งแต่ Android 8.0 (API ระดับ 26) เป็นต้นไป MediaPlayer
จะถอดรหัสรูปแบบการเข้ารหัสทั่วไป (CENC) และสื่อที่เข้ารหัสระดับตัวอย่างของ HLS (METHOD=SAMPLE-AES) สำหรับสตรีมพื้นฐานประเภท H.264 และ AAC ได้ด้วย ก่อนหน้านี้ระบบรองรับสื่อที่เข้ารหัสทั้งกลุ่ม (METHOD=AES-128)
ดูข้อมูลเพิ่มเติม
Jetpack Media3 เป็นโซลูชันที่แนะนำสำหรับการเล่นสื่อในแอป อ่านข้อมูลเพิ่มเติมเกี่ยวกับโซลูชันนี้
หน้าเหล่านี้ครอบคลุมหัวข้อเกี่ยวกับการบันทึก การจัดเก็บ และการเล่นเสียงและวิดีโอ