Utiliser MediaPlayer et la gestion des droits numériques (DRM)

À partir d'Android 8.0 (niveau d'API 26), MediaPlayer inclut des API compatibles avec la lecture de contenus protégés par DRM. Les API DRM MediaPlayer sont semblables à l'API de bas niveau fournie par MediaDrm, mais elles fonctionnent à un niveau supérieur et n'exposent pas les objets d'extraction, de DRM et de cryptographie sous-jacents.

Bien que l'API DRM MediaPlayer ne fournisse pas toutes les fonctionnalités de MediaDrm, elle est compatible avec les cas d'utilisation les plus courants. L'implémentation actuelle peut gérer les types de contenu suivants:

  • Fichiers multimédias locaux protégés par Widevine
  • Fichiers multimédias en streaming ou à distance protégés par Widevine

L'extrait de code suivant montre comment utiliser les nouvelles méthodes DRM MediaPlayer dans une implémentation synchrone.

Pour gérer les contenus multimédias contrôlés par DRM, vous devez inclure les nouvelles méthodes avec le flux habituel d'appels MediaPlayer, comme illustré dans cet exemple:

Kotlin

mediaPlayer?.apply {
    setDataSource()
    setOnDrmConfigHelper() // optional, for custom configuration
    prepare()
    drmInfo?.also {
        prepareDrm()
        getKeyRequest()
        provideKeyResponse()
    }

    // MediaPlayer is now ready to use
    start()
    // ...play/pause/resume...
    stop()
    releaseDrm()
}

Java

setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
  prepareDrm();
  getKeyRequest();
  provideKeyResponse();
}

// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();

Commencez par initialiser l'objet MediaPlayer et définir sa source à l'aide de setDataSource(), comme d'habitude. Pour utiliser la protection DRM, procédez comme suit:

  1. Si vous souhaitez que votre application effectue une configuration personnalisée, définissez une interface OnDrmConfigHelper et associez-la au lecteur à l'aide de setOnDrmConfigHelper().
  2. Appelez prepare().
  3. Appelez getDrmInfo(). Si la source contient du contenu DRM, la méthode renvoie une valeur MediaPlayer.DrmInfo non nulle.

Si MediaPlayer.DrmInfo existe:

  1. Examinez la carte des UUID disponibles et choisissez-en un.
  2. Préparez la configuration DRM pour la source actuelle en appelant prepareDrm().
    • Si vous avez créé et enregistré un rappel OnDrmConfigHelper, il est appelé pendant l'exécution de prepareDrm(). Vous pouvez ainsi effectuer une configuration personnalisée des propriétés DRM avant d'ouvrir la session DRM. Le rappel est appelé de manière synchrone dans le thread qui a appelé prepareDrm(). Pour accéder aux propriétés DRM, appelez getDrmPropertyString() et setDrmPropertyString(). Évitez d'effectuer des opérations longues.
    • Si l'appareil n'a pas encore été provisionné, prepareDrm() accède également au serveur de provisionnement pour le provisionner. Cette opération peut prendre un certain temps, en fonction de la connectivité réseau.
  3. Pour obtenir un tableau d'octets de requête de clé opaque à envoyer à un serveur de licence, appelez getKeyRequest().
  4. Pour informer le moteur DRM de la réponse de clé reçue du serveur de licences, appelez provideKeyResponse(). Le résultat dépend du type de requête de clé :
    • Si la réponse concerne une requête de clé hors connexion, le résultat est un identifiant de jeu de clés. Vous pouvez utiliser cet identifiant de jeu de clés avec restoreKeys() pour restaurer les clés dans une nouvelle session.
    • Si la réponse concerne une requête de streaming ou de publication, le résultat est nul.

Préparer la DRM de manière asynchrone

Par défaut, prepareDrm() s'exécute de manière synchrone, ce qui bloque l'exécution jusqu'à la fin de la préparation. Toutefois, la toute première préparation DRM sur un nouvel appareil peut également nécessiter un provisionnement, géré en interne par prepareDrm(), et peut prendre un certain temps en raison de l'opération réseau impliquée. Vous pouvez éviter le blocage sur prepareDrm() en définissant et en définissant un MediaPlayer.OnDrmPreparedListener.

Définissez un OnDrmPreparedListener. prepareDrm() effectue le provisionnement (si nécessaire) et la préparation en arrière-plan. Une fois le provisionnement et la préparation terminés, le système appelle l'écouteur. Ne faites aucune hypothèse sur la séquence d'appel ni sur le thread dans lequel l'écouteur s'exécute (sauf si vous enregistrez l'écouteur avec un thread de gestionnaire). Le système peut appeler l'écouteur avant ou après le retour de prepareDrm().

Configurer la DRM de manière asynchrone

Vous pouvez initialiser le DRM de manière asynchrone en créant et en enregistrant MediaPlayer.OnDrmInfoListener pour la préparation du DRM et MediaPlayer.OnDrmPreparedListener pour démarrer le lecteur. Ils fonctionnent avec prepareAsync(), comme illustré dans cet exemple:

Kotlin

setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...

// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
    mediaPlayer.apply {
        prepareDrm()
        getKeyRequest()
        provideKeyResponse()
    }
}

// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
    mediaPlayer.start()
}

Java

setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...

// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
  prepareDrm();
  getKeyRequest();
  provideKeyResponse();
}

// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {

start();
}

Gérer les éléments multimédias chiffrés

À partir d'Android 8.0 (niveau d'API 26), MediaPlayer peut également déchiffrer le schéma de chiffrement commun (CENC) et les médias chiffrés au niveau de l'échantillon HLS (METHOD=SAMPLE-AES) pour les types de flux élémentaires H.264 et AAC. Les contenus multimédias chiffrés sur l'intégralité du segment (METHOD=AES-128) étaient auparavant compatibles.

En savoir plus

Jetpack Media3 est la solution recommandée pour la lecture multimédia dans votre application. En savoir plus

Ces pages traitent des sujets liés à l'enregistrement, au stockage et à la lecture d'audio et de vidéo: