L'API playlist si basa su istanze MediaItem
, che possono essere comodamente create
utilizzando MediaItem.Builder
. All'interno del player, un MediaItem
viene convertito
in un MediaSource
giocabile da un MediaSource.Factory
. Senza la configurazione personalizzata, questa conversione viene eseguita da un DefaultMediaSourceFactory
, in grado di creare origini multimediali complesse corrispondenti alle proprietà dell'elemento multimediale. Di seguito sono descritte 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 pratico fromUri
:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
In tutti gli altri casi, è possibile utilizzare un MediaItem.Builder
. Nell'esempio seguente, un 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();
Aggiungere metadati può essere utile per aggiornare l'interfaccia utente dell'app quando si verificano transizioni di playlist.
Gestione delle estensioni dei file non standard
ExoPlayer fornisce origini multimediali adattive per DASH, HLS e Streaming uniforme. Se l'URI di un elemento multimediale adattivo termina con un'estensione del file standard, viene creata automaticamente l'origine multimediale corrispondente. Se l'URI ha un'estensione non standard o nessuna estensione, il tipo MIME può essere impostato esplicitamente 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 gli stream multimediali progressivi non è richiesto un tipo MIME.
Contenuti protetti
Per i contenuti protetti, le proprietà DRM dell'elemento multimediale devono essere impostate:
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();
Questo esempio crea un elemento multimediale per i contenuti protetti da Widevine. All'interno del player, DefaultMediaSourceFactory
trasmette queste proprietà a un DrmSessionManagerProvider
per ottenere un DrmSessionManager
, che viene quindi inserito nella risorsa MediaSource
creata. Il comportamento DRM può essere
personalizzato ulteriormente in base alle tue esigenze.
Sideload delle tracce dei sottotitoli
Per installare tramite sideload delle tracce di sottotitoli, puoi aggiungere MediaItem.Subtitle
istanze durante la creazione di 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
combinare la sorgente multimediale dei contenuti con un SingleSampleMediaSource
per ogni
traccia di sottotitoli. DefaultMediaSourceFactory
non supporta il sideload dei sottotitoli per DASH a più periodi.
Creare clip di uno stream multimediale
Per ritagliare i contenuti a cui fa riferimento un elemento multimediale, imposta posizioni di inizio e fine 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 aggregare
l'origine multimediale dei contenuti. Esistono proprietà di ritaglio aggiuntive. Per ulteriori dettagli, consulta il
Javadoc di MediaItem.Builder
.
Inserimento di annunci
Per inserire 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 l'origine multimediale dei contenuti in un
AdsMediaSource
per inserire gli annunci come definito dal tag annuncio. Affinché questo comando funzioni, il player deve anche DefaultMediaSourceFactory
configurare di conseguenza.