Administración de derechos digitales

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

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, el UUID del archivo se debe especificar el sistema cuando creas un elemento multimedia y otras propiedades. El reproductor usará estas propiedades para compilar una implementación predeterminada de DrmSessionManager, llamada DefaultDrmSessionManager, que es adecuado para la mayoría de los casos de uso. Para algunos usos casos, se necesitarán propiedades de DRM adicionales, como se describe en el siguiente secciones.

Rotación de claves

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

Contenido de varias teclas

El contenido de varias claves consta de varias transmisiones, mientras que algunas usan diferentes claves que otras. El contenido de varias teclas se puede reproducir de dos formas distintas, según en 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 reciba un solicita una clave, esta responde con todas las claves del contenido. Este caso es ExoPlayer sin necesidad de ninguna configuración especial. Adaptación entre transmisiones (p.ej., video en SD y HD) es fluida incluso si se usan claves.

Siempre que sea posible, te recomendamos configurar tu servidor de licencias para que se comporte en de una nueva manera. Es la forma más eficiente y sólida de admitir la reproducción de multikey contenido, ya que no requiere que el cliente haga varias solicitudes de licencia para acceder a las distintas 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 especificadas en la solicitud. El contenido de varias claves se puede reproducir con esta licencia configuración del servidor pasando true a MediaItem.DrmConfiguration.Builder.setMultiSession cuando compiles el contenido multimedia elemento.

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

Claves sin conexión

Un conjunto de claves sin conexión puede cargarse pasando el ID del conjunto de claves a MediaItem.DrmConfiguration.Builder.setKeySetId cuando se compila el elemento multimedia. Esto permite la reproducción usando las teclas almacenadas en la clave sin conexión configurada con el 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 el contenido que se usa cuando se reproduce contenido encriptado. Si el contenido multimedia contiene tanto en las secciones claras como encriptadas, puedes usar el marcador de posición DrmSessions para evitar la recreación de decodificadores cuando se realiza la transición entre la información clara y la encriptada de que se produzcan estas secciones. Puedes usar el marcador de posición DrmSessions para las pistas de audio y video. habilitarse pasando true a MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks cuándo crear el elemento multimedia.

Cómo usar un DrmSessionManager personalizado

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

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 los videos se entrecortan cuando reproduces contenido protegido por DRM en un dispositivo con cualquier versión de Android desde Android 6.0 (nivel de API 23) hasta incluido Android 11 (nivel de API 30), puedes intentar habilitar el búfer asíncrono Agregar a una fila