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.