Pemilihan trek

Jika item media berisi beberapa trek, pemilihan trek adalah proses yang menentukan mana yang dipilih untuk diputar. Proses pemilihan {i>track<i} adalah dikonfigurasi oleh TrackSelectionParameters, yang memungkinkan banyak dan mengganti yang memengaruhi pemilihan trek agar ditentukan.

Membuat kueri jalur yang tersedia

Anda dapat mendengarkan Player.Listener.onTracksChanged untuk mendapatkan notifikasi tentang perubahan ke jalur, termasuk:

  • Trek yang tersedia menjadi diketahui saat persiapan item media yang dimainkan hingga selesai. Perhatikan bahwa pemutar perlu menyiapkan item media untuk lagu apa yang ada di dalamnya.
  • Trek yang tersedia berubah karena pemutaran bertransisi dari satu media item ke item lain.
  • 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 Track.Group, dengan jalur dalam Group tunggal menyajikan konten yang sama tetapi dalam format yang berbeda.

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

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

Setiap Group dapat dikueri untuk menentukan jalur mana yang didukung pemutaran, yang saat ini dipilih, dan Format apa 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 sampel. Perlu diketahui bahwa meskipun ada beberapa grup trek dari jenis yang sama (misalnya beberapa grup trek audio) didukung, itu hanya berarti bahwa trek tersebut didukung secara individu dan pemain belum tentu dapat memainkannya di perangkat lain di waktu yang sama.
  • Trek dipilih jika telah dipilih untuk pemutaran mengingat kondisi saat TrackSelectionParameters. Jika beberapa trek dalam satu grup trek dipilih, pemutar akan menggunakan trek ini untuk pemutaran adaptif (misalnya, beberapa trek video dengan kecepatan bit berbeda). Perhatikan bahwa hanya salah satu dari lagu akan diputar pada satu waktu.

Mengubah parameter pemilihan jalur

Proses pemilihan jalur dapat dikonfigurasi menggunakan Player.setTrackSelectionParameters. Anda dapat melakukannya sebelum dan selama pemutaran. Contoh berikut menunjukkan cara memperoleh TrackSelectionParameters dari pemutar, mengubahnya, dan mengupdate Player dengan hasil yang dimodifikasi:

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 terpisah dari jalur yang benar-benar tersedia. Tersedia batasan tersebut meliputi:

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

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

Ada beberapa manfaat menggunakan pemilihan jalur berbasis batasan daripada memilih trek tertentu dari yang tersedia:

  • Anda dapat menentukan batasan sebelum mengetahui trek yang disediakan oleh item media. Artinya, batasan dapat ditentukan sebelum pemain menyiapkan item media, sedangkan memilih trek tertentu memerlukan kode aplikasi untuk tunggu hingga {i>track <i}yang tersedia diketahui.
  • Pembatas diterapkan untuk semua item media dalam playlist, meskipun item tersebut item yang tersedia memiliki jalur yang berbeda. Misalnya, bahasa audio pilihan akan diterapkan secara otomatis ke semua item media, meskipun Format trek dalam bahasa tersebut bervariasi dari satu item media ke item media berikutnya. Hal ini tidak berlaku saat memilih trek tertentu, seperti yang dijelaskan di bawah.

Memilih trek tertentu

Anda dapat memilih trek tertentu menggunakan TrackSelectionParameters. Pertama, untuk trek yang tersedia saat ini, harus dikueri menggunakan Player.getCurrentTracks. Kedua, setelah mengidentifikasi lagu mana yang akan dipilih, keduanya 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 diterapkan ke item media yang berisi TrackGroup sama persis dengan yang ditentukan dalam penggantian. Oleh karena itu mungkin tidak berlaku untuk item media berikutnya jika item tersebut berisi {i>track <i}yang berbeda.

Menonaktifkan jenis atau grup trek

Jenis trek seperti video, audio, atau teks, dapat dinonaktifkan sepenuhnya menggunakan TrackSelectionParameters.Builder.setTrackTypeDisabled. Jenis jalur 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, dimungkinkan untuk mencegah pemilihan {i>track<i} dari TrackGroup 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 trek

Pemilihan jalur adalah tanggung jawab TrackSelector, sebuah instance yang 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 penggunaan penggunaan. Kode ini menggunakan TrackSelectionParameters yang ditetapkan di Player, tetapi juga menyediakan beberapa opsi penyesuaian lanjutan yang dapat ditentukan dalam DefaultTrackSelector.ParametersBuilder:

Kotlin

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

Java

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

{i>Tunneling<i}

Anda dapat mengaktifkan pemutaran yang disalurkan jika kombinasi perender dan mendukung {i>track <i}yang dipilih. Untuk melakukannya, gunakan DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Offload Audio

Anda dapat mengaktifkan pemutaran audio yang dialihkan jika kombinasi yang didukung oleh perender dan jalur yang dipilih. 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());
);