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
dapat membuat sumber media kompleks yang sesuai dengan properti
item media. Beberapa properti yang dapat ditetapkan pada item media diuraikan di bawah.
Item media sederhana
Item media yang hanya terdiri dari URI streaming dapat dibuat dengan metode praktis fromUri:
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 memperbarui UI aplikasi Anda saat transisi playlist terjadi.
Gambar
Pemutaran gambar memerlukan durasi dalam item media untuk menentukan berapa lama gambar harus ditampilkan selama pemutaran. Lihat halaman panduan Gambar untuk mengetahui informasi selengkapnya tentang Foto Bergerak dan Library Pemuatan Gambar (misalnya, Glide).
Kotlin
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
Ekstensi file non-standar untuk media adaptif
ExoPlayer menyediakan sumber media adaptif untuk DASH, HLS, dan SmoothStreaming. Jika URI item media adaptif tersebut diakhiri dengan ekstensi file standar, sumber media yang sesuai akan dibuat secara otomatis. 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 disetel. UUID wajib diisi, semua properti lainnya bersifat opsional.
Contoh konfigurasi untuk memutar item yang dilindungi dengan Widevine DRM jika URI lisensi tidak tersedia langsung di media (misalnya, di playlist DASH) dan beberapa sesi diperlukan (misalnya, karena rotasi kunci):
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();
Di dalam
pemutar, DefaultMediaSourceFactory akan meneruskan properti ini ke
DrmSessionManagerProvider untuk mendapatkan DrmSessionManager, yang kemudian
disisipkan ke dalam MediaSource yang dibuat. Perilaku DRM dapat
disesuaikan lebih lanjut
sesuai kebutuhan Anda.
Memuat trek subtitel dari luar
Untuk memuat trek subtitel dari luar, instance MediaItem.Subtitle dapat ditambahkan saat
membuat item media:
Kotlin
val subtitle = 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() 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
jalur teks. DefaultMediaSourceFactory tidak mendukung memuat sendiri
subtitel untuk DASH multi-periode.
Memangkas 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. Ada properti kliping tambahan. Lihat
Javadoc MediaItem.Builder untuk mengetahui 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()) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
Secara internal, DefaultMediaSourceFactory akan membungkus sumber media konten dalam
AdsMediaSource untuk menyisipkan iklan sebagaimana ditentukan oleh tag iklan. Agar dapat berfungsi, pemutar juga harus mengonfigurasi DefaultMediaSourceFactory
dengan tepat.