playlist API didasarkan pada instance MediaItem
, yang dapat dibuat dengan mudah
menggunakan MediaItem.Builder
. Di dalam pemutar, MediaItem
dikonversi menjadi
MediaSource
yang dapat diputar oleh MediaSource.Factory
. Tanpa
konfigurasi kustom,
konversi ini dilakukan oleh DefaultMediaSourceFactory
, yang
mampu membuat sumber media kompleks yang sesuai dengan properti
item media. Beberapa properti yang dapat ditetapkan pada item media diuraikan
di bawah ini.
Item media sederhana
Item media yang hanya terdiri dari URI aliran data dapat dibuat dengan
metode fromUri
yang praktis:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
Untuk semua kasus lainnya, MediaItem.Builder
dapat digunakan. Dalam contoh berikut, item media dibuat dengan ID dan beberapa metadata terlampir:
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();
Melampirkan metadata dapat berguna untuk mengupdate UI aplikasi saat terjadi transisi playlist.
Menangani ekstensi file non-standar
ExoPlayer menyediakan sumber media adaptif untuk DASH, HLS, dan SmoothStreaming. Jika URI item media adaptif tersebut berakhir dengan ekstensi file standar, sumber media yang sesuai akan otomatis dibuat. Jika URI memiliki ekstensi non-standar atau tidak memiliki ekstensi sama sekali, jenis MIME dapat ditetapkan secara eksplisit untuk menunjukkan jenis item media:
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();
Untuk streaming media progresif, jenis MIME tidak diperlukan.
Konten yang dilindungi
Untuk konten yang dilindungi, properti DRM item media harus ditetapkan:
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();
Contoh ini membuat item media untuk konten yang dilindungi Widevine. Di dalam
pemain, DefaultMediaSourceFactory
akan meneruskan properti ini ke
DrmSessionManagerProvider
untuk mendapatkan DrmSessionManager
, yang kemudian
dimasukkan ke dalam MediaSource
yang dibuat. Perilaku DRM dapat disesuaikan lebih lanjut
dengan kebutuhan Anda.
Melakukan sideload trek subtitel
Untuk melakukan sideload trek subtitel, instance MediaItem.Subtitle
dapat ditambahkan saat
mem-build item media:
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();
Secara internal, DefaultMediaSourceFactory
akan menggunakan MergingMediaSource
untuk
menggabungkan sumber media konten dengan SingleSampleMediaSource
untuk setiap
trek subtitel. DefaultMediaSourceFactory
tidak mendukung subtitel
sideload untuk DASH multi-periode.
Memotong streaming media
Untuk memangkas konten yang dirujuk oleh item media, tetapkan posisi awal dan akhir kustom:
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();
Secara internal, DefaultMediaSourceFactory
akan menggunakan ClippingMediaSource
untuk menggabungkan
sumber media konten. Terdapat properti clipping tambahan. Lihat MediaItem.Builder
Javadoc untuk detail selengkapnya.
Penyisipan iklan
Untuk menyisipkan iklan, properti URI tag iklan item media harus ditetapkan:
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();
Secara internal, DefaultMediaSourceFactory
akan menggabungkan sumber media konten di
AdsMediaSource
untuk menyisipkan iklan seperti yang ditetapkan oleh tag iklan. Agar hal ini berfungsi, pemain juga harus memiliki DefaultMediaSourceFactory
yang dikonfigurasi sebagaimana mestinya.