Administración de derechos digitales

ExoPlayer usa la API de MediaDrm de Android para admitir la reproducción protegida por DRM. En la siguiente tabla, se describen las versiones mínimas de Android que se requieren para los diferentes esquemas de DRM compatibles, junto con los formatos de transmisión que son compatibles:

Esquema DRM Número de versión de Android Nivel de Android API Formatos compatibles
Widevine “cenc” 4.4 19 DASH y HLS (solo FMP4)
Widevine “cbcs” 7.1 25 DASH y HLS (solo FMP4)
ClearKey “cenc” 5.0 21 DASH
PlayReady SL2000 "cenc" Android TV Android TV DASH, SmoothStreaming, HLS (solo FMP4)

Para reproducir contenido protegido por DRM con ExoPlayer, se debe especificar el UUID del sistema DRM cuando se compila un elemento multimedia, y también se pueden proporcionar otras propiedades. Luego, el reproductor usará estas propiedades para compilar una implementación predeterminada de DrmSessionManager, llamada DefaultDrmSessionManager, que sea adecuada para la mayoría de los casos de uso. Para algunos casos de uso, es posible que se necesiten propiedades de DRM adicionales, como se describe en las siguientes secciones.

Rotación de claves

Para reproducir transmisiones con claves rotativas, pasa true a MediaItem.DrmConfiguration.Builder.setMultiSession cuando compiles el elemento multimedia.

Contenido de varias teclas

El contenido de varias claves consta de varias transmisiones, en las que algunas usan claves diferentes que otras. El contenido de varias claves se puede reproducir de una de dos maneras, según cómo esté configurado el servidor de licencias.

Caso 1: El servidor de licencias responde con todas las claves del contenido

En este caso, el servidor de licencias está configurado de modo que, cuando recibe una solicitud de una clave, responda con todas las claves del contenido. ExoPlayer se encarga de este caso sin necesidad de ninguna configuración especial. La adaptación entre transmisiones (p.ej., videos en SD y HD) no presenta inconvenientes, incluso si se usan claves diferentes.

Siempre que sea posible, te recomendamos configurar tu servidor de licencias para que se comporte de esta manera. Es la forma más eficiente y sólida de admitir la reproducción de contenido de varias claves, ya que no requiere que el cliente realice varias solicitudes de licencia para acceder a las diferentes transmisiones.

Caso 2: El servidor de licencias solo responde con la clave solicitada

En este caso, el servidor de licencias está configurado para responder solo con la clave especificada en la solicitud. El contenido de varias claves se puede reproducir con esta configuración del servidor de licencias. Para ello, pasa true a MediaItem.DrmConfiguration.Builder.setMultiSession cuando se compila el elemento multimedia.

No recomendamos configurar tu servidor de licencias para que se comporte de esta manera. Se requieren solicitudes de licencia adicionales para reproducir contenido de varias claves, lo cual es menos eficiente y sólido que la alternativa descrita anteriormente.

Claves sin conexión

Se puede cargar un conjunto de claves sin conexión si se pasa el ID del conjunto de claves a MediaItem.DrmConfiguration.Builder.setKeySetId cuando se compila el elemento multimedia. Esto permite la reproducción con las claves almacenadas en el conjunto de claves sin conexión con el ID especificado.

Sesiones de DRM para contenido claro

El uso del marcador de posición DrmSessions permite que ExoPlayer use los mismos decodificadores para borrar contenido que cuando se reproduce contenido encriptado. Cuando el contenido multimedia contenga secciones claras y encriptadas, te recomendamos que uses el marcador de posición DrmSessions para evitar la recreación de decodificadores cuando se producen transiciones entre las secciones claras y encriptadas. Se puede habilitar el uso del marcador de posición DrmSessions para las pistas de audio y video pasando true a MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks cuando se compila el elemento multimedia.

Cómo usar un DrmSessionManager personalizado

Si una app quiere personalizar el DrmSessionManager que se usa para la reproducción, puede implementar un DrmSessionManagerProvider y pasarlo al MediaSource.Factory que se usa cuando se compila el reproductor. El proveedor puede elegir si crear o no una nueva instancia de administrador cada vez. Para usar siempre la misma instancia, haz lo siguiente:

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);

Cómo mejorar el rendimiento de reproducción

Si experimentas un salto de video cuando reproduces contenido protegido por DRM en un dispositivo que ejecuta cualquier versión de Android 6.0 (nivel de API 23) hasta Android 11 (nivel de API 30), puedes intentar habilitar la cola de búfer asíncrono.