Работа с MediaPlayer и управлением цифровыми правами (DRM)

Начиная с 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, выполните следующие действия:

  1. Если вы хотите, чтобы ваше приложение выполняло пользовательскую настройку, определите интерфейс OnDrmConfigHelper и прикрепите его к проигрывателю с помощью setOnDrmConfigHelper() .
  2. Вызовите prepare() .
  3. Вызовите getDrmInfo() . Если источник имеет содержимое DRM, метод возвращает ненулевое значение MediaPlayer.DrmInfo .

Если MediaPlayer.DrmInfo существует:

  1. Изучите карту доступных UUID и выберите один.
  2. Подготовьте конфигурацию DRM для текущего источника, вызвав prepareDrm() .
    • Если вы создали и зарегистрировали обратный вызов OnDrmConfigHelper , он вызывается во время выполнения метода prepareDrm() . Это позволяет вам выполнить пользовательскую настройку свойств DRM перед открытием сеанса DRM. Обратный вызов вызывается синхронно в потоке, вызвавшем prepareDrm() . Чтобы получить доступ к свойствам DRM, вызовите getDrmPropertyString() и setDrmPropertyString() . Избегайте выполнения длительных операций.
    • Если устройство еще не было подготовлено, prepareDrm() также обращается к серверу обеспечения для подготовки устройства. Это может занять разное время в зависимости от сетевого подключения.
  3. Чтобы получить массив байтов запроса непрозрачного ключа для отправки на сервер лицензий, вызовите getKeyRequest() .
  4. Чтобы сообщить механизму 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 — рекомендуемое решение для воспроизведения мультимедиа в вашем приложении. Узнайте больше об этом.

На этих страницах рассматриваются темы, связанные с записью, хранением и воспроизведением аудио и видео: