Gerenciamento de direitos digitais

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.