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, bem como com os formatos de streaming suportados, são descritos no 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)
"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 DRM sistema deve ser especificado ao criar um item de mídia, entre outros também podem ser fornecidas. O player usará essas propriedades para criar uma implementação padrão de DrmSessionManager, chamada DefaultDrmSessionManager, que é adequado para a maioria dos casos de uso. Para algum uso podem ser necessárias propriedades de DRM adicionais, conforme descrito nos itens a seguir em outras seções.

Rotação de chaves

Para reproduzir transmissões com teclas giratórias, transmita true para MediaItem.DrmConfiguration.Builder.setMultiSession ao criar a mídia do item de linha.

Conteúdo com várias chaves

O conteúdo com várias chaves consiste em vários streams, em que alguns usam diferentes chaves do que outras. O conteúdo com várias teclas pode ser reproduzido de duas maneiras, dependendo sobre a configuração do servidor de licenças.

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, quando receber uma para uma chave, ele responde com todas as chaves do conteúdo. Este caso é manipulados pelo ExoPlayer sem a necessidade de nenhuma configuração especial. Adaptação entre streams (por exemplo, vídeos em SD e HD) seja perfeita, mesmo que usem diferentes chaves.

Sempre que possível, recomendamos que você configure seu servidor de licenças para se comportar nesse de um jeito fácil. É a maneira mais eficiente e robusta de oferecer suporte à reprodução de várias teclas conteúdo, porque ele 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 é configurado para responder apenas com a chave especificado na solicitação. Conteúdo com várias teclas pode ser reproduzido com esta licença a configuração do servidor passando true para MediaItem.DrmConfiguration.Builder.setMultiSession ao criar a mídia do item de linha.

Não recomendamos que você configure seu servidor de licenças para ter esse comportamento. Ela requer solicitações de licença extras para reproduzir conteúdo com várias chaves, o que é menos eficiente e robusta do que a alternativa descrita acima.

Chaves off-line

Um conjunto de chaves off-line pode ser carregado passando 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 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, assim como é usado ao reproduzir conteúdo criptografado. Quando a mídia contiver seções claras e criptografadas, use o marcador DrmSessions para evitar a recriação de decodificadores quando as transições entre claros e criptografados ocorrer. O uso do marcador DrmSessions para faixas de áudio e vídeo pode ser ativados transmitindo true para MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks quando criando o item de mídia.

Usar um DrmSessionManager personalizado

Se um app quiser personalizar o DrmSessionManager usado para reprodução, ele pode implementar um DrmSessionManagerProvider e transmiti-lo ao MediaSource.Factory, que é usado na criação do player. O provedor pode escolha se deseja instanciar uma nova instância do gerenciador a cada vez ou não. Para sempre use 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 você tiver problemas com falhas no vídeo ao reproduzir conteúdo protegido por DRM em um dispositivos com qualquer versão do Android, desde a versão 6.0 (nível 23 da API) até incluindo o Android 11 (nível 30 da API), tente ativar o buffer assíncrono enfileiramento.