Kể từ Android 8.0 (cấp độ API 26), MediaPlayer bao gồm các API hỗ trợ việc phát nội dung được bảo vệ bằng DRM. API DRM MediaPlayer tương tự như API cấp thấp do MediaDrm cung cấp, nhưng chúng hoạt động ở cấp độ cao hơn và không hiển thị các đối tượng trình trích xuất, DRM và mã hoá cơ bản.
Mặc dù MediaPlayer DRM API không cung cấp đầy đủ chức năng của MediaDrm, nhưng API này hỗ trợ các trường hợp sử dụng phổ biến nhất. Cách triển khai hiện tại có thể xử lý các loại nội dung sau:
- Tệp nội dung nghe nhìn cục bộ được bảo vệ bằng Widevine
- Tệp nội dung nghe nhìn từ xa hoặc tệp nội dung nghe nhìn truyền trực tuyến được bảo vệ bằng Widevine
Đoạn mã sau đây minh hoạ cách sử dụng các phương thức DRM MediaPlayer mới trong quá trình triển khai đồng bộ.
Để quản lý nội dung nghe nhìn được kiểm soát bằng DRM, bạn cần thêm các phương thức mới cùng với quy trình gọi MediaPlayer thông thường, như minh hoạ trong ví dụ này:
Kotlin
mediaPlayer?.apply {
setDataSource()
setOnDrmConfigHelper() // optional, for custom configuration
prepare()
drmInfo?.also {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
// MediaPlayer is now ready to use
start()
// ...play/pause/resume...
stop()
releaseDrm()
}
Java
setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();
Bắt đầu bằng cách khởi động đối tượng MediaPlayer và đặt nguồn của đối tượng đó bằng setDataSource() như thường lệ. Sau đó, để sử dụng DRM, hãy thực hiện các bước sau:
- Nếu bạn muốn ứng dụng của mình thực hiện cấu hình tuỳ chỉnh, hãy xác định một giao diện
OnDrmConfigHelperrồi đính kèm giao diện đó vào trình phát bằng cách sử dụngsetOnDrmConfigHelper(). - Gọi
prepare(). - Gọi
getDrmInfo(). Nếu nguồn có nội dung được bảo vệ bằng DRM, phương thức này sẽ trả về giá trịMediaPlayer.DrmInfokhông rỗng.
Nếu MediaPlayer.DrmInfo tồn tại:
- Kiểm tra bản đồ gồm các UUID có sẵn rồi chọn một UUID.
- Chuẩn bị cấu hình DRM cho nguồn hiện tại bằng cách gọi
prepareDrm().- Nếu bạn đã tạo và đăng ký một lệnh gọi lại
OnDrmConfigHelper, thì lệnh gọi lại này sẽ được gọi trong khiprepareDrm()đang thực thi. Điều này cho phép bạn thực hiện cấu hình tuỳ chỉnh cho các thuộc tính DRM trước khi mở phiên DRM. Lệnh gọi lại được gọi đồng bộ trong luồng đã gọiprepareDrm(). Để truy cập vào các thuộc tính DRM, hãy gọigetDrmPropertyString()vàsetDrmPropertyString(). Tránh thực hiện các thao tác kéo dài. - Nếu thiết bị chưa được cấp phép,
prepareDrm()cũng sẽ truy cập vào máy chủ cấp phép để cấp phép cho thiết bị. Quá trình này có thể mất một khoảng thời gian tuỳ thuộc vào kết nối mạng.
- Nếu bạn đã tạo và đăng ký một lệnh gọi lại
- Để nhận một mảng byte yêu cầu khoá không công khai để gửi đến một máy chủ cấp phép, hãy gọi
getKeyRequest(). - Để thông báo cho công cụ DRM về phản hồi khoá nhận được từ máy chủ cấp phép, hãy gọi
provideKeyResponse(). Kết quả phụ thuộc vào loại yêu cầu khoá:- Nếu phản hồi là cho một yêu cầu khoá ngoại tuyến, thì kết quả sẽ là một giá trị nhận dạng bộ khoá. Bạn có thể sử dụng giá trị nhận dạng bộ khoá này với
restoreKeys()để khôi phục các khoá cho một phiên mới. - Nếu phản hồi là yêu cầu phát trực tuyến hoặc phát hành, thì kết quả sẽ là giá trị rỗng.
- Nếu phản hồi là cho một yêu cầu khoá ngoại tuyến, thì kết quả sẽ là một giá trị nhận dạng bộ khoá. Bạn có thể sử dụng giá trị nhận dạng bộ khoá này với
Chuẩn bị DRM theo cách không đồng bộ
Theo mặc định, prepareDrm() chạy đồng bộ, chặn cho đến khi quá trình chuẩn bị hoàn tất. Tuy nhiên, lần chuẩn bị DRM đầu tiên trên một thiết bị mới cũng có thể yêu cầu việc cung cấp. prepareDrm() sẽ xử lý việc này nội bộ và có thể mất một khoảng thời gian để hoàn tất do có hoạt động mạng liên quan. Bạn có thể tránh bị chặn trên prepareDrm() bằng cách xác định và đặt MediaPlayer.OnDrmPreparedListener.
Đặt một OnDrmPreparedListener. prepareDrm() thực hiện việc cung cấp (nếu cần) và chuẩn bị ở chế độ nền. Khi quá trình chuẩn bị và cung cấp hoàn tất, hệ thống sẽ gọi trình nghe. Không đưa ra bất kỳ giả định nào về trình tự gọi hoặc luồng mà trình nghe chạy (trừ phi bạn đăng ký trình nghe bằng một luồng trình xử lý). Hệ thống có thể gọi trình nghe trước hoặc sau khi prepareDrm() trả về.
Thiết lập DRM theo cách không đồng bộ
Bạn có thể khởi động DRM không đồng bộ bằng cách tạo và đăng ký MediaPlayer.OnDrmInfoListener để chuẩn bị DRM và MediaPlayer.OnDrmPreparedListener để khởi động trình phát. Chúng hoạt động cùng với prepareAsync(), như trong ví dụ này:
Kotlin
setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
mediaPlayer.apply {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
mediaPlayer.start()
}
Java
setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {
start();
}
Xử lý nội dung nghe nhìn được mã hoá
Kể từ Android 8.0 (cấp độ API 26), MediaPlayer cũng có thể giải mã Common Encryption Scheme (CENC) và nội dung nghe nhìn được mã hoá ở cấp mẫu HLS (METHOD=SAMPLE-AES) cho các loại luồng cơ bản H.264 và AAC. Trước đây, chúng tôi có hỗ trợ nội dung nghe nhìn được mã hoá toàn bộ phân đoạn (METHOD=AES-128).
Tìm hiểu thêm
Jetpack Media3 là giải pháp được đề xuất để phát nội dung nghe nhìn trong ứng dụng của bạn. Đọc thêm về giải pháp này.
Những trang này đề cập đến các chủ đề liên quan đến việc ghi, lưu trữ và phát âm thanh cũng như video: