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 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 del flusso 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();

Allegare metadati può essere utile per aggiornare l'interfaccia utente dell'app quando avvengono le transizioni delle playlist.

Gestione delle estensioni dei file non standard

ExoPlayer fornisce origini multimediali adattive per DASH, HLS e smoothStreaming. Se l'URI di un elemento multimediale adattivo termina con un'estensione 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 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 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 esempio in una playlist DASH) e sono richieste più sessioni (ad esempio 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 DrmSessionManagerProvider per ottenere un DrmSessionManager, che viene poi iniettato nel MediaSource creato. Il comportamento DRM può essere ancora più personalizzato in base alle tue esigenze.

Caricamento tramite sideload delle tracce dei sottotitoli

Per trasferire tramite sideload le tracce dei 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 utilizzerà un MergingMediaSource per combinare la fonte multimediale dei contenuti con un SingleSampleMediaSource per ogni traccia di sottotitoli. DefaultMediaSourceFactory non supporta il sideload per i sottotitoli per DASH in più periodi.

Creazione di clip a uno stream multimediale

Per tagliare 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 eseguire il wrapping della fonte multimediale dei contenuti. Esistono altre proprietà di ritaglio. Per ulteriori dettagli, consulta il Javadoc 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 la fonte di contenuti multimediali in un AdsMediaSource per inserire gli annunci come definito dal tag annuncio. Affinché questo comando funzioni, il player deve anche avere DefaultMediaSourceFactory configurato di conseguenza.