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 DRM compatibles, junto con los formatos de transmisión compatibles:

Esquema 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, HLS (solo FMP4)
ClearKey "cenc" 5.0 21 DASH
PlayReady SL2000 "cenc" Android TV Android TV DASH, Smooth Streaming, HLS (solo FMP4)

Para reproducir contenido protegido por DRM con ExoPlayer, se debe especificar el UUID del sistema DRM y el URI del servidor de licencias cuando se compila un elemento multimedia. 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 claves

El contenido de varias claves consta de varias transmisiones, en las que algunas usan claves diferentes. 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 para que, cuando reciba una solicitud de una clave, responda con todas las claves del contenido. ExoPlayer se encarga de este caso sin la necesidad de una configuración especial. La adaptación entre transmisiones (p.ej., video en SD y HD) es perfecta incluso si se usan claves distintas.

Siempre que sea posible, te recomendamos que configures el 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 responde solo con la clave solicitada

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

No te 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 que es menos eficiente y sólido que la alternativa descrita anteriormente.

Claves sin conexión

Para cargar un conjunto de claves sin conexión, 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 se usan cuando se reproduce contenido encriptado. Cuando el contenido multimedia contiene secciones claras y encriptadas, es posible que quieras usar el marcador de posición DrmSessions para evitar la recreación de decodificadores cuando se producen transiciones entre secciones claras y encriptadas. Se puede habilitar el uso del marcador de posición DrmSessions para pistas de audio y video pasando true a MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks cuando se compila el elemento multimedia.

Usa 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 desea crear una instancia de administrador nueva cada vez. Para usar siempre la misma instancia, sigue estos pasos:

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 interrupciones 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) inclusive, puedes intentar habilitar la cola de búfer asíncrona.