DASH

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 dans le fichier manifeste DASH (CEA-608 est une exception, comme indiqué dans le tableau ci-dessous). Les formats d'échantillons audio et vidéo contenus doivent également être compatibles (consultez la section Exemples de formats pour en savoir plus).

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 prise en charge 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é au format FMP4 lorsqu'il est signalé à l'aide de descripteurs d'accessibilité SCTE
CEA-708 OUI Intégré au format FMP4 lorsqu'il est signalé à l'aide de descripteurs d'accessibilité SCTE
Métadonnées
Métadonnées EMSG OUI Intégrés au format FMP4
Protection du contenu
Widevine OUI Scénario "cenc" : API 19 et versions ultérieures ; scénario "cbcs" : API 25 et versions ultérieures
PlayReady SL2000 OUI Android TV, schéma "cenc" uniquement
ClearKey OUI API 21+, schéma "cenc" uniquement
Lecture en direct
Lecture en direct régulière OUI
Lecture en direct CMAF à latence ultrafaible OUI
CMCD (Common Media Client Data) OUI Guide d'intégration

Utilisation de MediaItem

Pour lire un flux DASH, vous devez dépendre du module DASH.

Kotlin

implementation("androidx.media3:media3-exoplayer-dash:1.4.1")

Groovy

implementation "androidx.media3:media3-exoplayer-dash:1.4.1"

Vous pouvez ensuite créer un MediaItem pour un URI MPD DASH 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 entre les représentations définies dans le fichier manifeste, en tenant compte à la fois de la bande passante disponible et des fonctionnalité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é en 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 peut se produire 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, @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 vous permet de personnaliser l'expérience de lecture en fonction des besoins de votre application de plusieurs façons. Pour en savoir plus, consultez la page Personnalisation.