Origini di contenuti multimediali
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
In ExoPlayer, ogni elemento multimediale è rappresentato da un elemento MediaItem
. Tuttavia,
internamente, il player ha bisogno di MediaSource
istanze per riprodurre i contenuti. La
il player li crea da elementi multimediali utilizzando un MediaSource.Factory
.
Per impostazione predefinita il player usa un'DefaultMediaSourceFactory
, che può creare
istanze delle seguenti implementazioni MediaSource
di contenuti:
DefaultMediaSourceFactory
può anche creare origini multimediali più complesse a seconda
sulle proprietà degli elementi multimediali corrispondenti. Questa operazione viene descritta in maggior dettaglio
nel dettaglio
Pagina Elementi multimediali.
Per le app che richiedono configurazioni di fonti multimediali non supportate dal
configurazione predefinita del player, sono disponibili diverse opzioni
personalizzazione.
Durante la creazione del player, è possibile inserire un MediaSource.Factory
. Ad esempio:
se un'app vuole inserire annunci e usare un CacheDataSource.Factory
per supportare
per la memorizzazione nella cache, un'istanza di DefaultMediaSourceFactory
può essere configurata
questi requisiti e inseriti durante la creazione del player:
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();
La
DefaultMediaSourceFactory
JavaDoc
le opzioni disponibili sono descritte in maggiore dettaglio.
È anche possibile inserire un'implementazione MediaSource.Factory
personalizzata per
per supportare la creazione di un tipo di origine multimediale personalizzato. La fabbrica
createMediaSource(MediaItem)
verrà chiamato per creare una fonte multimediale per ogni
l'elemento multimediale
aggiunto alla playlist.
L'interfaccia di ExoPlayer
definisce i metodi aggiuntivi per le playlist che accettano
fonti multimediali piuttosto che elementi multimediali. In questo modo è possibile bypassare
i valori MediaSource.Factory
interni del player e passano le istanze di origine multimediale al
player:
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 fornisce più implementazioni MediaSource
per modificare e scrivere
e altre MediaSource
istanze. Questi sono particolarmente utili nei casi in cui
le personalizzazioni devono essere combinate e nessuno dei percorsi di configurazione più semplici
sufficienti.
ClippingMediaSource
: consente di ritagliare contenuti multimediali in base a un intervallo di timestamp specificato.
Se questa è l'unica modifica, è preferibile utilizzare
MediaItem.ClippingConfiguration
.
FilteringMediaSource
: filtra le tracce disponibili in base ai tipi specificati, per
Ad esempio, la semplice esposizione della traccia video di un file contenente audio
e video. Se questa è l'unica modifica, è preferibile utilizzare
parametri di selezione delle tracce.
MergingMediaSource
: unisce più origini multimediali da riprodurre in parallelo. Nella
in quasi tutti i casi, è consigliabile chiamare il costruttore
adjustPeriodTimeOffsets
e clipDurations
vengono impostati su true per garantire che tutte le
le origini iniziano e finiscono contemporaneamente. Se questa modifica viene apportata per aggiungere
per i sottotitoli codificati in sideload, è preferibile utilizzare
MediaItem.SubtitleConfiguration
.
ConcatenatingMediaSource2
: unisce più fonti multimediali da riprodurre
in sequenza. La struttura multimediale visibile all'utente espone una singola
Timeline.Window
, che indica che appare come un singolo articolo. Se questo
viene apportata una modifica per riprodurre più elementi che non dovrebbero avere
uno solo, è preferibile utilizzare i metodi dell'API Playlist come
Player.addMediaItem
in alternativa.
SilenceMediaSource
: genera silenzio per una durata specificata, ovvero
utili per colmare le lacune.
AdsMediaSource
: estende un'origine multimediale con l'inserimento di annunci lato client
le funzionalità di machine learning. Per informazioni dettagliate, consulta la guida all'inserimento degli annunci.
ServerSideAdInsertionMediaSource
: estende un'origine multimediale con annuncio lato server
funzionalità di inserimento. Per informazioni dettagliate, consulta la guida all'inserimento degli annunci.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 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."]]