ExoPlayer dùng API MediaDrm của Android để hỗ trợ chế độ phát được bảo vệ bằng DRM.
Các phiên bản Android tối thiểu cần thiết cho các lược đồ DRM được hỗ trợ khác nhau, cùng với các định dạng phát trực tuyến mà các lược đồ này hỗ trợ, được mô tả trong bảng sau:
| Lược đồ DRM | Số phiên bản Android | Cấp độ API của Android | Định dạng được hỗ trợ |
|---|---|---|---|
| Widevine "cenc" | 4.4 | 19 | DASH, HLS (chỉ FMP4) |
| Widevine "cbcs" | 7.1 | 25 | DASH, HLS (chỉ FMP4) |
| ClearKey "cenc" | 5 | 21 | DASH (Truyền phát thích ứng động qua HTTP) |
| PlayReady SL2000 "cenc" | Android TV | Android TV | DASH, SmoothStreaming, HLS (chỉ FMP4) |
Để phát nội dung được bảo vệ bằng DRM bằng ExoPlayer, bạn phải chỉ định UUID của hệ thống DRM khi tạo một mục nội dung nghe nhìn và bạn cũng có thể cung cấp các thuộc tính khác. Sau đó, trình phát sẽ dùng các thuộc tính này để tạo một chế độ triển khai mặc định của DrmSessionManager, gọi là DefaultDrmSessionManager, phù hợp với hầu hết các trường hợp sử dụng. Đối với một số trường hợp sử dụng, bạn có thể cần thêm các thuộc tính DRM, như được nêu trong các phần sau.
Xoay vòng khoá
Để phát các luồng có khoá xoay, hãy truyền true đến MediaItem.DrmConfiguration.Builder.setMultiSession khi tạo mục nội dung nghe nhìn.
Nội dung có nhiều khoá
Nội dung có nhiều khoá bao gồm nhiều luồng, trong đó một số luồng sử dụng các khoá khác với các luồng khác. Bạn có thể phát nội dung có nhiều khoá theo một trong hai cách, tuỳ thuộc vào cách bạn định cấu hình máy chủ cấp phép.
Trường hợp 1: Máy chủ cấp phép phản hồi bằng tất cả các khoá cho nội dung
Trong trường hợp này, máy chủ cấp phép được định cấu hình sao cho khi nhận được yêu cầu về một khoá, máy chủ sẽ phản hồi bằng tất cả các khoá cho nội dung. Trường hợp này được ExoPlayer xử lý mà không cần bất kỳ cấu hình đặc biệt nào. Việc điều chỉnh giữa các luồng (ví dụ: video SD và HD) diễn ra liền mạch ngay cả khi các luồng này sử dụng các khoá khác nhau.
Nếu có thể, bạn nên định cấu hình máy chủ cấp phép để hoạt động theo cách này. Đây là cách hiệu quả và mạnh mẽ nhất để hỗ trợ việc phát nội dung có nhiều khoá, vì cách này không yêu cầu ứng dụng thực hiện nhiều yêu cầu cấp phép để truy cập vào các luồng khác nhau.
Trường hợp 2: Máy chủ cấp phép chỉ phản hồi bằng khoá được yêu cầu
Trong trường hợp này, máy chủ cấp phép được định cấu hình để chỉ phản hồi bằng khoá được chỉ định trong yêu cầu. Bạn có thể phát nội dung có nhiều khoá bằng cấu hình máy chủ cấp phép này bằng cách truyền true đến MediaItem.DrmConfiguration.Builder.setMultiSession khi tạo mục nội dung nghe nhìn.
Bạn không nên định cấu hình máy chủ cấp phép theo cách này. Phương pháp này yêu cầu thêm các yêu cầu cấp phép để phát nội dung có nhiều khoá, do đó kém hiệu quả và không mạnh mẽ bằng phương pháp thay thế được mô tả ở trên.
Khoá ngoại tuyến
Bạn có thể tải một bộ khoá ngoại tuyến bằng cách truyền mã nhận dạng bộ khoá đến MediaItem.DrmConfiguration.Builder.setKeySetId khi tạo mục nội dung nghe nhìn.
Điều này cho phép phát bằng các khoá được lưu trữ trong bộ khoá ngoại tuyến có mã nhận dạng đã chỉ định.
Phiên DRM cho nội dung rõ ràng
Việc sử dụng phần giữ chỗ DrmSessions cho phép ExoPlayer sử dụng cùng một bộ giải mã cho nội dung rõ ràng như khi phát nội dung đã mã hoá. Khi nội dung nghe nhìn chứa cả phần rõ ràng và phần được mã hoá, bạn có thể muốn sử dụng phần giữ chỗ DrmSessions để tránh tạo lại bộ giải mã khi quá trình chuyển đổi giữa phần rõ ràng và phần được mã hoá diễn ra. Bạn có thể bật việc sử dụng phần giữ chỗ DrmSessions cho các bản âm thanh và video bằng cách truyền true đến MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks khi tạo mục nội dung nghe nhìn.
Sử dụng DrmSessionManager tuỳ chỉnh
Nếu muốn tuỳ chỉnh DrmSessionManager dùng để phát, ứng dụng có thể triển khai DrmSessionManagerProvider và truyền DrmSessionManagerProvider này đến MediaSource.Factory. MediaSource.Factory là được dùng khi tạo trình phát. Nhà cung cấp có thể chọn khởi tạo một phiên bản trình quản lý mới mỗi lần hay không. Để luôn sử dụng cùng một thực thể:
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);
Cải thiện hiệu suất phát
Nếu gặp phải tình trạng video bị giật khi phát nội dung được bảo vệ bằng DRM trên thiết bị chạy bất kỳ phiên bản Android nào từ Android 6.0 (API cấp 23) đến Android 11 (API cấp 30), bạn có thể thử bật tính năng xếp hàng bộ đệm không đồng bộ.