ExoPlayer использует API MediaDrm Android для поддержки воспроизведения контента, защищенного DRM.
В таблице ниже указаны минимальные версии Android, необходимые для разных поддерживаемых схем DRM, а также форматы потоковой передачи, для которых они поддерживаются.
| Схема DRM | Номер версии Android | Уровень Android API | Поддерживаемые форматы |
|---|---|---|---|
| Widevine "cenc" | 4.4 | 19 | DASH, HLS (только FMP4) |
| Widevine "cbcs" | 7.1 | 25 | DASH, HLS (только FMP4) |
| ClearKey (cenc) | 5,0 | 21 | DASH |
| PlayReady SL2000 "cenc" | Android TV | Android TV | DASH, SmoothStreaming, HLS (только FMP4) |
Чтобы воспроизводить в ExoPlayer контент, защищенный DRM, при создании медиаконтента необходимо указать 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, который используется при создании проигрывателя. Поставщик может выбрать, создавать ли новый экземпляр менеджера каждый раз или нет. Чтобы всегда использовать один и тот же экземпляр:
Kotlin
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 6.0 (уровень API 23) или более поздней версией ОС (вплоть до Android 11, уровень API 30) видео прерывается, попробуйте включить асинхронную постановку буферов в очередь.