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 เท่านั้น) |
ClearKey "cenc" | 5.0 | 21 | แดชบอร์ด |
Play Ready SL2000 "CEnc" | Android TV | Android TV | DASH, SmoothStreaming, HLS (FMP4 เท่านั้น) |
เพื่อเล่นเนื้อหาที่ป้องกันด้วย DRM ด้วย ExoPlayer, UUID ของ DRM
ต้องระบุระบบ
เมื่อสร้างรายการสื่อ และอื่นๆ
และระบุพร็อพเพอร์ตี้ได้อีกด้วย จากนั้นโปรแกรมเล่นวิดีโอจะใช้คุณสมบัติเหล่านี้เพื่อ
สร้างการใช้งานเริ่มต้นของ DrmSessionManager
ที่มีชื่อว่า
DefaultDrmSessionManager
ซึ่งเหมาะกับ Use Case ส่วนใหญ่ สำหรับการใช้งานบางอย่าง
อาจจำเป็นต้องใช้คุณสมบัติ 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) คุณอาจลองเปิดใช้บัฟเฟอร์แบบไม่พร้อมกัน การจัดคิว