Начиная с Android 8.0 (уровень API 26), MediaPlayer
включает API, которые поддерживают воспроизведение материалов, защищенных DRM. API-интерфейсы MediaPlayer DRM аналогичны низкоуровневому API, предоставляемому MediaDrm
, но они работают на более высоком уровне и не раскрывают базовый экстрактор, DRM и криптографические объекты.
Хотя API MediaPlayer DRM не обеспечивает полную функциональность MediaDrm
, он поддерживает наиболее распространенные варианты использования. Текущая реализация может обрабатывать следующие типы контента:
- Локальные медиафайлы, защищенные Widevine
- Удаленные или потоковые медиафайлы, защищенные Widevine
В следующем фрагменте кода показано, как использовать новые методы DRM MediaPlayer
в синхронной реализации.
Чтобы управлять мультимедиа, контролируемым DRM, вам необходимо включить новые методы вместе с обычным потоком вызовов MediaPlayer, как показано в этом примере:
Котлин
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()
}
Ява
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();
Начните с инициализации объекта MediaPlayer
и установки его источника с помощью setDataSource()
, как обычно. Затем, чтобы использовать DRM, выполните следующие действия:
- Если вы хотите, чтобы ваше приложение выполняло пользовательскую настройку, определите интерфейс
OnDrmConfigHelper
и прикрепите его к проигрывателю с помощьюsetOnDrmConfigHelper()
. - Вызовите
prepare()
. - Вызовите
getDrmInfo()
. Если источник имеет содержимое DRM, метод возвращает ненулевое значениеMediaPlayer.DrmInfo
.
Если MediaPlayer.DrmInfo
существует:
- Изучите карту доступных UUID и выберите один.
- Подготовьте конфигурацию DRM для текущего источника, вызвав
prepareDrm()
.- Если вы создали и зарегистрировали обратный вызов
OnDrmConfigHelper
, он вызывается во время выполнения методаprepareDrm()
. Это позволяет вам выполнить пользовательскую настройку свойств DRM перед открытием сеанса DRM. Обратный вызов вызывается синхронно в потоке, вызвавшемprepareDrm()
. Чтобы получить доступ к свойствам DRM, вызовитеgetDrmPropertyString()
иsetDrmPropertyString()
. Избегайте выполнения длительных операций. - Если устройство еще не было подготовлено,
prepareDrm()
также обращается к серверу обеспечения для подготовки устройства. Это может занять разное время в зависимости от сетевого подключения.
- Если вы создали и зарегистрировали обратный вызов
- Чтобы получить массив байтов запроса непрозрачного ключа для отправки на сервер лицензий, вызовите
getKeyRequest()
. - Чтобы сообщить механизму DRM об ответе ключа, полученном от сервера лицензий, вызовите
provideKeyResponse()
. Результат зависит от типа запроса ключа:- Если ответ предназначен для автономного запроса ключа, результатом является идентификатор набора ключей. Вы можете использовать этот идентификатор набора ключей с помощью
restoreKeys()
для восстановления ключей в новом сеансе. - Если ответ предназначен для запроса потоковой передачи или выпуска, результат будет нулевым.
- Если ответ предназначен для автономного запроса ключа, результатом является идентификатор набора ключей. Вы можете использовать этот идентификатор набора ключей с помощью
Асинхронная подготовка DRM
По умолчанию prepareDrm()
выполняется синхронно, блокируясь до завершения подготовки. Тем не менее, самая первая подготовка DRM на новом устройстве также может потребовать подготовки, которую prepareDrm()
обрабатывает внутри себя, и ее завершение может занять некоторое время из-за задействованной сетевой операции. Вы можете избежать блокировки при prepareDrm()
, определив и установив MediaPlayer.OnDrmPreparedListener
.
Установите OnDrmPreparedListener
. prepareDrm()
выполняет подготовку (при необходимости) и подготовку в фоновом режиме. После завершения подготовки и подготовки система вызывает прослушиватель. Не делайте никаких предположений о последовательности вызовов или потоке, в котором работает прослушиватель (если только вы не зарегистрируете прослушиватель в потоке-обработчике). Система может вызвать прослушиватель до или после завершения работы prepareDrm()
.
Настройте DRM асинхронно
Вы можете инициализировать DRM асинхронно, создав и зарегистрировав MediaPlayer.OnDrmInfoListener
для подготовки DRM и MediaPlayer.OnDrmPreparedListener
для запуска проигрывателя. Они работают совместно с prepareAsync()
, как показано в этом примере:
Котлин
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()
}
Ява
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();
}
Работа с зашифрованными медиафайлами
Начиная с Android 8.0 (уровень API 26), MediaPlayer
также может расшифровывать зашифрованные медиафайлы на уровне выборки (METHOD=SAMPLE-AES) по общей схеме шифрования (CENC) и HLS для типов элементарных потоков H.264 и AAC. Ранее поддерживались носители с полносегментным шифрованием (METHOD=AES-128).
Узнать больше
Jetpack Media3 — рекомендуемое решение для воспроизведения мультимедиа в вашем приложении. Узнайте больше об этом.
На этих страницах рассматриваются темы, связанные с записью, хранением и воспроизведением аудио и видео: