Sumber media
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Di ExoPlayer, setiap bagian media direpresentasikan oleh MediaItem
. Namun
secara internal, pemutar membutuhkan instance MediaSource
untuk memutar konten. Tujuan
pemutar membuatnya dari item media menggunakan MediaSource.Factory
.
Secara default, pemutar menggunakan DefaultMediaSourceFactory
, yang dapat membuat
instance penerapan MediaSource
konten berikut:
DefaultMediaSourceFactory
juga dapat membuat sumber media yang lebih kompleks, bergantung pada
properti item media yang sesuai. Hal ini dijelaskan lebih lanjut
detail tentang
Halaman item media.
Untuk aplikasi yang memerlukan penyiapan sumber media yang tidak didukung oleh
konfigurasi bawaan pemutar, ada beberapa opsi untuk
dan penyesuaian.
Saat membangun pemutar, MediaSource.Factory
dapat dimasukkan. Misalnya,
jika aplikasi ingin menyisipkan iklan dan menggunakan CacheDataSource.Factory
untuk mendukung
dalam cache, instance DefaultMediaSourceFactory
dapat dikonfigurasi agar cocok
persyaratan ini dan dimasukkan selama konstruksi pemutar:
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();
Tujuan
DefaultMediaSourceFactory
JavaDoc
menjelaskan opsi yang tersedia secara lebih mendetail.
Anda juga dapat memasukkan implementasi MediaSource.Factory
kustom, untuk
untuk mendukung pembuatan jenis sumber media kustom.
createMediaSource(MediaItem)
akan dipanggil untuk membuat sumber media untuk masing-masing
item media yang
ditambahkan ke playlist.
Antarmuka ExoPlayer
menentukan metode playlist tambahan yang menerima
sumber media yang berbeda, bukan item media. Hal ini memungkinkan untuk mengabaikan
MediaSource.Factory
internal pemutar dan teruskan instance sumber media ke
pemain secara langsung:
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 menyediakan beberapa implementasi MediaSource
untuk memodifikasi dan menyusun
instance MediaSource
lainnya. Ini paling berguna dalam kasus di mana beberapa
khusus harus digabungkan dan tidak ada
jalur penyiapan yang lebih sederhana yang
memadai.
ClippingMediaSource
: Memungkinkan klip media ke rentang stempel waktu yang ditentukan.
Jika ini satu-satunya modifikasi, lebih baik menggunakan
MediaItem.ClippingConfiguration
saja.
FilteringMediaSource
: Memfilter trek yang tersedia ke jenis yang ditentukan, untuk
Misalnya, dengan mengekspos trek video dari
file yang berisi kedua tindakan
dan video. Jika ini satu-satunya modifikasi, lebih baik menggunakan
parameter pemilihan trek.
MergingMediaSource
: Menggabungkan beberapa sumber media untuk diputar secara paralel. Di beberapa
dalam hampir semua kasus, disarankan untuk
memanggil konstruktor dengan
adjustPeriodTimeOffsets
dan clipDurations
ditetapkan ke benar (true) untuk memastikan semua
sumber dimulai dan
berakhir secara bersamaan. Jika modifikasi ini dilakukan untuk menambahkan
sub judul {i>side-load<i}, lebih baik
untuk menggunakan
MediaItem.SubtitleConfiguration
saja.
ConcatenatingMediaSource2
: Menggabungkan beberapa sumber media untuk diputar
secara berurutan. Struktur media yang terlihat oleh pengguna
mengekspos satu
Timeline.Window
, artinya terlihat seperti satu item. Jika ini
modifikasi dilakukan untuk memainkan
beberapa item yang seharusnya tidak terlihat
satu, sebaiknya gunakan metode playlist API seperti
Player.addMediaItem
saja.
SilenceMediaSource
: Menghasilkan keheningan selama durasi tertentu yang
berguna untuk mengisi kesenjangan.
AdsMediaSource
: Memperluas sumber media dengan penyisipan iklan sisi klien
kemampuan IT. Lihat panduan penyisipan iklan untuk mengetahui detailnya.
ServerSideAdInsertionMediaSource
: Memperluas sumber media dengan iklan sisi server
kemampuan penyisipan. Lihat panduan penyisipan iklan untuk mengetahui detailnya.
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-07-27 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 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."]]