O ExoPlayer usa a API MediaDrm
do Android para oferecer suporte à reprodução protegida por DRM.
As versões mínimas do Android necessárias para diferentes esquemas de DRM com suporte, além dos formatos de streaming com suporte, são descritos na
tabela abaixo:
Esquema de DRM | Número da versão do Android | Nível da Android API | Formatos com suporte |
---|---|---|---|
Widevine "cenc" | 4.4 | 19 | DASH, HLS (somente FMP4) |
"cbcs" de Widevine | 7.1 | 25 | DASH, HLS (somente FMP4) |
ClearKey "cenc" | 5.0 | 21 | DASH |
PlayReady SL2000 "cenc" | Android TV | Android TV | DASH, SmoothStreaming, HLS (somente FMP4) |
Para reproduzir conteúdo protegido por DRM com o ExoPlayer, o UUID do sistema
DRM precisa ser especificado
ao criar um item de mídia. Outras
propriedades também podem ser fornecidas. O player vai usar essas propriedades para
criar uma implementação padrão de DrmSessionManager
, chamada
DefaultDrmSessionManager
, adequada para a maioria dos casos de uso. Para alguns casos de uso, outras propriedades de DRM podem ser necessárias, conforme descrito nas seções
a seguir.
Rotação de chaves
Para abrir streams com chaves giratórias, transmita true
para
MediaItem.DrmConfiguration.Builder.setMultiSession
ao criar o item
de mídia.
Conteúdo com várias chaves
O conteúdo de várias chaves consiste em vários streams, em que alguns usam chaves diferentes de outros. É possível reproduzir o conteúdo de várias chaves de duas maneiras, dependendo de como o servidor de licenças está configurado.
Caso 1: o servidor de licença responde com todas as chaves do conteúdo
Nesse caso, o servidor de licenças é configurado para responder com todas as chaves do conteúdo quando receber uma solicitação para uma chave. Esse caso é processado pelo ExoPlayer sem a necessidade de nenhuma configuração especial. A adaptação entre streams (por exemplo, vídeos em SD e HD) é perfeita, mesmo que eles usem chaves diferentes.
Sempre que possível, recomendamos que você configure o servidor de licenças para se comportar dessa maneira. É a maneira mais eficiente e robusta de oferecer suporte à reprodução de conteúdo de várias chaves, porque não exige que o cliente faça várias solicitações de licença para acessar os diferentes streams.
Caso 2: o servidor de licença responde apenas com a chave solicitada
Nesse caso, o servidor de licenças é configurado para responder apenas com a chave especificada na solicitação. O conteúdo de várias chaves pode ser reproduzido com essa configuração de servidor de
licenças transmitindo true
para
MediaItem.DrmConfiguration.Builder.setMultiSession
ao criar o item de
mídia.
Não recomendamos que você configure seu servidor de licenças para ter esse comportamento. Ela exige solicitações de licença extras para reproduzir conteúdo de várias chaves, que é menos eficiente e robusta do que a alternativa descrita acima.
Chaves off-line
Um conjunto de chaves off-line pode ser carregado transmitindo o ID de definição de chave para
MediaItem.DrmConfiguration.Builder.setKeySetId
ao criar o item de mídia.
Isso permite a reprodução usando as chaves armazenadas na chave off-line definida com o
ID especificado.
Sessões de DRM para conteúdo claro
O uso do marcador de posição DrmSessions
permite que ExoPlayer
use os mesmos decodificadores para
conteúdo claro que são usados ao reproduzir conteúdo criptografado. Quando a mídia contém
seções claras e criptografadas, use o marcador de posição DrmSessions
para evitar a recriação de decodificadores quando ocorrerem transições entre seções claras e
criptografadas. O uso do marcador de posição DrmSessions
para faixas de áudio e vídeo pode
ser ativado transmitindo true
para
MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks
ao
criar o item de mídia.
Como usar um DrmSessionManager personalizado
Se um app quiser personalizar a DrmSessionManager
usada para reprodução, ele poderá
implementar um DrmSessionManagerProvider
e transmitir para o
MediaSource.Factory
, que é usado ao criar o player. O provedor pode
escolher se quer instanciar uma nova instância do gerenciador a cada vez ou não. Para sempre
usar a mesma instância:
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);
Como melhorar o desempenho da reprodução
Se o vídeo estiver travando ao reproduzir conteúdo protegido por DRM em um dispositivo com qualquer versão do Android, desde a versão 6.0 (nível 23 da API) até o Android 11 (nível 30 da API), tente ativar o enfileiramento de buffer assíncrono.