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