Gestion des droits numériques

ExoPlayer utilise l'API MediaDrm d'Android pour assurer la lecture protégée par DRM. Les versions d'Android minimales requises pour les différents schémas DRM compatibles, ainsi que les formats de streaming compatibles, sont décrits dans le tableau suivant:

schéma DRM Numéro de version d'Android Niveau d'API Android Formats compatibles
"cenc" de Widevine 4.4 19 DASH, HLS (FMP4 uniquement)
"cbcs" Widevine 7.1 25 DASH, HLS (FMP4 uniquement)
ClearKey "cenc" 5,0 21 DASH
PlayReady SL2000 "cenc" Android TV Android TV DASH, SmoothStreaming, HLS (FMP4 uniquement)

Pour lire du contenu protégé par DRM avec ExoPlayer, l'UUID du système DRM et l'URI du serveur de licences doivent être spécifiés lors de la création d'un élément multimédia. Le lecteur utilisera ensuite ces propriétés pour créer une implémentation par défaut de DrmSessionManager, appelée DefaultDrmSessionManager, adaptée à la plupart des cas d'utilisation. Dans certains cas d'utilisation, des propriétés DRM supplémentaires peuvent être nécessaires, comme indiqué dans les sections suivantes.

Rotation des clés

Pour lire des flux avec des clés en rotation, transmettez true à MediaItem.DrmConfiguration.Builder.setMultiSession lors de la création de l'élément multimédia.

Contenu à touches multiples

Le contenu à plusieurs clés se compose de plusieurs flux, certains utilisant des clés différentes. Le contenu multitouch peut être lu de l'une des deux manières suivantes, selon la configuration du serveur de licences.

Cas 1: le serveur de licences répond en fournissant toutes les clés pour le contenu

Dans ce cas, le serveur de licences est configuré de sorte que lorsqu'il reçoit une requête pour une clé, il répond avec toutes les clés pour le contenu. Ce cas est géré par ExoPlayer sans aucune configuration particulière. L'adaptation entre les flux (par exemple, vidéo SD et HD) est fluide, même s'ils utilisent des clés différentes.

Dans la mesure du possible, nous vous recommandons de configurer votre serveur de licences pour qu'il se comporte de cette manière. Il s'agit du moyen le plus efficace et le plus robuste de prendre en charge la lecture de contenu multiclé, car le client n'a pas besoin d'effectuer plusieurs demandes de licence pour accéder aux différents flux.

Cas 2: le serveur de licences répond uniquement avec la clé demandée

Dans ce cas, le serveur de licences est configuré pour répondre uniquement avec la clé spécifiée dans la requête. Vous pouvez lire du contenu multiclé avec cette configuration de serveur de licences en transmettant true à MediaItem.DrmConfiguration.Builder.setMultiSession lors de la création de l'élément multimédia.

Nous vous déconseillons de configurer votre serveur de licences de cette manière. Elle nécessite des demandes de licence supplémentaires pour lire du contenu à plusieurs clés, ce qui est moins efficace et robuste que l'alternative décrite ci-dessus.

Clés hors connexion

Vous pouvez charger un ensemble de clés hors connexion en transmettant son ID à MediaItem.DrmConfiguration.Builder.setKeySetId lors de la création de l'élément multimédia. Cela permet la lecture à l'aide des clés stockées dans le jeu de clés hors connexion avec l'ID spécifié.

Sessions DRM pour un contenu clair

L'utilisation de l'espace réservé DrmSessions permet à ExoPlayer d'utiliser les mêmes décodeurs pour le contenu clair que ceux utilisés lors de la lecture de contenu chiffré. Lorsque le contenu multimédia contient à la fois des sections claires et chiffrées, vous pouvez utiliser l'espace réservé DrmSessions pour éviter de recréer des décodeurs lors des transitions entre des sections claires et chiffrées. Vous pouvez activer l'utilisation de l'espace réservé DrmSessions pour les pistes audio et vidéo en transmettant true à MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks lors de la création de l'élément multimédia.

Utiliser un DrmSessionManager personnalisé

Si une application souhaite personnaliser le DrmSessionManager utilisé pour la lecture, elle peut implémenter un DrmSessionManagerProvider et le transmettre à MediaSource.Factory, qui est utilisé lors de la création du lecteur. Le fournisseur peut choisir d'instancier ou non une nouvelle instance de gestionnaire à chaque fois. Pour toujours utiliser la même instance, procédez comme suit:

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);

Améliorer les performances de lecture

Si vous rencontrez des problèmes de stuttering vidéo lors de la lecture de contenu protégé par DRM sur un appareil exécutant n'importe quelle version d'Android, de la version 6.0 à Android 11 (niveau d'API 30) jusqu'à Android 11 (niveau d'API 30), vous pouvez essayer d'activer la mise en file d'attente de mémoire tampon asynchrone.