Parça seçimi

Bir medya öğesi birden fazla parça içeriyorsa parça seçimi, oynatılmak üzere hangi parçaların seçileceğini belirleyen işlemdir. Parça seçim süreci TrackSelectionParameters tarafından yapılandırılır. Bu, parça seçimini etkileyen birçok farklı kısıtlama ve geçersiz kılma koşulunun belirtilmesine olanak tanır.

Mevcut parçaları sorgulama

Aşağıdakiler de dahil olmak üzere parçalardaki değişiklikler hakkında bildirim almak için Player.Listener.onTracksChanged'ü dinleyebilirsiniz:

  • Oynatılan medya öğesinin hazırlanması tamamlandığında mevcut parçalar bilinir hale gelir. Oynatıcının, hangi parçaları içerdiğini bilmek için bir medya öğesi hazırlaması gerektiğini unutmayın.
  • Oynatma bir medya öğesinden diğerine geçtiği için kullanılabilen parçalar değişiyor.
  • Seçilen parçalarda yapılan değişiklikler.

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.
      }
    });

player.getCurrentTracks() kodunu arayarak mevcut parçaları da sorgulayabilirsiniz. Döndürülen Tracks, tek bir Group içindeki parçaların aynı içeriği farklı biçimlerde sunduğu Tracks.Group nesnelerinin bir listesini içerir.

Parçaların nasıl gruplandırılabileceğine dair bir örnek olarak, ana video feed'inin beş bit hızında ve alternatif video feed'inin (ör. bir spor maçındaki farklı bir kamera açısının) iki bit hızında sağlandığı bir uyarlanabilir oynatma işlemini düşünebilirsiniz. Bu durumda, biri beş parça içeren ana video feed'ine, diğeri iki parça içeren alternatif video feed'ine karşılık gelen iki video parçası grubu olur.

Farklı dillerdeki içerikler aynı kabul edilmediğinden, dilleri farklı olan ses parçaları gruplandırılmaz. Buna karşılık, aynı dilde olup yalnızca bit hızı, örnekleme hızı, kanal sayısı gibi özelliklerde farklılık gösteren ses parçaları gruplandırılabilir. Bu durum altyazı parçaları için de geçerlidir.

Oynatma için hangi parçaların desteklendiğini, hangilerinin şu anda seçili olduğunu ve her parçanın hangi Format'yi kullandığını belirlemek üzere her Group sorgulanabilir:

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

  • Player, örneklerinin kodunu çözebiliyor ve oluşturabiliyorsa parça desteklenir. Aynı türde birden fazla parça grubunun (ör. birden fazla ses parçası grubu) desteklenmesi, bunların yalnızca tek tek desteklendiği anlamına gelir ve oynatıcının bunları aynı anda çalabilmesi gerekmez.
  • Mevcut TrackSelectionParameters göz önüne alındığında oynatılmak üzere seçilen parçalar seçili olarak kabul edilir. Bir parça grubunda birden fazla parça seçilirse oynatıcı, bu parçaları uyarlanabilir oynatma için kullanır (ör. farklı bit hızlarına sahip birden fazla video parçası). Aynı anda yalnızca bir parçanın çalınacağını unutmayın.

Parça seçimi parametrelerini değiştirme

Parça seçim süreci Player.setTrackSelectionParameters kullanılarak yapılandırılabilir. Bunu hem oynatmadan önce hem de oynatma sırasında yapabilirsiniz. Aşağıdaki örnekte, oynatıcıdan mevcut TrackSelectionParameters değerinin nasıl alınacağı, değiştirileceği ve Player değerinin değiştirilmiş sonuçla nasıl güncelleneceği gösterilmektedir:

Kotlin

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

Java

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

Kısıtlamaya dayalı parça seçimi

TrackSelectionParameters'teki seçeneklerin çoğu, mevcut kanallardan bağımsız kısıtlamalar belirtmenize olanak tanır. Kullanılabilir kısıtlamalar şunlardır:

  • Maksimum ve minimum video genişliği, yüksekliği, kare hızı ve bit hızı.
  • Maksimum ses kanalı sayısı ve bit hızı.
  • Video ve ses için tercih edilen MIME türleri.
  • Tercih edilen ses dilleri ve rol işaretleri.
  • Tercih edilen metin dilleri ve rol işaretleri.

ExoPlayer, bu kısıtlamalar için makul varsayılan değerler kullanır. Örneğin, video çözünürlüğünü ekran boyutuyla kısıtlar ve kullanıcının sistem yerel ayarı ile eşleşen ses dilini tercih eder.

Mevcut parçalar arasından belirli parçaları seçmek yerine kısıtlamaya dayalı parça seçimini kullanmanın çeşitli avantajları vardır:

  • Bir medya öğesinin hangi parçaları sağladığını bilmeden önce kısıtlamaları belirtebilirsiniz. Bu, oynatıcı bir medya öğesi hazırlamadan önce kısıtlamaların belirtilebileceği anlamına gelir. Belirli parçaları seçmek için ise uygulama kodunun, mevcut parçalar bilinene kadar beklemesi gerekir.
  • Sınırlamalar, farklı parçalara sahip olsalar bile oynatma listesindeki tüm medya öğeleri için uygulanır. Örneğin, tercih edilen ses dili kısıtlaması, ilgili dilde parçanın Format değeri bir medya öğesinden diğerine değişse bile tüm medya öğeleri için otomatik olarak uygulanır. Aşağıda açıklandığı gibi belirli parçalar seçildiğinde bu durum geçerli değildir.

Belirli parçaları seçme

TrackSelectionParameters simgesini kullanarak belirli parçaları seçebilirsiniz. Öncelikle, oynatıcının şu anda mevcut parçaları Player.getCurrentTracks kullanılarak sorgulanır. İkinci olarak, seçilecek parçaları belirledikten sonra TrackSelectionOverride kullanarak TrackSelectionParameters'te ayarlayabilirsiniz. Örneğin, belirli bir audioTrackGroup'deki ilk parçayı seçmek için:

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 yalnızca geçersiz kılma işleminde belirtilenle tam olarak eşleşen bir TrackGroup içeren medya öğeleri için geçerli olur. Bu nedenle, sonraki bir medya öğesi farklı parçalar içeriyorsa bu öğe için geçersiz kılma işlemi uygulanmayabilir.

Kanal türlerini veya gruplarını devre dışı bırakma

Video, ses veya metin gibi parça türleri TrackSelectionParameters.Builder.setTrackTypeDisabled kullanılarak tamamen devre dışı bırakılabilir. Devre dışı bırakılan parça türleri tüm medya öğeleri için devre dışı bırakılır:

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

Alternatif olarak, belirli bir TrackGroup için boş bir geçersiz kılma belirleyerek bu gruptaki parçaların seçilmesini engelleyebilirsiniz:

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

Parça seçiciyi özelleştirme

Parça seçimi, bir TrackSelector'ün sorumluluğundadır. ExoPlayer oluşturulduğunda ve daha sonra ExoPlayer.getTrackSelector() ile elde edildiğinde bir örneği sağlanabilir.

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, çoğu kullanım alanı için uygun esnek bir TrackSelector'dir. Player içinde ayarlanan TrackSelectionParameters grubunu kullanır ancak DefaultTrackSelector.ParametersBuilder içinde belirtilebilecek bazı gelişmiş özelleştirme seçenekleri de sunar:

Kotlin

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

Java

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

Tünel oluşturma

Oluşturucu ve seçili parçaların kombinasyonunun desteklediği durumlarda tünellenmiş oynatmayı etkinleştirebilirsiniz. Bunun için DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true) simgesini kullanın.

Ses Aktarımı

Oluşturucuların ve seçili parçaların kombinasyonunun desteklediği durumlarda, aktarılan ses oynatmayı etkinleştirebilirsiniz. Bunu yapmak için TrackSelectionParameters dosyanızda AudioOffloadModePreferences değerini belirtin.

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