Quản lý quyền kỹ thuật số

ExoPlayer sử dụng API MediaDrm của Android để hỗ trợ việc phát nội dung được bảo vệ bằng DRM. Bảng sau đây mô tả các phiên bản Android tối thiểu cần có cho các lược đồ DRM khác nhau được hỗ trợ, cùng với các định dạng truyền trực tuyến mà các giao thức này được hỗ trợ:

Lược đồ DRM Số phiên bản Android Cấp độ API trên Android Định dạng được hỗ trợ
"cenc" của Widevine 4.4 19 DASH, HLS (chỉ FMP4)
"cbcs" của Widevine 7.1 25 DASH, HLS (chỉ FMP4)
Xoá Khoá "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 và URI máy chủ cấp phép khi tạo một mục nội dung nghe nhìn. Sau đó, người chơi sẽ sử dụng các thuộc tính này để tạo phương thức triển khai mặc định của DrmSessionManager (được 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, có thể cần thêm các thuộc tính DRM bổ sung, như trình bày trong các phần sau.

Xoay khoá

Để phát sự kiện phát trực tiếp bằng các phím 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 nhiều phím

Nội dung 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 nhiều khoá theo một trong hai cách, tuỳ thuộc vào cách đị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 để khi nhận được yêu cầu về một khoá, máy chủ cấp phép đó sẽ phản hồi bằng tất cả khoá cho nội dung đó. Trường hợp này do ExoPlayer xử lý mà không cần phải có bất kỳ cấu hình đặc biệt nào. Quá trình thích ứng 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 nhiều khoá.

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 nhiều khoá vì ứng dụng không cần thực hiện nhiều yêu cầu cấp phép để truy cập vào nhiều luồng.

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 để phản hồi chỉ bằng khoá được chỉ định trong yêu cầu. Bạn có thể phát nội dung 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 để hoạt động theo cách này. Phương thức này đòi hỏi thêm các yêu cầu giấy phép để phát nội dung nhiều khoá. Điều này sẽ kém hiệu quả và mạnh mẽ hơn so với giải pháp thay thế được mô tả ở trên.

Khoá ngoại tuyến

Bạn có thể tải bộ khoá ngoại tuyến bằng cách truyền mã bộ khoá vào MediaItem.DrmConfiguration.Builder.setKeySetId khi tạo mục nội dung đa phương tiện. Tính năng này cho phép phát bằng cách sử dụng các phím được lưu trữ trong bộ khoá ngoại tuyến với mã nhận dạng đã chỉ định.

Các 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ã đối với nội dung rõ ràng như dùng khi phát nội dung được mã hoá. Khi nội dung nghe nhìn chứa cả các phần rõ ràng và đã mã hoá, bạn nên sử dụng phần giữ chỗ DrmSessions để tránh tạo lại bộ giải mã khi diễn ra quá trình chuyển đổi giữa các phần rõ ràng và đã mã hoá. Bạn có thể bật 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 đa phương tiệ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 thuộc tính này đến MediaSource.Factory được sử dụng khi tạo trình phát. Nhà cung cấp có thể chọn có tạo thực thể cho một thực thể người quản lý mới mỗi lần hay không. Để luôn sử dụng cùng một phiên bản:

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 video của bạn bị giật khi phát nội dung được bảo vệ bằng DRM trên một thiết bị chạy bất kỳ phiên bản Android nào từ Android 6.0 (API cấp 23) cho đến Android 11 (API cấp 30) cho đế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ộ.