83 lines
3.1 KiB
Markdown
83 lines
3.1 KiB
Markdown
---
|
|
title: Media sources
|
|
redirect_from:
|
|
- /mediasource.html
|
|
---
|
|
|
|
In ExoPlayer every piece of media is represented by a `MediaItem`. However
|
|
internally, the player needs `MediaSource` instances to play the content. The
|
|
player creates these from media items using a `MediaSource.Factory`.
|
|
|
|
By default the player uses a `DefaultMediaSourceFactory`, which can create
|
|
instances of the following content `MediaSource` implementations:
|
|
|
|
* `DashMediaSource` for [DASH][].
|
|
* `SsMediaSource` for [SmoothStreaming][].
|
|
* `HlsMediaSource` for [HLS][].
|
|
* `ProgressiveMediaSource` for [regular media files][].
|
|
* `RtspMediaSource` for [RTSP][].
|
|
|
|
`DefaultMediaSourceFactory` can also create more complex media sources depending
|
|
on the properties of the corresponding media items. This is described in more
|
|
detail on the [Media items page]({{ site.baseurl }}/media-items.html).
|
|
|
|
For apps that need media source setups that are not supported by the
|
|
default configuration of the player, there are several options for
|
|
customization.
|
|
|
|
## Customizing media source creation ##
|
|
|
|
When building the player, a `MediaSource.Factory` can be injected. For example,
|
|
if an app wants to insert ads and use a `CacheDataSource.Factory` to support
|
|
caching, an instance of `DefaultMediaSourceFactory` can be configured to match
|
|
these requirements and injected during player construction:
|
|
|
|
~~~
|
|
MediaSource.Factory mediaSourceFactory =
|
|
new DefaultMediaSourceFactory(cacheDataSourceFactory)
|
|
.setAdsLoaderProvider(adsLoaderProvider)
|
|
.setAdViewProvider(playerView);
|
|
ExoPlayer player = new ExoPlayer.Builder(context)
|
|
.setMediaSourceFactory(mediaSourceFactory)
|
|
.build();
|
|
~~~
|
|
{: .language-java}
|
|
|
|
The
|
|
[`DefaultMediaSourceFactory` JavaDoc]({{ site.baseurl }}/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html)
|
|
describes the available options in more detail.
|
|
|
|
It's also possible to inject a custom `MediaSource.Factory` implementation, for
|
|
example to support creation of a custom media source type. The factory's
|
|
`createMediaSource(MediaItem)` will be called to create a media source for each
|
|
media item that is
|
|
[added to the playlist]({{ site.baseurl }}/playlists.html).
|
|
|
|
## Media source based playlist API ##
|
|
|
|
The [`ExoPlayer`] interface defines additional playlist methods that accept
|
|
media sources rather than media items. This makes it possible to bypass the
|
|
player's internal `MediaSource.Factory` and pass media source instances to the
|
|
player directly:
|
|
|
|
~~~
|
|
// 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();
|
|
~~~
|
|
{: .language-java}
|
|
|
|
[DASH]: {{ site.baseurl }}/dash.html
|
|
[SmoothStreaming]: {{ site.baseurl }}/smoothstreaming.html
|
|
[HLS]: {{ site.baseurl }}/hls.html
|
|
[RTSP]: {{ site.baseurl }}/rtsp.html
|
|
[regular media files]: {{ site.baseurl }}/progressive.html
|
|
[`ExoPlayer`]: {{ site.baseurl }}/doc/reference/com/google/android/exoplayer2/ExoPlayer.html
|