Elementos multimedia

La API de playlist se basa en instancias de MediaItem, que pueden compilarse de forma conveniente. con MediaItem.Builder. Dentro del reproductor, un MediaItem se convierte en un elemento MediaSource reproducible por un MediaSource.Factory. Sin configuración personalizada que realiza un DefaultMediaSourceFactory, que es capaz de crear fuentes de medios complejas correspondientes a las propiedades de la elemento multimedia. Se describen algunas de las propiedades que se pueden establecer en los elementos multimedia. a continuación.

Elementos multimedia simples

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

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

Para todos los demás casos, se puede usar un MediaItem.Builder. En el siguiente ejemplo, un El elemento multimedia se compila 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 transiciones de playlists.

Imágenes

La reproducción de imágenes requiere que se especifique el tiempo de duración en el elemento multimedia. la imagen debe mostrarse durante la reproducción. Consulta la Imágenes para obtener más información sobre Fotos en movimiento y Bibliotecas de carga de imágenes (por ejemplo, Glide).

Kotlin

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

Java

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

Extensiones de archivo no estándar para contenido multimedia adaptable

ExoPlayer proporciona fuentes multimedia adaptables para DASH, HLS y SmoothStreaming. Si el URI de ese elemento multimedia adaptable termina con un estándar la extensión de archivo, se creará automáticamente la fuente multimedia correspondiente. Si el botón tiene una extensión no estándar o no tiene ninguna extensión, entonces el tipo de MIME puede definir de manera 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 de contenido multimedia progresivas, no se requiere un tipo de MIME.

Contenido protegido

En el caso del contenido protegido, se deben establecer las propiedades de DRM del elemento multimedia. El UUID es obligatoria, todas las demás propiedades son opcionales.

Una configuración de ejemplo para reproducir un elemento protegido con Widevine DRM en el que el El URI de licencia no está disponible directamente en el contenido multimedia (p. ej., en una playlist DASH). se requieren varias sesiones (p.ej., debido a la rotación de claves):

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

Dentro del DefaultMediaSourceFactory pasará estas propiedades a un DrmSessionManagerProvider para obtener un DrmSessionManager, que luego Se inserta en el MediaSource creado. El comportamiento de la DRM puede más personalizadas según tus necesidades.

Transferencia de pistas de subtítulos

Para transferir pistas de subtítulos, se pueden agregar MediaItem.Subtitle instancias cuando Creación de 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();

Internamente, DefaultMediaSourceFactory usará un MergingMediaSource para se combina la fuente multimedia del contenido con un SingleSampleMediaSource para cada una. pista de subtítulo. DefaultMediaSourceFactory no admite sideloading subtítulos para DASH de varios períodos.

Recorta una transmisión de contenido multimedia

Para recortar el contenido al que hace referencia un elemento multimedia, establece una configuración posiciones 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. Existen propiedades de recorte adicionales. Consulta la 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 de 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 multimedia del contenido en una AdsMediaSource para insertar anuncios según lo definido por la etiqueta de anuncio. Para que esto funcione, el el reproductor también debe tener su DefaultMediaSourceFactory configuradas según corresponda.