Sumber media

Di ExoPlayer, setiap bagian media direpresentasikan oleh MediaItem. Namun, secara internal, pemutar memerlukan instance MediaSource untuk memutar konten. Pemutar akan membuatnya dari item media menggunakan MediaSource.Factory.

Secara default, pemain menggunakan DefaultMediaSourceFactory, yang dapat membuat instance dari implementasi MediaSource konten berikut:

DefaultMediaSourceFactory juga dapat membuat sumber media yang lebih kompleks, bergantung pada properti item media yang sesuai. Hal ini dijelaskan secara lebih mendetail di halaman Item media.

Untuk aplikasi yang memerlukan penyiapan sumber media yang tidak didukung oleh konfigurasi default pemutar, ada beberapa opsi untuk penyesuaian.

Menyesuaikan pembuatan sumber media

Saat mem-build pemutar, MediaSource.Factory dapat dimasukkan. Misalnya, jika aplikasi ingin menyisipkan iklan dan menggunakan CacheDataSource.Factory untuk mendukung cache, instance DefaultMediaSourceFactory dapat dikonfigurasi agar sesuai dengan persyaratan ini dan dimasukkan selama pembuatan pemain:

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();

DefaultMediaSourceFactory JavaDoc menjelaskan opsi yang tersedia secara lebih mendetail.

Anda juga dapat memasukkan implementasi MediaSource.Factory kustom, misalnya untuk mendukung pembuatan jenis sumber media kustom. createMediaSource(MediaItem) factory akan dipanggil untuk membuat sumber media untuk setiap item media yang ditambahkan ke playlist.

API playlist berbasis sumber media

Antarmuka ExoPlayer menentukan metode playlist tambahan yang menerima sumber media, bukan item media. Hal ini memungkinkan untuk mengabaikan MediaSource.Factory internal pemain dan meneruskan 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();

Komposisi sumber media lanjutan

ExoPlayer menyediakan beberapa implementasi MediaSource untuk mengubah dan mengomposisi instance MediaSource lainnya. Hal ini paling berguna jika beberapa penyesuaian harus digabungkan dan tidak ada jalur penyiapan yang lebih sederhana yang cukup.

  • ClippingMediaSource: Memungkinkan untuk memotong media ke rentang stempel waktu yang ditentukan. Jika ini adalah satu-satunya modifikasi, sebaiknya gunakan MediaItem.ClippingConfiguration.
  • FilteringMediaSource: Memfilter trek yang tersedia ke jenis yang ditentukan, misalnya, hanya mengekspos trek video dari file yang berisi audio dan video. Jika ini adalah satu-satunya modifikasi, sebaiknya gunakan parameter pemilihan jalur.
  • MergingMediaSource: Menggabungkan beberapa sumber media untuk diputar secara paralel. Dalam hampir semua kasus, sebaiknya panggil konstruktor dengan adjustPeriodTimeOffsets dan clipDurations ditetapkan ke benar (true) untuk memastikan semua sumber dimulai dan berakhir secara bersamaan. Jika modifikasi ini dilakukan untuk menambahkan subtitel yang di-side-load, sebaiknya gunakan MediaItem.SubtitleConfiguration sebagai gantinya.
  • ConcatenatingMediaSource2: Menggabungkan beberapa sumber media untuk diputar secara berurutan. Struktur media yang terlihat oleh pengguna mengekspos satu Timeline.Window, yang berarti struktur tersebut terlihat seperti satu item. Jika modifikasi ini dilakukan untuk memutar beberapa item yang seharusnya tidak terlihat seperti satu item, sebaiknya gunakan metode playlist API seperti Player.addMediaItem.
  • SilenceMediaSource: Menghasilkan keheningan selama durasi tertentu yang berguna untuk mengisi bagian kosong.
  • AdsMediaSource: Memperluas sumber media dengan kemampuan penyisipan iklan sisi klien. Lihat panduan penyisipan iklan untuk mengetahui detailnya.
  • ServerSideAdInsertionMediaSource: Memperluas sumber media dengan kemampuan penyisipan iklan sisi server. Lihat panduan penyisipan iklan untuk mengetahui detailnya.