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 requeridas para los diferentes esquemas de DRM compatibles, junto con los formatos de transmisión para los que son compatibles:

Esquema de DRM Número de versión de Android Nivel de Android API Formatos compatibles
Widevine "cenc" 4.4 19 DASH, 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 de 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 es adecuada para la mayoría de los casos de uso. Para algunos casos de uso, es posible que se requieran 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 claves

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 las siguientes dos maneras, según la configuración del 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) es fluida, incluso si usan claves diferentes.

Siempre que sea posible, te recomendamos que configures 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 pasando true a MediaItem.DrmConfiguration.Builder.setMultiSession cuando se compila el elemento multimedia.

No recomendamos configurar el servidor de licencias para que se comporte de esta manera. Requiere solicitudes de licencias adicionales para reproducir contenido de varias claves, lo que 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. Para habilitar el uso del marcador de posición DrmSessions para pistas de audio y video, pasa true a MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks cuando compiles el elemento multimedia.

Usa un DrmSessionManager personalizado

Si una app desea 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 una instancia de administrador nueva cada vez o no. 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 la reproducción

Si experimentas interrupciones en el video cuando reproduces contenido protegido por DRM en un dispositivo que ejecuta cualquier versión de Android desde Android 6.0 (nivel de API 23) hasta Android 11 (nivel de API 30) inclusive, puedes habilitar la fila de búfer asíncrona.