Parça seçimi

Bir medya öğesi birden çok parça içerdiğinde parça seçimi, oynatma için hangisinin seçileceğini belirleyen süreçtir. Kanal seçim süreci TrackSelectionParameters tarafından yapılandırılır. Bu da kanal seçimini etkileyen birçok farklı kısıtlama ve geçersiz kılmanın belirtilmesine olanak tanır.

Kullanılabilir parçalar sorgulanıyor

Aşağıdakiler dahil olmak üzere, parçalarda yapılan değişikliklerle ilgili bildirim almak için Player.Listener.onTracksChanged kanalını dinleyebilirsiniz:

  • Kullanılabilir parçalar, oynatılan medya öğesi hazırlanırken bilinir hale gelir. Oynatıcının, içerdiği parçaları bilmek için bir medya öğesi hazırlaması gerektiğini unutmayın.
  • Oynatmanın bir medya öğesinden diğerine geçişi nedeniyle kullanılabilir parçalar değişiyor.
  • Seçili kanallarda 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() numaralı telefonu arayarak mevcut parçaları da sorgulayabilirsiniz. Döndürülen Tracks, Track.Group nesnelerinin bir listesini içerir. Burada, tek bir Group içindeki parçalar aynı içeriği ancak farklı biçimlerde sunar.

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

Farklı dillerdeki içeriklerin aynı olmadığı kabul edildiğinden, dilleri farklı olan ses parçaları gruplandırılmaz. Öte yandan, aynı dildeki yalnızca bit hızı, örnekleme hızı, kanal sayısı gibi özellikleri farklı olan ses parçaları gruplanabilir. Bu durum metin parçaları için de geçerlidir.

Oynatma için desteklenen, şu anda seçilen ve her parçanın kullandığı Format parçaları belirlemek için 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, kendi örneklerinin kodunu çözebiliyor ve oluşturabiliyorsa parça desteklenir. Aynı türde birden fazla parça grubu (örneğin, birden fazla ses parçası grubu) desteklense bile, bu yalnızca grupların tek tek destekleneceği ve oynatıcının bunları aynı anda çalamayacağı anlamına gelir.
  • Bir parça, geçerli TrackSelectionParameters nedeniyle çalmak üzere seçilmişse seçilir. Bir parça grubunda 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ı). Aynı anda bu parçalardan yalnızca birinin çalınacağını unutmayın.

Kanal seçim parametrelerini değiştirme

Kanal seçim süreci, Player.setTrackSelectionParameters kullanılarak yapılandırılabilir. Bunu hem oynatma öncesinde hem de oynatma sırasında yapabilirsiniz. Aşağıdaki örnek, oynatıcıdan mevcut TrackSelectionParameters değerinin nasıl alınacağını, bunların nasıl değiştirileceğini ve Player öğesinin değiştirilen sonuçla nasıl güncelleneceğini gösterir:

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 içindeki çoğu seçenek, gerçekte kullanılabilen parçalardan bağımsız olarak kısıtlamalar belirlemenize olanak tanır. Mevcut 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ılanlar kullanır. Örneğin, video çözünürlüğünü ekran boyutuyla kısıtlayabilir ve kullanıcının sistem yerel ayarıyla eşleşen ses dilini tercih eder.

Sunulan 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 öğesini hazırlamadan önce kısıtlamalar belirtilebileceği anlamına gelir. Bununla birlikte, belirli parçaları seçmek için uygulama kodunun, mevcut parçalar bilinene kadar beklemek gerektiği anlamına gelir.
  • Sınırlamalar, bir oynatma listesindeki tüm medya öğelerine, bu öğelerin kullanılabilir parçaları farklı olsa bile uygulanır. Örneğin, söz konusu dildeki parçanın Format değeri bir medya öğesinden diğerine değişse bile, tercih edilen ses dili kısıtlaması tüm medya öğelerine otomatik olarak uygulanır. Aşağıda açıklandığı gibi, belirli parçaları seçerken bu durum geçerli değildir.

Belirli parçaları seçme

TrackSelectionParameters kullanarak belirli parçaları seçebilirsiniz. Öncelikle, oynatıcının şu anda kullanılabilen parçaları Player.getCurrentTracks kullanılarak sorgulanmalıdır. İkinci olarak, seçilecek kanallar tanımlandıktan sonra TrackSelectionParameters üzerinde TrackSelectionOverride kullanılarak ayarlanabilir. Ö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());

TrackSelectionOverride, yalnızca geçersiz kılmada belirtilenle tam olarak eşleşen bir TrackGroup içeren medya öğelerine uygulanır. Bu nedenle, söz konusu öğe farklı parçalar içeriyorsa bir geçersiz kılma işlemi sonraki medya öğesine uygulanmayabilir.

İzleme 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 izleme 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 öğesinden parça seçimini engelleyebilirsiniz. Bunun için söz konusu grup için boş bir geçersiz kılma değeri belirtmeniz de mümkündür:

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

Kanal seçimi, bir TrackSelector sorumluluğundadır. ExoPlayer oluşturulduğunda ve daha sonra ExoPlayer.getTrackSelector() ile elde edildiğinde bunun 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 öğesini kullanır ancak DefaultTrackSelector.ParametersBuilder öğesinde 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şturucular ve seçilen parçalar kombinasyonunun desteklediği durumlarda tünelli oynatmayı etkinleştirebilirsiniz. Bunun için DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true) kullanabilirsiniz.

Ses Boşaltma

Oluşturucular ve seçilen parçalar kombinasyonunun desteklediği durumlarda boş ses çalmayı etkinleştirebilirsiniz. Bunu yapmak için TrackSelectionParameters bölümünde 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());
);