Parça seçimi

Bir medya öğesi birden fazla parça içerdiğinde, hangi parçaların oynatılacağını belirleyen işleme parça seçimi denir. Parça seçimi süreci, TrackSelectionParameters tarafından yapılandırılır. Bu, parça seçimini etkileyen birçok farklı kısıtlamanın ve geçersiz kılmanın belirtilmesine olanak tanır.

Mevcut parçaları sorgulama

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

  • Oynatılan medya öğesinin hazırlanması tamamlandığında kullanılabilir parçalar öğrenilir. 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çiş yaptığından kullanılabilir parçalar değişir.
  • 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() işlevini çağırarak mevcut parçaları da sorgulayabilirsiniz. Döndürülen Tracks, Tracks.Group nesnelerinin bir listesini içerir. Burada, tek bir Group içindeki parçalar aynı içeriği farklı biçimlerde sunar.

Parçaların nasıl gruplandırılabileceğine dair bir örnek olarak, ana video feed'inin beş bit hızında, alternatif video feed'inin (ör. bir spor maçında farklı bir kamera açısı) ise iki bit hızında sağlandığı uyarlanabilir oynatmayı ele alalım. Bu durumda iki video parçası grubu olur. Bunlardan biri beş parça içeren ana video feed'ine, diğeri ise iki parça içeren alternatif video feed'ine karşılık gelir.

Farklı dillerdeki ses parçaları gruplandırılmaz. Bunun nedeni, farklı dillerdeki içeriklerin aynı içerik olarak kabul edilmemesidir. Aynı şekilde, yalnızca bit hızı, örnekleme hızı, kanal sayısı gibi özellikler açısından farklılık gösteren aynı dildeki ses parçaları gruplandırılabilir. Bu durum, metin parçaları için de geçerlidir.

Her Group, hangi parçaların oynatma için desteklendiğini, hangilerinin şu anda seçili olduğunu ve her parçanın hangi Format kullandığını belirlemek için 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, örneklerini çözüp oluşturabiliyorsa parça desteklenir. Aynı türden birden fazla parça grubu (örneğin, birden fazla ses parçası grubu) desteklense bile bunların yalnızca ayrı ayrı desteklendiğini ve oynatıcının bunları aynı anda oynatmasının zorunlu olmadığını unutmayın.
  • Mevcut TrackSelectionParameters göz önüne alındığında oynatılmak üzere seçilen parçalar seçilmiş olarak kabul edilir. Bir parça grubundaki birden fazla parça seçilirse oynatıcı, bu parçaları uyarlanabilir oynatma için kullanır (örneğin, farklı bit hızlarına sahip birden fazla video parçası). Bu parçalardan yalnızca birinin aynı anda çalınacağını unutmayın.

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

Parça seçme işlemi, Player.setTrackSelectionParameters kullanılarak yapılandırılabilir. Bu işlemi hem oynatmadan önce hem de oynatma sırasında yapabilirsiniz. Aşağıdaki örnekte, oynatıcıdan mevcut TrackSelectionParameters değerlerinin nasıl alınacağı, bunların nasıl 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 bölümündeki çoğu seçenek, gerçekten kullanılabilen parçalardan bağımsız olan 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 sınırlandırır ve kullanıcının sistem yerel ayarı ile eşleşen ses dilini tercih eder.

Kısıtlamaya dayalı parça seçimi kullanmanın, mevcut parçalar arasından belirli parçaları seçmeye kıyasla çeşitli avantajları vardır:

  • Bir medya öğesinin hangi parçaları sağladığını bilmeden önce kısıtlamalar belirtebilirsiniz. Bu, kısıtlamaların oynatıcı bir medya öğesi hazırlamadan önce belirtilebileceği anlamına gelir. Belirli parçaların seçilmesi ise mevcut parçalar bilinene kadar uygulama kodunun beklemesini gerektirir.
  • Kısıtlamalar, farklı parçaları olan öğeler olsa bile oynatma listesindeki tüm medya öğeleri için geçerlidir. Örneğin, tercih edilen ses dili kısıtlaması, bu dildeki parçanın Format bir medya öğesinden diğerine değişse bile tüm medya öğelerine 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. İlk olarak, oynatıcının şu anda kullanılabilen parçaları Player.getCurrentTracks kullanılarak sorgulanmalıdır. İkinci olarak, hangi parçaların seçileceğini belirledikten sonra TrackSelectionOverride kullanılarak TrackSelectionParameters üzerinde ayarlanabilirler. Örneğin, belirli bir audioTrackGroup öğesinden 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());

Bir 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, farklı parçalar içeren bir sonraki medya öğesine geçersiz kılma işlemi uygulanamayabilir.

Parça 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 bir parça türü, 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 grubundaki parçaların seçilmesini, bu grup için boş bir geçersiz kılma belirterek de 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, TrackSelector sorumluluğundadır. ExoPlayer oluşturulduğunda ve daha sonra ExoPlayer.getTrackSelector() ile alındığında TrackSelector ö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 olan esnek bir TrackSelector'dir. Player içinde ayarlanan TrackSelectionParameters değerini 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 protokolü

Tünel oluşturma, bazı TV cihazlarında yüksek çözünürlüklü yayınların verimli bir şekilde oynatılmasına yardımcı olabilir. Daha fazla not ve ayrıntı için pil tüketimi sayfasına bakın.

Render'lar ve seçilen parçaların kombinasyonunun desteklediği durumlarda tünellenmiş oynatmayı etkinleştirmek için tercih ayarlayabilirsiniz. Bunu yapmak için DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true) simgesini kullanın.

Ses Aktarımı

Ses boşaltma, özellikle ekran kapalıyken daha uzun oynatma sürelerinde güç tasarrufuna yardımcı olabilir. Diğer notlar ve ayrıntılar için pil tüketimi sayfasına bakın.

İşlemden kaldırılan ses oynatma için tercihler belirleyerek oluşturucuların ve seçilen parçaların kombinasyonunun desteklediği durumlarda bu özelliği etkinleştirebilirsiniz. Bunu yapmak için TrackSelectionParameters içinde 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());