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 di 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. Alcune delle proprietà che possono essere impostate sugli elementi multimediali sono indicate di seguito.

Elementi multimediali semplici

Un elemento multimediale costituito solo dall'URI dello stream può essere creato con l'fromUri pratico:

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, 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 adattivo termina con uno viene creata automaticamente l'origine multimediale corrispondente. 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, tutte le altre 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 player, DefaultMediaSourceFactory passerà queste proprietà a un DrmSessionManagerProvider per ottenere un DrmSessionManager, che quindi inserito nel MediaSource creato. Il comportamento dei DRM può essere Ulteriore personalizzazione 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.

Creazione di clip a uno stream multimediale

Per tagliare i contenuti a cui fa riferimento un elemento multimediale, imposta l'opzione posizioni di inizio e fine:

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 userà ClippingMediaSource per eseguire il wrapping la fonte multimediale dei contenuti. Esistono altre proprietà di ritaglio. Consulta le MediaItem.Builder Javadoc per ulteriori dettagli.

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 la fonte multimediale dei contenuti in un AdsMediaSource per inserire gli annunci come definito dal tag annuncio. Affinché questo comando funzioni, il player deve avere anche il suo DefaultMediaSourceFactory configurati di conseguenza.