ExoPlayer supporta DASH con più formati di contenitori. Gli stream multimediali devono essere
demux, ovvero video, audio e testo devono essere definiti in elementi
AdaptationSet
distinti nel manifest DASH (il CEA-608 è un'eccezione come descritto
nella tabella di seguito). Devono essere supportati anche i formati di esempio audio e video contenuti (per informazioni dettagliate, consulta la sezione sui formati di esempio).
Funzionalità | Prove di supporto | Commenti |
---|---|---|
Container | ||
FMP4 | SÌ | Solo stream demuxati |
WebM | SÌ | Solo stream demuxati |
Matroska | SÌ | Solo stream demuxati |
MPEG-TS | NO | Nessun supporto pianificato |
Sottotitoli codificati | ||
TCF | SÌ | Grezzo o incorporato in FMP4 secondo lo standard ISO/IEC 14496-30 |
WebVTT | SÌ | Grezzo o incorporato in FMP4 secondo lo standard ISO/IEC 14496-30 |
CEA-608 | SÌ | Incorporato in FMP4 quando segnalato tramite i descrittori di accessibilità SCTE |
CEA-708 | SÌ | Incorporato in FMP4 quando segnalato tramite i descrittori di accessibilità SCTE |
Metadati | ||
Metadati EMSG | SÌ | Incorporato in FMP4 |
Protezione dei contenuti | ||
Widevine | SÌ | Schema "cenc": API 19+; schema "cbcs": API 25+ |
PlayReady SL2000 | SÌ | Android TV, solo schema "cenc" |
Cancella chiave | SÌ | API 21+, solo schema "cenc" |
Riproduzione in diretta | ||
Riproduzione regolare dal vivo | SÌ | |
Riproduzione dal vivo CMAF a latenza molto bassa | SÌ | |
Dati Common Media Client Client (CMCD) | SÌ | Guida all'integrazione |
Utilizzo di MediaItem
Per riprodurre uno stream DASH, devi dipendere dal modulo DASH.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.3.1")
Alla moda
implementation "androidx.media3:media3-exoplayer-dash:1.3.1"
Potrai quindi creare un MediaItem
per l'URI DASH MPD e passarlo al player.
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();
Se l'URI non termina con .mpd
, puoi passare MimeTypes.APPLICATION_MPD
a setMimeType
di MediaItem.Builder
per indicare esplicitamente il tipo di contenuti.
ExoPlayer si adatta automaticamente tra le rappresentazioni definite nel manifest, tenendo conto della larghezza di banda disponibile e delle funzionalità del dispositivo.
Utilizzo di DashMediaSource
Per ulteriori opzioni di personalizzazione, puoi creare un DashMediaSource
e passarlo
direttamente al player anziché 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();
Accedere al file manifest
Puoi recuperare il manifest attuale chiamando Player.getCurrentManifest
.
Per DASH, devi trasmettere l'oggetto restituito a DashManifest
. Il
callback onTimelineChanged
di Player.Listener
viene chiamato anche
ogni volta che viene caricato il manifest. Ciò accadrà una volta per i contenuti on demand e
possibilmente più volte per i contenuti live. Il seguente snippet di codice mostra come un'app
può eseguire un'azione ogni volta che viene caricato il file manifest.
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. } } });
Personalizzazione della riproduzione
ExoPlayer fornisce diversi modi per personalizzare l'esperienza di riproduzione in base alle esigenze della tua app. Consulta la pagina Personalizzazione per alcuni esempi.