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 compatíveis, além dos formatos de streaming em que eles são aceitos, estão descritas na tabela a seguir:
| 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) |
| Widevine "cbcs" | 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 de DRM precisa ser especificado ao criar um item de mídia. Outras propriedades também podem ser fornecidas. Em seguida, o player usa 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, talvez sejam necessárias propriedades extras de DRM, 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árias transmissões, em que algumas usam chaves diferentes de outras. 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ças responde com todas as chaves do conteúdo
Nesse caso, o servidor de licenças é configurado para que, quando ele recebe uma solicitação de uma chave, ele responda com todas as chaves do conteúdo. Esse caso é processado pelo ExoPlayer sem a necessidade de configuração especial. A adaptação entre streams (por exemplo, vídeo SD e HD) é perfeita, mesmo que eles usem chaves diferentes.
Sempre que possível, recomendamos configurar o servidor de licenças para se comportar dessa maneira. É 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 fluxos.
Caso 2: o servidor de licenças 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 com várias chaves pode ser reproduzido com essa configuração do servidor de licenças 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 forma. Ele exige solicitações de licença extras 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 chaves armazenadas no conjunto de chaves off-line com o ID especificado.
Sessões de DRM para conteúdo sem restrições
O uso do marcador de posição DrmSessions permite que o ExoPlayer use os mesmos decodificadores para
conteúdo sem criptografia que são usados ao reproduzir conteúdo criptografado. Quando a mídia contém seções criptografadas e não criptografadas, talvez seja interessante usar o marcador de posição DrmSessions para evitar a recriação de decodificadores quando ocorrem transições entre seções criptografadas e não criptografadas. O uso do marcador 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 o DrmSessionManager usado para reprodução, ele poderá
implementar um DrmSessionManagerProvider e transmiti-lo ao
MediaSource.Factory, que é usado ao criar o player. O provedor pode
escolher se vai instanciar uma nova instância de 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);
Melhorar o desempenho da reprodução
Se você estiver enfrentando problemas de travamento de vídeo ao reproduzir conteúdo protegido por DRM em um dispositivo com qualquer versão do Android, do Android 6.0 (nível 23 da API) até o Android 11 (nível 30 da API), inclusive, tente ativar o enfileiramento assíncrono de buffers.