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), наблюдаются рывки видео, попробуйте включить асинхронную буферизацию .