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.