Elementi multimediali

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 una configurazione personalizzata, questa conversione viene eseguita da un DefaultMediaSourceFactory, in grado di creare origini media complesse corrispondenti alle proprietà dell'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 pratico fromUri:

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

Per 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();

L'aggiunta di metadati può essere utile per aggiornare la UI della tua app quando si verificano transizioni tra playlist.

Immagini

La riproduzione delle immagini richiede una durata nell'elemento multimediale per specificare per quanto tempo l'immagine deve essere mostrata durante la riproduzione. Per ulteriori informazioni su foto di movimento e librerie di caricamento delle immagini (ad esempio Glide), consulta la pagina della guida Immagini.

Kotlin

val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();

Estensioni dei file non standard per i contenuti multimediali adattivi

ExoPlayer fornisce origini multimediali adattive per DASH, HLS e Smooth Streaming. Se l'URI di un elemento multimediale adattivo termina con un'estensione di file standard, viene creata automaticamente l'origine media corrispondente. Se l'URI ha un'estensione non standard o nessuna estensione, il tipo MIME può essere impostato 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 gli stream multimediali progressivi non è necessario un tipo MIME.

Contenuti protetti

Per i contenuti protetti, devono essere impostate le proprietà DRM dell'elemento multimediale. L'UUID è obbligatorio, tutte le altre proprietà sono facoltative.

Un esempio di configurazione 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 delle chiavi):

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 verrà poi inserito nel MediaSource creato. Il comportamento della gestione dei diritti digitali può essere ulteriormente personalizzato in base alle tue esigenze.

Caricare lateralmente le tracce dei sottotitoli

Per caricare lateralmente le tracce dei sottotitoli codificati, è possibile aggiungere MediaItem.Subtitle istanze durante la creazione di un elemento multimediale:

Kotlin

val subtitle =
  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()
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 utilizzerà un MergingMediaSource per combinare l'origine media dei contenuti con un SingleSampleMediaSource per ogni traccia dei sottotitoli codificati. DefaultMediaSourceFactory non supporta il caricamento laterale dei sottotitoli codificati per DASH multi-periodo.

Tagliare uno stream di contenuti multimediali

Per tagliare i contenuti a cui fa riferimento un elemento multimediale, imposta 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 racchiudere l'origine media dei contenuti. Esistono altre proprietà di ritaglio. Per ulteriori dettagli, consulta la documentazione Javadoc di MediaItem.Builder.

Inserimento degli annunci

Per inserire gli annunci, deve essere impostata la proprietà URI del tag annuncio di un elemento multimediale:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

Internamente, DefaultMediaSourceFactory eseguirà il wrapping dell'origine media dei contenuti in un AdsMediaSource per inserire gli annunci come definito dal tag annuncio. Affinché questa operazione funzioni, il player deve anche avere il DefaultMediaSourceFactory configurato di conseguenza.