การจัดการสิทธิ์ดิจิทัล

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) ให้ลองเปิดใช้การจัดคิวบัฟเฟอร์แบบแอซิงโครนัส