À partir d'Android 8.0 (niveau d'API 26), MediaPlayer inclut des API qui permettent la lecture de contenu protégé par DRM. Les API MediaPlayer DRM 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, DRM et cryptographiques sous-jacents.
Bien que l'API MediaPlayer DRM 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 distants ou en streaming protégés par Widevine
L'extrait de code suivant montre comment utiliser les nouvelles méthodes MediaPlayer DRM dans une implémentation synchrone.
Pour gérer les contenus multimédias contrôlés par DRM, vous devez inclure les nouvelles méthodes en plus du flux habituel d'appels MediaPlayer, comme indiqué 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éfinissez sa source à l'aide de setDataSource(), comme d'habitude. Pour utiliser la DRM, procédez comme suit :
- Si vous souhaitez que votre application effectue une configuration personnalisée, définissez une interface
OnDrmConfigHelperet associez-la au lecteur à l'aide desetOnDrmConfigHelper(). - Appelez
prepare(). - Appelez
getDrmInfo(). Si la source contient du contenu DRM, la méthode renvoie une valeurMediaPlayer.DrmInfonon nulle.
Si MediaPlayer.DrmInfo existe :
- Examinez la carte des UUID disponibles et choisissez-en un.
- Préparez la configuration DRM pour la source actuelle en appelant
prepareDrm().- Si vous avez créé et enregistré un rappel
OnDrmConfigHelper, il est appelé lors de l'exécution deprepareDrm(). Cela vous permet de configurer les propriétés DRM de manière personnalisée 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, appelezgetDrmPropertyString()etsetDrmPropertyString(). Évitez d'effectuer des opérations de longue durée. - Si l'appareil n'a pas encore été provisionné,
prepareDrm()accède également au serveur de provisionnement pour provisionner l'appareil. Cette opération peut prendre un certain temps, en fonction de la connectivité réseau.
- Si vous avez créé et enregistré un rappel
- Pour obtenir un tableau d'octets de requête de clé opaque à envoyer à un serveur de licences, appelez
getKeyRequest(). - 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 demande de clé :- Si la réponse concerne une demande 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 demande de streaming ou de sortie, le résultat est nul.
- Si la réponse concerne une demande 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
Préparer la DRM de manière asynchrone
Par défaut, prepareDrm() s'exécute de manière synchrone et se bloque 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, que prepareDrm() gère en interne. L'opération 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. Elles fonctionnent conjointement 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 les contenus multimédias chiffrés au niveau des échantillons CENC (Common Encryption Scheme) et HLS (METHOD=SAMPLE-AES) pour les types de flux élémentaires H.264 et AAC. Les contenus multimédias chiffrés par segment complet (METHOD=AES-128) étaient auparavant acceptés.
En savoir plus
Jetpack Media3 est la solution recommandée pour la lecture de contenus multimédias dans votre application. En savoir plus
Ces pages abordent des sujets liés à l'enregistrement, au stockage et à la lecture de contenus audio et vidéo :