ExoPlayer ใช้ MediaDrm
API ของ Android เพื่อรองรับการเล่นที่มีการป้องกัน DRM
เวอร์ชัน Android ขั้นต่ำที่จำเป็นสำหรับรูปแบบ DRM ที่รองรับต่างๆ พร้อมด้วยรูปแบบสตรีมมิงที่รองรับ โปรดดูในตารางต่อไปนี้
รูปแบบ DRM | หมายเลขเวอร์ชันของ Android | ระดับ API ของ Android | รูปแบบที่รองรับ |
---|---|---|---|
Widevine "cenc" | 4.4 | 19 | DASH, HLS (FMP4 เท่านั้น) |
Widevine "cbcs" | 7.1 | 25 | DASH, HLS (FMP4 เท่านั้น) |
คีย์เคลียร์คีย์ "cenc" | 5.0 | 21 | DASH |
PlayReady SL2000 "cenc" | Android TV | Android TV | DASH, SmoothStreaming, HLS (FMP4 เท่านั้น) |
หากต้องการเล่นเนื้อหาที่ได้รับการคุ้มครอง DRM ด้วย ExoPlayer คุณต้องระบุ UUID ของระบบ DRMเมื่อสร้างรายการสื่อ และระบุพร็อพเพอร์ตี้อื่นๆ ได้ด้วย จากนั้นโปรแกรมเล่นจะใช้พร็อพเพอร์ตี้เหล่านี้เพื่อสร้างการใช้งาน DrmSessionManager
ตามค่าเริ่มต้นที่เรียกว่า DefaultDrmSessionManager
ซึ่งเหมาะสำหรับกรณีการใช้งานส่วนใหญ่ สำหรับบางกรณีการใช้งาน คุณอาจต้องใช้พร็อพเพอร์ตี้ DRM เพิ่มเติมตามที่ระบุไว้ในส่วนต่อไปนี้
การหมุนเวียนคีย์
หากต้องการเล่นสตรีมด้วยคีย์แบบหมุนเวียน ให้ส่ง true
ไปยัง MediaItem.DrmConfiguration.Builder.setMultiSession
เมื่อสร้างรายการสื่อ
เนื้อหาแบบหลายคีย์
เนื้อหาแบบหลายคีย์ประกอบด้วยสตรีมหลายรายการ โดยที่สตรีมบางรายการใช้คีย์ที่แตกต่างจากสตรีมอื่นๆ เนื้อหาแบบหลายคีย์จะเล่นได้ 2 วิธี ขึ้นอยู่กับการกำหนดค่าเซิร์ฟเวอร์ใบอนุญาต
กรณี 1: เซิร์ฟเวอร์ใบอนุญาตตอบกลับด้วยคีย์ทั้งหมดของเนื้อหา
ในกรณีนี้ เซิร์ฟเวอร์ใบอนุญาตได้รับการกําหนดค่าให้ตอบกลับด้วยคีย์ทั้งหมดของเนื้อหาเมื่อได้รับคําขอคีย์เดียว กรณีนี้ ExoPlayer จะจัดการให้โดยไม่จำเป็นต้องมีการกำหนดค่าพิเศษใดๆ การปรับระหว่างสตรีม (เช่น วิดีโอ SD และ HD) เป็นไปอย่างราบรื่นแม้ว่าสตรีมจะใช้คีย์ที่แตกต่างกันก็ตาม
เราขอแนะนําให้กําหนดค่าเซิร์ฟเวอร์ใบอนุญาตให้ทํางานในลักษณะนี้หากเป็นไปได้ ซึ่งเป็นวิธีที่มีประสิทธิภาพและมีประสิทธิภาพมากที่สุดในการรองรับการเล่นเนื้อหาแบบหลายคีย์ เนื่องจากไม่ต้องให้ไคลเอ็นต์ส่งคำขอใบอนุญาตหลายรายการเพื่อเข้าถึงสตรีมต่างๆ
กรณี 2: เซิร์ฟเวอร์ใบอนุญาตตอบกลับด้วยคีย์ที่ขอเท่านั้น
ในกรณีนี้ เซิร์ฟเวอร์ใบอนุญาตได้รับการกําหนดค่าให้ตอบกลับด้วยคีย์ที่ระบุไว้ในคําขอเท่านั้น เนื้อหาแบบหลายคีย์จะเล่นได้โดยใช้การกำหนดค่าเซิร์ฟเวอร์ใบอนุญาตนี้โดยการส่ง true
ไปยัง MediaItem.DrmConfiguration.Builder.setMultiSession
เมื่อสร้างรายการสื่อ
เราไม่แนะนำให้กำหนดค่าเซิร์ฟเวอร์ใบอนุญาตให้ทำงานในลักษณะนี้ โดยจะต้องขอใบอนุญาตเพิ่มเติมเพื่อเล่นเนื้อหาที่มีคีย์หลายรายการ ซึ่งมีประสิทธิภาพและมีความเสถียรน้อยกว่าทางเลือกที่อธิบายไว้ข้างต้น
คีย์ออฟไลน์
คุณสามารถโหลดชุดคีย์แบบออฟไลน์ได้โดยส่งรหัสชุดคีย์ไปยัง MediaItem.DrmConfiguration.Builder.setKeySetId
เมื่อสร้างรายการสื่อ
ซึ่งจะช่วยให้เล่นโดยใช้คีย์ที่จัดเก็บไว้ในชุดคีย์ออฟไลน์ที่มีรหัสที่ระบุได้
เซสชัน DRM สำหรับเนื้อหาที่ชัดเจน
การใช้ตัวยึดตําแหน่ง DrmSessions
ช่วยให้ ExoPlayer
ใช้โปรแกรมถอดรหัสเดียวกันกับที่ใช้เมื่อเล่นเนื้อหาที่เข้ารหัสสําหรับเนื้อหาที่ชัดเจนได้ เมื่อสื่อมีทั้งส่วนที่ชัดเจนและที่เข้ารหัส คุณอาจต้องใช้ตัวยึดตำแหน่ง DrmSessions
เพื่อหลีกเลี่ยงการสร้างตัวถอดรหัสอีกครั้งเมื่อมีการเปลี่ยนระหว่างส่วนที่ชัดเจนและที่เข้ารหัส คุณเปิดใช้ตัวยึดตําแหน่ง DrmSessions
สําหรับแทร็กเสียงและวิดีโอได้โดยส่ง true
ไปยัง MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks
เมื่อสร้างรายการสื่อ
การใช้ DrmSessionManager ที่กําหนดเอง
หากแอปต้องการปรับแต่ง DrmSessionManager
ที่ใช้สำหรับการเล่น ก็ใช้ DrmSessionManagerProvider
และส่งไปยัง MediaSource.Factory
ซึ่งจะใช้เมื่อสร้างโปรแกรมเล่นได้ ผู้ให้บริการสามารถเลือกได้ว่าจะให้สร้างอินสแตนซ์ตัวจัดการใหม่ทุกครั้งหรือไม่ หากต้องการใช้อินสแตนซ์เดียวกันเสมอ ให้ทำดังนี้
Kotlin
val customDrmSessionManager: DrmSessionManager = CustomDrmSessionManager() // Pass a drm session manager provider to the media source factory. val mediaSourceFactory = DefaultMediaSourceFactory(context).setDrmSessionManagerProvider { customDrmSessionManager }
Java
DrmSessionManager customDrmSessionManager = new CustomDrmSessionManager(/* ... */ ); // Pass a drm session manager provider to the media source factory. MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setDrmSessionManagerProvider(mediaItem -> customDrmSessionManager);
การปรับปรุงประสิทธิภาพการเล่น
หากพบปัญหาวิดีโอกระตุกเมื่อเล่นเนื้อหาที่ได้รับการคุ้มครอง DRM บนอุปกรณ์ที่ใช้ Android เวอร์ชันใดก็ได้ตั้งแต่ Android 6.0 (API ระดับ 23) ขึ้นไปจนถึง Android 11 (API ระดับ 30) ให้ลองเปิดใช้การจัดคิวบัฟเฟอร์แบบแอซิงโครนัส