Elementos multimedia

La API de playlist se basa en instancias de MediaItem, que se pueden compilar convenientemente con MediaItem.Builder. Dentro del reproductor, un MediaSource.Factory convierte un MediaItem en un MediaSource reproducible. Sin la configuración personalizada, esta conversión se lleva a cabo mediante un DefaultMediaSourceFactory, que puede compilar fuentes multimedia complejas correspondientes a las propiedades del elemento multimedia. A continuación, se describen algunas de las propiedades que se pueden configurar en los elementos multimedia.

Elementos multimedia simples

Un elemento multimedia que consta solo del URI de transmisión se puede compilar con el método de conveniencia fromUri:

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

En todos los demás casos, se puede usar MediaItem.Builder. En el siguiente ejemplo, se compila un elemento multimedia con un ID y algunos metadatos adjuntos:

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

Adjuntar metadatos puede ser útil para actualizar la IU de tu app cuando se producen las transiciones de las listas de reproducción.

Cómo manejar extensiones de archivo no estándar

ExoPlayer proporciona fuentes de contenido multimedia adaptables para DASH, HLS y SmoothStreaming. Si el URI de ese elemento multimedia adaptable termina con una extensión de archivo estándar, se creará automáticamente la fuente de contenido multimedia correspondiente. Si el URI tiene una extensión no estándar o no tiene ninguna, el tipo de MIME se puede configurar de forma explícita para indicar el tipo de elemento multimedia:

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

Para las transmisiones multimedia progresivas, no se requiere un tipo de MIME.

Contenido protegido

Para el contenido protegido, se deben establecer las propiedades DRM del elemento multimedia:

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

En este ejemplo, se crea un elemento multimedia para el contenido protegido por Widevine. Dentro del reproductor, DefaultMediaSourceFactory pasará estas propiedades a DrmSessionManagerProvider para obtener un DrmSessionManager, que luego se insertará en el MediaSource creado. El comportamiento de la DRM se puede personalizar aún más según tus necesidades.

Transferencia de pistas de subtítulos

Para transferir pistas de subtítulos, se pueden agregar instancias de MediaItem.Subtitle cuando se compila un elemento multimedia:

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

De forma interna, DefaultMediaSourceFactory usará un MergingMediaSource para combinar la fuente de contenido multimedia del contenido con un SingleSampleMediaSource para cada pista de subtítulo. DefaultMediaSourceFactory no admite la transferencia de subtítulos para DASH de varios períodos.

Cómo recortar una transmisión multimedia

Para recortar el contenido al que hace referencia un elemento multimedia, configura posiciones personalizadas de inicio y finalización:

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

De forma interna, DefaultMediaSourceFactory usará un ClippingMediaSource para unir la fuente de contenido multimedia del contenido. Existen propiedades de recorte adicionales. Consulta el Javadoc de MediaItem.Builder para obtener más detalles.

Inserción de anuncios

Para insertar anuncios, se debe establecer la propiedad de URI de la etiqueta del anuncio de un elemento multimedia:

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

De forma interna, DefaultMediaSourceFactory unirá la fuente de contenido multimedia del contenido en una AdsMediaSource para insertar anuncios según lo definido por la etiqueta. Para que esto funcione, el reproductor también debe tener su DefaultMediaSourceFactory configurado como corresponde.