ExoPlayer est compatible avec DASH avec plusieurs formats de conteneur. Les flux multimédias doivent être démultiplexés, ce qui signifie que la vidéo, l'audio et le texte doivent être définis dans des éléments AdaptationSet distincts du fichier manifeste DASH (CEA-608 est une exception, comme décrit dans le tableau ci-dessous). Les formats d'échantillons audio et vidéo contenus doivent également être compatibles (pour en savoir plus, consultez la section Formats d'échantillons).
| Fonctionnalité | Compatible | Commentaires |
|---|---|---|
| Conteneurs | ||
| FMP4 | OUI | Flux démultiplexés uniquement |
| WebM | OUI | Flux démultiplexés uniquement |
| Matroska | OUI | Flux démultiplexés uniquement |
| MPEG-TS | NON | Aucune compatibilité prévue |
| Sous-titres | ||
| TTML | OUI | Brut ou intégré dans FMP4 conformément à la norme ISO/IEC 14496-30 |
| WebVTT | OUI | Brut ou intégré dans FMP4 conformément à la norme ISO/IEC 14496-30 |
| CEA-608 | OUI | Intégrés dans FMP4 lorsqu'ils sont signalés à l'aide de descripteurs d'accessibilité SCTE |
| CEA-708 | OUI | Intégrés dans FMP4 lorsqu'ils sont signalés à l'aide de descripteurs d'accessibilité SCTE |
| Métadonnées | ||
| Métadonnées EMSG | OUI | Intégrés dans FMP4 |
| Protection du contenu | ||
| Widevine | OUI | "cenc" : API 19+ ; "cbcs" : API 25+ |
| PlayReady SL2000 | OUI | Android TV, schéma "cenc" uniquement |
| ClearKey | OUI | API 21+, schéma "cenc" uniquement |
| Insertion d'annonces | ||
| Lecture multi-période | OUI | |
| Insertion d'annonces guidée par le serveur (xlinks) | NON | |
| Annonces IMA côté serveur et côté client | OUI | Guide d'insertion d'annonces |
| Lecture en direct | ||
| Lecture en direct standard | OUI | |
| Lecture en direct CMAF à latence ultra-faible | OUI | |
| Common Media Client Data (CMCD) | OUI | Guide d'intégration CMCD |
Utiliser MediaItem
Pour lire un flux DASH, vous devez dépendre du module DASH.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
Groovy
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
Vous pouvez ensuite créer un MediaItem pour un URI DASH MPD et le transmettre au lecteur.
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)) // Prepare the player. player.prepare()
Java
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)); // Prepare the player. player.prepare();
Si votre URI ne se termine pas par .mpd, vous pouvez transmettre MimeTypes.APPLICATION_MPD à setMimeType de MediaItem.Builder pour indiquer explicitement le type de contenu.
ExoPlayer s'adapte automatiquement aux représentations définies dans le fichier manifeste, en tenant compte de la bande passante disponible et des capacités de l'appareil.
Utiliser DashMediaSource
Pour plus d'options de personnalisation, vous pouvez créer un DashMediaSource et le transmettre directement au lecteur au lieu d'un MediaItem.
Kotlin
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() // Create a dash media source pointing to a dash manifest uri. val mediaSource: MediaSource = DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri)) // Create a player instance which gets an adaptive track selector by default. val player = ExoPlayer.Builder(context).build() // Set the media source to be played. player.setMediaSource(mediaSource) // Prepare the player. player.prepare()
Java
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a dash media source pointing to a dash manifest uri. MediaSource mediaSource = new DashMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(dashUri)); // Create a player instance which gets an adaptive track selector by default. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. player.prepare();
Accéder au fichier manifeste
Vous pouvez récupérer le fichier manifeste actuel en appelant Player.getCurrentManifest.
Pour DASH, vous devez caster l'objet renvoyé vers DashManifest. Le rappel onTimelineChanged de Player.Listener est également appelé chaque fois que le fichier manifeste est chargé. Cela se produit une fois pour un contenu à la demande, et potentiellement plusieurs fois pour un contenu en direct. L'extrait de code suivant montre comment une application peut effectuer une action chaque fois que le fichier manifeste est chargé.
Kotlin
player.addListener( object : Player.Listener { override fun onTimelineChanged( timeline: Timeline, @Player.TimelineChangeReason reason: Int, ) { val manifest = player.currentManifest if (manifest is DashManifest) { // Do something with the manifest. } } } )
Java
player.addListener( new Player.Listener() { @Override public void onTimelineChanged( Timeline timeline, @Player.TimelineChangeReason int reason) { Object manifest = player.getCurrentManifest(); if (manifest != null) { DashManifest dashManifest = (DashManifest) manifest; // Do something with the manifest. } } });
Personnaliser la lecture
ExoPlayer propose plusieurs façons d'adapter l'expérience de lecture aux besoins de votre application. Pour obtenir des exemples, consultez la page de personnalisation.