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 para os quais eles são compatíveis, são descritas 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 e HLS (somente FMP4) |
Widevine "cbcs" | 7.1 | 25 | DASH e HLS (somente FMP4) |
ClearKey "cenc" | 5.0 | 21 | DASH |
PlayReady SL2000 "cenc" | Android TV | Android TV | DASH, SmoothStreaming e HLS (somente FMP4) |
Para reproduzir conteúdo protegido por DRM com o ExoPlayer, o UUID do sistema DRM
e o URI do servidor de licença precisam ser especificados
ao criar um item de mídia (link em inglês).
O jogador usará essas propriedades para criar uma implementação padrão de
DrmSessionManager
, chamada de 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 reproduzir streams com chaves rotativas, transmita true
para
MediaItem.DrmConfiguration.Builder.setMultiSession
ao criar o item
de mídia.
Conteúdo com várias chaves
O conteúdo com várias chaves consiste em vários streams, em que alguns deles usam chaves diferentes. O conteúdo com várias chaves pode ser reproduzido 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ça é configurado para que, ao receber uma solicitação de uma chave, ele responda com todas as chaves do conteúdo. Esse caso é processado pelo ExoPlayer sem a necessidade de nenhuma configuração especial. A adaptação entre transmissões (por exemplo, vídeo em SD e HD) é perfeita, mesmo que elas usem chaves diferentes.
Sempre que possível, recomendamos configurar o servidor de licenças para se comportar dessa maneira. Essa é a maneira mais eficiente e robusta de oferecer suporte à reprodução de conteúdo com 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ça está configurado para responder apenas com a chave especificada na solicitação. O conteúdo com várias chaves pode ser reproduzido com essa configuração do servidor de licença, transmitindo true
para MediaItem.DrmConfiguration.Builder.setMultiSession
ao criar o item de mídia.
Não recomendamos configurar o servidor de licenças para se comportar dessa maneira. Isso exige outras solicitações de licença para reproduzir conteúdo com várias chaves, o que é menos eficiente e robusto do que a alternativa descrita acima.
Chaves off-line
Um conjunto de chaves off-line pode ser carregado transmitindo o ID do conjunto de chaves para
MediaItem.DrmConfiguration.Builder.setKeySetId
ao criar o item de mídia.
Isso permite a reprodução usando as teclas 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 limpo que são usados ao reproduzir conteúdo criptografado. Quando a mídia tiver
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
Caso um app queira personalizar o DrmSessionManager
usado para reprodução, ele pode
implementar um DrmSessionManagerProvider
e transmitir essa informação para a
MediaSource.Factory
, que é usada ao criar o player. O provedor pode
optar por instanciar uma nova instância do gerenciador a cada vez ou não. Para usar sempre 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 de reprodução
Se você tiver falhas de vídeo ao reproduzir conteúdo protegido por DRM em um dispositivo com qualquer versão do Android a partir do Android 6.0 (nível 23 da API) até o Android 11 (nível 30 da API), tente ativar o enfileiramento de buffer assíncrono.