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