Pemilihan trek

Jika item media berisi beberapa trek, pemilihan trek adalah proses yang menentukan trek mana yang dipilih untuk diputar. Proses pemilihan jalur dikonfigurasi oleh TrackSelectionParameters, yang memungkinkan banyak batasan dan penggantian yang memengaruhi pemilihan jalur untuk ditentukan.

Membuat kueri untuk lagu yang tersedia

Anda dapat memproses Player.Listener.onTracksChanged untuk mendapatkan notifikasi tentang perubahan pada jalur, termasuk:

  • Trek yang tersedia akan diketahui saat persiapan item media yang diputar selesai. Perhatikan bahwa pemutar perlu menyiapkan item media untuk mengetahui trek yang dimuatnya.
  • Jalur yang tersedia berubah karena transisi pemutaran dari satu item media ke item media lainnya.
  • Perubahan pada trek yang dipilih.

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTracksChanged(tracks: Tracks) {
      // Update UI using current tracks.
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTracksChanged(Tracks tracks) {
        // Update UI using current tracks.
      }
    });

Anda juga dapat membuat kueri trek saat ini dengan memanggil player.getCurrentTracks(). Tracks yang ditampilkan berisi daftar objek Tracks.Group, dengan trek dalam satu Group menampilkan konten yang sama, tetapi dalam format yang berbeda.

Sebagai contoh cara mengelompokkan trek, pertimbangkan pemutaran adaptif dengan feed video utama yang disediakan dalam lima kecepatan bit, dan feed video alternatif (misalnya, sudut kamera yang berbeda dalam pertandingan olahraga) disediakan dalam dua kecepatan bit. Dalam hal ini, akan ada dua grup trek video, satu sesuai dengan feed video utama yang berisi lima trek, dan yang kedua untuk feed video alternatif yang berisi dua trek.

Trek audio yang bahasanya berbeda tidak dikelompokkan, karena konten dalam bahasa yang berbeda tidak dianggap sama. Sebaliknya, trek audio dalam bahasa yang sama yang hanya berbeda dalam properti seperti kecepatan bit, frekuensi sampling, jumlah saluran, dan sebagainya dapat dikelompokkan. Hal ini juga berlaku untuk trek teks.

Setiap Group dapat dikueri untuk menentukan trek mana yang didukung untuk pemutaran, yang saat ini dipilih, dan Format yang digunakan setiap trek:

Kotlin

for (trackGroup in tracks.groups) {
  // Group level information.
  val trackType = trackGroup.type
  val trackInGroupIsSelected = trackGroup.isSelected
  val trackInGroupIsSupported = trackGroup.isSupported
  for (i in 0 until trackGroup.length) {
    // Individual track information.
    val isSupported = trackGroup.isTrackSupported(i)
    val isSelected = trackGroup.isTrackSelected(i)
    val trackFormat = trackGroup.getTrackFormat(i)
  }
}

Java

for (Tracks.Group trackGroup : tracks.getGroups()) {
  // Group level information.
  @C.TrackType int trackType = trackGroup.getType();
  boolean trackInGroupIsSelected = trackGroup.isSelected();
  boolean trackInGroupIsSupported = trackGroup.isSupported();
  for (int i = 0; i < trackGroup.length; i++) {
    // Individual track information.
    boolean isSupported = trackGroup.isTrackSupported(i);
    boolean isSelected = trackGroup.isTrackSelected(i);
    Format trackFormat = trackGroup.getTrackFormat(i);
  }
}

  • Trek didukung jika Player dapat mendekode dan merender contohnya. Perhatikan bahwa meskipun beberapa grup trek dari jenis yang sama (misalnya beberapa grup trek audio) didukung, hal ini hanya berarti bahwa grup tersebut didukung satu per satu dan pemutar tidak selalu dapat memutarnya secara bersamaan.
  • Trek dipilih jika telah dipilih untuk diputar berdasarkan TrackSelectionParameters saat ini. Jika beberapa trek dalam satu grup trek dipilih, pemutar akan menggunakan trek ini untuk pemutaran adaptif (misalnya, beberapa trek video dengan kecepatan bit yang berbeda). Perhatikan bahwa hanya salah satu jalur ini yang akan diputar pada satu waktu.

Mengubah parameter pemilihan trek

Proses pemilihan jalur dapat dikonfigurasi menggunakan Player.setTrackSelectionParameters. Anda dapat melakukannya sebelum dan selama pemutaran. Contoh berikut menunjukkan cara mendapatkan TrackSelectionParameters saat ini dari pemutar, mengubahnya, dan memperbarui Player dengan hasil yang diubah:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setMaxVideoSizeSd()
    .setPreferredAudioLanguage("hu")
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setMaxVideoSizeSd()
        .setPreferredAudioLanguage("hu")
        .build());

Pemilihan jalur berbasis batasan

Sebagian besar opsi di TrackSelectionParameters memungkinkan Anda menentukan batasan, yang tidak bergantung pada jalur yang sebenarnya tersedia. Batasan yang tersedia meliputi:

  • Lebar, tinggi, kecepatan frame, dan kecepatan bit video maksimum dan minimum.
  • Jumlah saluran audio dan kecepatan bit maksimum.
  • Jenis MIME pilihan untuk video dan audio.
  • Bahasa audio dan tanda peran pilihan.
  • Bahasa teks dan tanda peran yang diinginkan.

ExoPlayer menggunakan setelan default yang wajar untuk batasan ini, misalnya membatasi resolusi video ke ukuran tampilan dan memilih bahasa audio yang cocok dengan setelan Lokalitas sistem pengguna.

Ada beberapa manfaat menggunakan pemilihan jalur berbasis batasan, bukan memilih jalur tertentu dari yang tersedia:

  • Anda dapat menentukan batasan sebelum mengetahui trek yang disediakan item media. Artinya, batasan dapat ditentukan sebelum pemutar menyiapkan item media, sedangkan memilih trek tertentu mengharuskan kode aplikasi menunggu hingga trek yang tersedia diketahui.
  • Batasan diterapkan untuk semua item media dalam playlist, meskipun item tersebut memiliki trek yang tersedia berbeda. Misalnya, batasan bahasa audio yang dipilih akan otomatis diterapkan untuk semua item media, meskipun Format trek dalam bahasa tersebut bervariasi dari satu item media ke item media berikutnya. Hal ini tidak berlaku saat memilih jalur tertentu, seperti yang dijelaskan di bawah.

Memilih lagu tertentu

Anda dapat memilih jalur tertentu menggunakan TrackSelectionParameters. Pertama, trek yang saat ini tersedia di pemutar harus dikueri menggunakan Player.getCurrentTracks. Kedua, setelah mengidentifikasi jalur yang akan dipilih, jalur tersebut dapat ditetapkan di TrackSelectionParameters menggunakan TrackSelectionOverride. Misalnya, untuk memilih trek pertama dari audioTrackGroup tertentu:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setOverrideForType(
      TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0)
    )
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setOverrideForType(
            new TrackSelectionOverride(
                audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0))
        .build());

TrackSelectionOverride hanya akan berlaku untuk item media yang berisi TrackGroup yang sama persis dengan yang ditentukan dalam penggantian. Oleh karena itu, penggantian mungkin tidak berlaku untuk item media berikutnya jika item tersebut berisi jalur yang berbeda.

Menonaktifkan jenis atau grup trek

Jenis trek seperti video, audio, atau teks, dapat dinonaktifkan sepenuhnya menggunakan TrackSelectionParameters.Builder.setTrackTypeDisabled. Jenis trek yang dinonaktifkan akan dinonaktifkan untuk semua item media:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
        .build());

Atau, Anda dapat mencegah pemilihan trek dari TrackGroup tertentu dengan menentukan penggantian kosong untuk grup tersebut:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .addOverride(
      TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf())
    )
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .addOverride(
            new TrackSelectionOverride(
                disabledTrackGroup.getMediaTrackGroup(),
                /* trackIndices= */ ImmutableList.of()))
        .build());

Menyesuaikan pemilih jalur

Pemilihan jalur adalah tanggung jawab TrackSelector, yang instance-nya dapat disediakan setiap kali ExoPlayer dibuat dan kemudian diperoleh dengan ExoPlayer.getTrackSelector().

Kotlin

val trackSelector = DefaultTrackSelector(context)
val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()

Java

DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();

DefaultTrackSelector adalah TrackSelector fleksibel yang cocok untuk sebagian besar kasus penggunaan. Kode ini menggunakan TrackSelectionParameters yang ditetapkan di Player, tetapi juga menyediakan beberapa opsi penyesuaian lanjutan yang dapat ditentukan di DefaultTrackSelector.ParametersBuilder:

Kotlin

trackSelector.setParameters(
  trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)

Java

trackSelector.setParameters(
    trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

Tunneling

Anda dapat mengaktifkan pemutaran tunnel jika kombinasi perender dan jalur yang dipilih mendukungnya. Untuk melakukannya, gunakan DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Pengurangan Beban Audio

Anda dapat mengaktifkan pemutaran audio yang di-offload jika kombinasi renderer dan trek yang dipilih mendukungnya. Untuk melakukannya, tentukan AudioOffloadModePreferences di TrackSelectionParameters Anda.

Kotlin

val audioOffloadPreferences =
  AudioOffloadPreferences.Builder()
      .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
      // Add additional options as needed
      .setIsGaplessSupportRequired(true)
      .build()
player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setAudioOffloadPreferences(audioOffloadPreferences)
    .build()

Java

AudioOffloadPreferences audioOffloadPreferences =
  new AudioOffloadPreferences.Builder()
      .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
      // Add additional options as needed
      .setIsGaplessSupportRequired(true)
      .build();
player.setTrackSelectionParameters(
  player.getTrackSelectionParameters()
    .buildUpon()
    .setAudioOffloadPreferences(audioOffloadPreferences)
    .build());
);