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 configurazione personalizzata, questa conversione viene eseguita da un DefaultMediaSourceFactory, che è capable di creare origini media complesse corrispondenti alle proprietà dell'elemento media. Alcune delle proprietà che possono essere impostate sugli elementi multimediali sono descritte di seguito.

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, 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 l'interfaccia utente dell'app quando si verificano transizioni tra le playlist.

Immagini

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

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 i contenuti multimediali adattabili

ExoPlayer fornisce origini multimediali adattive per DASH, HLS e smoothStreaming. 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ò 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 di contenuti 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.

Un esempio di configurazione per riprodurre un elemento protetto con DRM Widevine in cui l'URI della licenza non è disponibile direttamente nel file multimediale (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 viene poi iniettato nel MediaSource creato. Il comportamento DRM può essere personalizzato ulteriormente in base alle tue esigenze.

Sideload delle tracce dei sottotitoli

Per eseguire il sideload delle tracce dei sottotitoli, puoi aggiungere istanze MediaItem.Subtitle 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 utilizzerà un MergingMediaSource per combinare l'origine media dei contenuti con un SingleSampleMediaSource per ogni traccia dei sottotitoli codificati. DefaultMediaSourceFactory non supporta il sideload dei sottotitoli per DASH con 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();

All'interno, DefaultMediaSourceFactory inserirà la fonte media dei contenuti in un AdsMediaSource per inserire gli annunci come definito dal tag annuncio. Affinché funzioni, il player deve anche avere DefaultMediaSourceFactory configurato di conseguenza.