ExoPlayer использует API MediaDrm
Android для поддержки воспроизведения с защитой DRM. Минимальные версии Android, необходимые для различных поддерживаемых схем DRM, а также форматы потоковой передачи, для которых они поддерживаются, описаны в следующей таблице:
Схема DRM | Номер версии Android | Уровень API Android | Поддерживаемые форматы |
---|---|---|---|
Широкая лоза "ценк" | 4.4 | 19 | DASH, HLS (только FMP4) |
Widevine "cbcs" | 7.1 | 25 | DASH, HLS (только FMP4) |
ClearKey "cenc" | 5.0 | 21 | БРОСАТЬСЯ |
PlayReady SL2000 "ценк" | Андроид ТВ | Андроид ТВ | 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 }
Ява
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) включительно, вы можете попробовать включить асинхронную буферную очередь .