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 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.