Управление цифровыми правами

ExoPlayer использует API MediaDrm Android для поддержки воспроизведения с защитой DRM. Минимальные версии Android, необходимые для различных поддерживаемых схем DRM, а также поддерживаемые ими форматы потоковой передачи описаны в следующей таблице:

Схема DRM номер версии Android Уровень API Android Поддерживаемые форматы
Widevine "ценк" 4.4 19 DASH, HLS (только для FMP4)
Widevine "cbcs" 7.1 25 DASH, HLS (только для FMP4)
ClearKey "cenc" 5.0 21 БРОСАТЬСЯ
PlayReady SL2000 "cenc" Android TV Android TV DASH, SmoothStreaming, HLS (только FMP4)

Для воспроизведения контента, защищенного DRM, с помощью ExoPlayer необходимо указать UUID системы DRM при создании медиафайла , а также можно указать другие свойства. Затем плеер будет использовать эти свойства для создания реализации DrmSessionManager по умолчанию, называемой DefaultDrmSessionManager , которая подходит для большинства случаев использования. Для некоторых случаев могут потребоваться дополнительные свойства DRM, как описано в следующих разделах.

Вращение ключа

Для воспроизведения потоков с вращающимися ключами передайте true в метод MediaItem.DrmConfiguration.Builder.setMultiSession при создании медиафайла.

Многоключевой контент

Многоключевой контент состоит из нескольких потоков, причем некоторые потоки используют разные ключи. Воспроизведение многоключевого контента может осуществляться двумя способами, в зависимости от конфигурации лицензионного сервера.

Случай 1: Сервер лицензий отвечает всеми ключами для контента.

В этом случае лицензионный сервер настроен таким образом, что при получении запроса на один ключ он отвечает всеми ключами для контента. ExoPlayer обрабатывает этот случай без необходимости какой-либо специальной настройки. Адаптация между потоками (например, SD и HD видео) происходит плавно, даже если они используют разные ключи.

По возможности мы рекомендуем настроить ваш сервер лицензий таким образом. Это наиболее эффективный и надежный способ поддержки воспроизведения контента с несколькими клавишами, поскольку он не требует от клиента отправки нескольких запросов на получение лицензий для доступа к различным потокам.

Вариант 2: Сервер лицензий отвечает только запрошенным ключом.

В этом случае сервер лицензий настроен на отправку только ключа, указанного в запросе. Воспроизведение контента с несколькими ключами возможно при такой конфигурации сервера лицензий, если при создании медиафайла передать true в метод MediaItem.DrmConfiguration.Builder.setMultiSession .

Мы не рекомендуем настраивать ваш лицензионный сервер таким образом. Это требует дополнительных запросов на получение лицензий для воспроизведения контента с несколькими ключами, что менее эффективно и надежно, чем описанный выше альтернативный вариант.

Автономные ключи

Набор автономных ключей можно загрузить, передав идентификатор набора ключей в метод MediaItem.DrmConfiguration.Builder.setKeySetId при создании медиафайла. Это позволяет воспроизводить контент, используя ключи, хранящиеся в автономном наборе ключей с указанным идентификатором.

DRM-сессии для контента без ограничений

Использование заглушек DrmSessions позволяет ExoPlayer использовать те же декодеры для незашифрованного контента, что и для зашифрованного. Если медиафайл содержит как незашифрованные, так и зашифрованные фрагменты, может потребоваться использование заглушек DrmSessions , чтобы избежать повторного создания декодеров при переходах между незашифрованными и зашифрованными фрагментами. Использование заглушек DrmSessions для аудио- и видеодорожек можно включить, передав true в MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks при создании медиафайла.

Использование пользовательского DrmSessionManager

Если приложение хочет настроить DrmSessionManager используемый для воспроизведения, оно может реализовать интерфейс DrmSessionManagerProvider и передать его в MediaSource.Factory , который используется при создании плеера . Провайдер может выбрать, создавать ли новый экземпляр менеджера каждый раз или нет. Чтобы всегда использовать один и тот же экземпляр:

Котлин

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);

Улучшение качества воспроизведения

Если при воспроизведении контента с DRM-защитой на устройстве с любой версией Android, начиная с Android 6.0 (уровень API 23) и заканчивая Android 11 (уровень API 30), наблюдаются рывки видео, попробуйте включить асинхронную буферизацию .