Item media

playlist API didasarkan pada instance MediaItem, yang dapat dibuat dengan mudah menggunakan MediaItem.Builder. Di dalam pemutar, MediaItem dikonversi menjadi MediaSource yang dapat dimainkan oleh MediaSource.Factory. Tanpa konfigurasi kustom, konversi ini dilakukan oleh DefaultMediaSourceFactory, yang mampu membangun sumber media kompleks 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 fromUri metode praktis:

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

Untuk semua kasus lainnya, MediaItem.Builder dapat digunakan. Pada contoh berikut, item media dibuat dengan ID dan beberapa metadata yang dilampirkan:

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 {i>metadata <i} dapat berguna untuk mengupdate UI aplikasi Anda saat terjadi transisi playlist.

Gambar

Pemutaran gambar memerlukan durasi di item media untuk menentukan berapa lama gambar yang akan ditampilkan selama pemutaran. Lihat Halaman panduan Gambar untuk informasi selengkapnya tentang Foto Motion 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 Streaming Lancar. Jika URI item media adaptif tersebut diakhiri dengan ekstensi file, sumber media yang sesuai akan dibuat secara otomatis. Jika URI memiliki ekstensi non-standar atau tidak ada ekstensi sama sekali, maka jenis MIME dapat 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. UUID wajib ada, semua properti lainnya bersifat opsional.

Contoh konfigurasi untuk memutar item yang dilindungi dengan Widevine DRM jika URI lisensi tidak tersedia secara langsung di media (mis. dalam 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 dimasukkan ke MediaSource yang dibuat. Perilaku DRM dapat berupa disesuaikan lebih lanjut dengan kebutuhan Anda.

Melakukan sideload trek subtitel

Untuk melakukan sideload trek subtitel, instance MediaItem.Subtitle dapat ditambahkan saat membuat 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 sideload subtitel untuk DASH multi-periode.

Membuat klip streaming media

Untuk memotong konten yang dirujuk oleh item media, setel posisi awal dan akhir:

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 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 dalam sebuah AdsMediaSource untuk menyisipkan iklan seperti yang ditentukan oleh tag iklan. Agar berhasil, pemutar juga harus memiliki DefaultMediaSourceFactory dikonfigurasi dengan benar.