L'API playlist si basa su istanze MediaItem
, che possono essere create comodamente
utilizzando MediaItem.Builder
. All'interno del player, un MediaItem
viene convertito in un MediaSource
riproducibile da un MediaSource.Factory
. Senza
configurazione personalizzata,
questa conversione viene eseguita da un DefaultMediaSourceFactory
, che
è in grado di creare complesse fonti multimediali corrispondenti alle proprietà del
elemento multimediale. Di seguito sono riportate alcune delle proprietà che possono essere impostate sugli elementi multimediali.
Elementi multimediali semplici
Un elemento multimediale costituito solo dall'URI dello stream può essere creato con il metodo di utilità fromUri
:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
Per tutti gli altri casi, puoi utilizzare un MediaItem.Builder
. Nell'esempio seguente,
l'elemento multimediale viene creato con un ID e alcuni metadati allegati:
Kotlin
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
Allegare metadati può essere utile per aggiornando l'UI dell'app quando avvengono le transizioni delle playlist.
Immagini
Per la riproduzione delle immagini è necessario specificare una durata nell'elemento multimediale l'immagine dovrebbe essere mostrata durante la riproduzione. Consulta le Nella pagina della guida Immagini per saperne di più su Foto in movimento e Librerie per il caricamento delle immagini (ad esempio Glide).
Kotlin
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
Estensioni file non standard per contenuti multimediali adattivi
ExoPlayer fornisce origini multimediali adattive per DASH, HLS e Streaming fluido. Se l'URI di un elemento multimediale adattabile termina con un'estensione di file standard, l'origine multimediale corrispondente viene creata automaticamente. Se L'URI ha un'estensione non standard o nessuna estensione, il tipo MIME può da impostare in modo esplicito per indicare il tipo di elemento multimediale:
Kotlin
val mediaItem = MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();
Per i flussi multimediali progressivi non è richiesto un tipo MIME.
Contenuti protetti
Per i contenuti protetti, devono essere impostate le proprietà DRM dell'elemento multimediale. L'UUID è obbligatorio, mentre tutte le altre proprietà sono facoltative.
Una configurazione di esempio per la riproduzione di un elemento protetto con Widevine DRM in cui l'URI della licenza non è disponibile direttamente nei contenuti multimediali (ad es. in una playlist DASH) e sono necessarie più sessioni (ad es. a causa della rotazione della chiave):
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build()) .build();
All'interno del
player, DefaultMediaSourceFactory
passerà queste proprietà a un
DrmSessionManagerProvider
per ottenere un DrmSessionManager
, che viene poi
iniettato nel MediaSource
creato. Il comportamento DRM può essere
personalizzato ulteriormente
in base alle tue esigenze.
Caricamento tramite sideload delle tracce dei sottotitoli
Per installare tramite sideload le tracce dei sottotitoli, è possibile aggiungere MediaItem.Subtitle
istanze quando
per creare un elemento multimediale:
Kotlin
val subtitle = SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build() val mediaItem = MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()
Java
MediaItem.SubtitleConfiguration subtitle = new MediaItem.SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build(); MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setSubtitleConfigurations(ImmutableList.of(subtitle)) .build();
Internamente, DefaultMediaSourceFactory
userà un MergingMediaSource
per
la fonte dei contenuti multimediali con un SingleSampleMediaSource
per ogni
traccia dei sottotitoli. DefaultMediaSourceFactory
non supporta il sideload
sottotitoli codificati per i DASH di più periodi.
Clip di uno stream multimediale
Per ritagliare i contenuti a cui fa riferimento un elemento multimediale, imposta le posizioni iniziale e finale personalizzate:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( new ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build()) .build();
Internamente, DefaultMediaSourceFactory
utilizzerà un ClippingMediaSource
per avvolgere
l'origine media dei contenuti. Esistono altre proprietà di ritaglio. Per ulteriori dettagli, consulta la MediaItem.Builder
documentazione Javadoc.
Inserimento degli annunci
Per inserire gli annunci, è necessario impostare la proprietà URI del tag annuncio di un elemento multimediale:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
Internamente, DefaultMediaSourceFactory
aggrega la fonte multimediale dei contenuti in una
AdsMediaSource
per inserire gli annunci come definito dal tag annuncio. Affinché funzioni, il
DefaultMediaSourceFactory
player deve essere configurato di conseguenza.