Fuentes de medios
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
En ExoPlayer, cada elemento multimedia se representa con un MediaItem
. Sin embargo,
internamente, el reproductor necesita MediaSource
instancias para reproducir el contenido. El
el reproductor los crea a partir de elementos multimedia con un MediaSource.Factory
.
De forma predeterminada, el reproductor usa un DefaultMediaSourceFactory
, que puede crear
instancias de las siguientes implementaciones de MediaSource
de contenido:
DefaultMediaSourceFactory
también puede crear fuentes de contenido multimedia más complejas según
en las propiedades de los elementos multimedia correspondientes. Esto se describe en más
detalle en la
Página Elementos multimedia.
Para las apps que necesitan configuraciones de fuentes de contenido multimedia que no son compatibles con
configuración predeterminada del reproductor, hay varias opciones para
personalización.
Cuando se compila el reproductor, se puede insertar un MediaSource.Factory
. Por ejemplo:
si una app quiere insertar anuncios y usar un CacheDataSource.Factory
para admitir
en caché, se puede configurar una instancia de DefaultMediaSourceFactory
para que coincida
estos requisitos e inyectados durante la construcción del reproductor:
Kotlin
val mediaSourceFactory: MediaSource.Factory =
DefaultMediaSourceFactory(context)
.setDataSourceFactory(cacheDataSourceFactory)
.setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
Java
MediaSource.Factory mediaSourceFactory =
new DefaultMediaSourceFactory(context)
.setDataSourceFactory(cacheDataSourceFactory)
.setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();
El
DefaultMediaSourceFactory
JavaDoc
describe las opciones disponibles con más detalle.
También es posible insertar una implementación de MediaSource.Factory
personalizada para
para admitir la creación de un tipo personalizado de fuente multimedia. La fábrica
Se llamará a createMediaSource(MediaItem)
para crear una fuente de contenido multimedia para cada
elemento multimedia que se
agregado a la playlist.
La interfaz ExoPlayer
define los métodos de playlist adicionales que aceptan
fuentes multimedia en lugar de elementos multimedia. Esto permite evitar
MediaSource.Factory
interno del reproductor y pasa instancias de fuentes multimedia al
directamente:
Kotlin
// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)
// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))
exoPlayer.prepare()
exoPlayer.play()
Java
// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource);
// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));
exoPlayer.prepare();
exoPlayer.play();
ExoPlayer proporciona varias implementaciones de MediaSource
para modificar y redactar
otras MediaSource
instancias. Son muy útiles en los casos en que varios
se deben combinar las personalizaciones, y no se usa ninguna
suficientes.
ClippingMediaSource
: Permite recortar contenido multimedia en función de un rango de marca de tiempo especificado.
Si esta es la única modificación, es preferible usar
MediaItem.ClippingConfiguration
en su lugar.
FilteringMediaSource
: filtra los segmentos disponibles para los tipos especificados por
Por ejemplo, solo mostrar la pista de video de un archivo que contiene ambas
y video. Si esta es la única modificación, es preferible usar
Haz un seguimiento de los parámetros de selección.
MergingMediaSource
: Combina varias fuentes multimedia para reproducirlas en paralelo. En
en casi todos los casos, es recomendable llamar al constructor con
adjustPeriodTimeOffsets
y clipDurations
establecidos como verdadero para garantizar que todos
las fuentes empiezan y terminan al mismo tiempo. Si esta modificación se hace para agregar
subtítulos transferibles, es preferible usarlos
MediaItem.SubtitleConfiguration
en su lugar.
ConcatenatingMediaSource2
: Combina varias fuentes multimedia para reproducirlas.
de forma consecutiva. La estructura multimedia visible para el usuario expone
Timeline.Window
, lo que significa que parece un solo elemento. Si esta
La modificación se hace para reproducir varios elementos que no deberían verse como
solo hay uno, es preferible usar los métodos de la API de playlist, como
Player.addMediaItem
en su lugar.
SilenceMediaSource
: Genera silencio durante una duración especificada que es
útil para llenar los vacíos.
AdsMediaSource
: Extiende una fuente multimedia con la inserción de anuncios del cliente
capacidades de integración. Consulte la guía de inserción de anuncios para obtener más información.
ServerSideAdInsertionMediaSource
: Extiende una fuente multimedia con un anuncio del servidor
de inserción y producción. Consulte la guía de inserción de anuncios para obtener más información.
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-27 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-07-27 (UTC)"],[],[],null,["# Media sources\n\nIn ExoPlayer, every piece of media is represented by a `MediaItem`. However\ninternally, the player needs `MediaSource` instances to play the content. The\nplayer creates these from media items using a `MediaSource.Factory`.\n\nBy default the player uses a `DefaultMediaSourceFactory`, which can create\ninstances of the following content `MediaSource` implementations:\n\n- `DashMediaSource` for [DASH](/guide/topics/media/exoplayer/dash).\n- `SsMediaSource` for [SmoothStreaming](/guide/topics/media/exoplayer/smoothstreaming).\n- `HlsMediaSource` for [HLS](/guide/topics/media/exoplayer/hls).\n- `ProgressiveMediaSource` for [regular media files](/guide/topics/media/exoplayer/progressive).\n- `RtspMediaSource` for [RTSP](/guide/topics/media/exoplayer/rtsp).\n\n`DefaultMediaSourceFactory` can also create more complex media sources depending\non the properties of the corresponding media items. This is described in more\ndetail on the\n[Media items page](/guide/topics/media/exoplayer/media-items).\n\nFor apps that need media source setups that are not supported by the\ndefault configuration of the player, there are several options for\ncustomization.\n\nCustomizing media source creation\n---------------------------------\n\nWhen building the player, a `MediaSource.Factory` can be injected. For example,\nif an app wants to insert ads and use a `CacheDataSource.Factory` to support\ncaching, an instance of `DefaultMediaSourceFactory` can be configured to match\nthese requirements and injected during player construction: \n\n### Kotlin\n\n```kotlin\n val mediaSourceFactory: MediaSource.Factory =\n DefaultMediaSourceFactory(context)\n .setDataSourceFactory(cacheDataSourceFactory)\n .setLocalAdInsertionComponents(adsLoaderProvider, playerView)\n val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()\n```\n\n### Java\n\n```java\nMediaSource.Factory mediaSourceFactory =\n new DefaultMediaSourceFactory(context)\n .setDataSourceFactory(cacheDataSourceFactory)\n .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);\nExoPlayer player =\n new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();\n```\n\n\u003cbr /\u003e\n\nThe\n[`DefaultMediaSourceFactory` JavaDoc](/reference/androidx/media3/exoplayer/source/DefaultMediaSourceFactory)\ndescribes the available options in more detail.\n\nIt's also possible to inject a custom `MediaSource.Factory` implementation, for\nexample to support creation of a custom media source type. The factory's\n`createMediaSource(MediaItem)` will be called to create a media source for each\nmedia item that is\n[added to the playlist](/guide/topics/media/exoplayer/playlists).\n\nMedia source based playlist API\n-------------------------------\n\nThe [`ExoPlayer`](/reference/androidx/media3/exoplayer/ExoPlayer) interface defines additional playlist methods that accept\nmedia sources rather than media items. This makes it possible to bypass the\nplayer's internal `MediaSource.Factory` and pass media source instances to the\nplayer directly: \n\n### Kotlin\n\n```kotlin\n// Set a list of media sources as initial playlist.\nexoPlayer.setMediaSources(listOfMediaSources)\n// Add a single media source.\nexoPlayer.addMediaSource(anotherMediaSource)\n\n// Can be combined with the media item API.\nexoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))\n\nexoPlayer.prepare()\nexoPlayer.play()\n```\n\n### Java\n\n```java\n// Set a list of media sources as initial playlist.\nexoPlayer.setMediaSources(listOfMediaSources);\n// Add a single media source.\nexoPlayer.addMediaSource(anotherMediaSource);\n\n// Can be combined with the media item API.\nexoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));\n\nexoPlayer.prepare();\nexoPlayer.play();\n```\n\n\u003cbr /\u003e\n\nAdvanced media source composition\n---------------------------------\n\nExoPlayer provides multiple `MediaSource` implementations to modify and compose\nother `MediaSource` instances. These are most useful in cases where multiple\ncustomizations have to be combined and none of the simpler setup paths are\nsufficient.\n\n- `ClippingMediaSource`: Allows to clip media to a specified timestamp range. If this is the only modification, it's preferable to use [`MediaItem.ClippingConfiguration`](/guide/topics/media/exoplayer/media-items#clipping-media) instead.\n- `FilteringMediaSource`: Filters available tracks to the specified types, for example, just exposing the video track from a file that contains both audio and video. If this is the only modification, it's preferable to use [track selection parameters](/guide/topics/media/exoplayer/track-selection#disabling-track) instead.\n- `MergingMediaSource`: Merges multiple media sources to play in parallel. In almost all cases, it's advisable to call the constructor with `adjustPeriodTimeOffsets` and `clipDurations` set to true to ensure all sources start and end at the same time. If this modification is done to add side-loaded subtitles, it's preferable to use [`MediaItem.SubtitleConfiguration`](/guide/topics/media/exoplayer/media-items#sideloading-subtitle) instead.\n- `ConcatenatingMediaSource2`: Merges multiple media source to play consecutively. The user-visible media structure exposes a single `Timeline.Window`, meaning that it looks like a single item. If this modification is done to play multiple items that are not supposed to look like a single one, it's preferable to use the [playlist API](/guide/topics/media/exoplayer/playlists) methods like `Player.addMediaItem` instead.\n- `SilenceMediaSource`: Generates silence for a specified duration that is useful to fill gaps.\n- `AdsMediaSource`: Extends a media source with client-side ad insertion capabilities. Refer to the [ad insertion guide](/guide/topics/media/exoplayer/ad-insertion) for details.\n- `ServerSideAdInsertionMediaSource`: Extends a media source with server-side ad insertion capabilities. Refer to the [ad insertion guide](/guide/topics/media/exoplayer/ad-insertion) for details."]]