À 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:
- Si vous souhaitez que votre application effectue une configuration personnalisée, définissez une interface
OnDrmConfigHelper
et associez-la au lecteur à l'aide desetOnDrmConfigHelper()
. - Appelez
prepare()
. - Appelez
getDrmInfo()
. Si la source contient du contenu DRM, la méthode renvoie une valeurMediaPlayer.DrmInfo
non 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é pendant l'exécution deprepareDrm()
. 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, appelezgetDrmPropertyString()
etsetDrmPropertyString()
. É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.
- Si vous avez créé et enregistré un rappel
- Pour obtenir un tableau d'octets de requête de clé opaque à envoyer à un serveur de licence, 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 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.
- 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
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: