Parça seçimi

Bir medya öğesi birden çok parça içeriyorsa parça seçimi, hangilerinin oynatılmak üzere seçileceğini belirler. Parça seçme süreci TrackSelectionParameters tarafından yapılandırıldığı için birçok farklı Belirtilen parça seçimini etkileyen kısıtlamalar ve geçersiz kılmalar.

Kullanılabilir kanalları sorgulama

Değişikliklerle ilgili bildirim almak için Player.Listener.onTracksChanged adlı parçayı dinleyebilirsiniz şunlar da dahil olmak üzere:

  • Kullanılabilir parçalar, oluşturulan medya öğesi hazırlanırken bilinmeye başlar oynatma sayısındaki artış. Oynatıcının, bilmesi gereken bir medya öğesini hazırlaması gerektiğini unutmayın parçalarının hangileri olduğunu öğrendik.
  • Bir medyadan oynatma geçişi nedeniyle kullanılabilir parçalar değişiyor öğeyi başka bir öğeye koyabilirsiniz.
  • Seçili 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.
      }
    });

Ayrıca, player.getCurrentTracks() numaralı telefonu arayarak mevcut parçaları sorgulayabilirsiniz. Döndürülen Tracks, Track.Group nesnelerinin bir listesini içerir. Bu nesnede parçaların bir tek bir Group aynı içeriği farklı biçimlerde sunuyor.

Parçaların nasıl gruplandırılabileceğine bir örnek olarak, Ana video feed'i beş bit hızında, alternatif bir video feed'i ise (örneğin, bir spor maçında farklı bir kamera açısı) iki bit hızında sağlanır. Bu durumda, biri ana kanala karşılık gelen beş parça, ikincisi ise alternatif video feed'i içeren video feed'i iki parçadan oluşur.

Dilleri farklı olan ses parçaları gruplanmaz çünkü içerik farklı diller aynı kabul edilmez. Buna karşılık ses parçaları bit hızı, örnekleme gibi özellikler açısından farklı olması gerekir. dönüşüm oranı, kanal sayısı vb. bilgiler gruplanabilir. Bu, metin parçaları için de geçerlidir.

Hangi kanalların desteklendiğini belirlemek için her Group sorgulanabilir şu anda seçili olan oynatma listesi ve her parçanın Format kullandığı bilgi listesi:

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, kodunu çözebiliyor ve oluşturabiliyorsa parça desteklenir kullanabilirsiniz. Aynı türde birden çok izleme grubu (örneğin, birden çok ses parçası grubu) desteklenir, bu yalnızca ses parçasının tek başına desteklenir ve oyuncu bunları anlamına gelir.
  • Bir parça, içinde bulunulan döneme göre çalma için seçilmişse seçilir TrackSelectionParameters. Bir izleme grubunda birden fazla parça varsa oynatıcı, uyarlanabilir oynatma için bu parçaları kullanır (örneğin, farklı bit hızlarına sahip birden fazla video parçasını kullanabilirsiniz. Bunlardan yalnızca birinin parça herhangi bir zamanda çalınır.

Kanal seçimi parametrelerini değiştirme

Kanal seçme süreci, Player.setTrackSelectionParameters Bunu hem öncesinde hem de sırasında oynatmaya devam edebilirsiniz. Aşağıdaki örnek, geçerli değerlerin nasıl alınacağını gösterir. TrackSelectionParameters, değişiklikleri yapın ve Player güncelleyin değişiklik yapılan sonuçla:

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çerisindeki çoğu seçenek, sınırlamalar belirlemenize olanak tanır. mevcut parçalardan bağımsızdır. Uygun kısıtlamalar şunları içerir:

  • 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 görüntü boyutuna göre daha yüksek bir ses dili veya video kullanıcının sistem Yerel ayarıyla eşleşir.

İzleme sistemi yerine kısıtlamaya dayalı parça seçimini kullanmanın mevcut parçalardan belirli parçaları seçerek:

  • Bir medya öğesinin hangi kanalları sağladığını öğrenmeden önce kısıtlamalar belirtebilirsiniz. Bu, kısıtlamaların oynatıcı henüz bir kontrol listesi hazırlamadan önce belirlenebileceği anlamına gelir. belirli bir parçayı seçmek için bir uygulama kodu ve mevcut parçalar öğrenilene kadar bekleyin.
  • Kısıtlamalar, oynatma listesindeki tüm medya öğelerine uygulanır. öğe için kullanabileceğiniz farklı parçalar var. Örneğin, tercih edilen ses dili kısıtlama tüm medya öğelerine otomatik olarak uygulanır. Parçanın bu dildeki Format kadarı medya öğeleri arasında değişiklik gösterir. Aşağıda açıklandığı gibi, belirli parçalar seçilirken bu durum geçerli değildir.

Belirli parçaları seçme

TrackSelectionParameters kullanarak belirli parçaları seçebilirsiniz. İlk olarak, Oynatıcının şu anda kullanılabilir olan parçaları Player.getCurrentTracks İkinci olarak, hangi parçaları seçeceğinize karar onlar, TrackSelectionParameters üzerinde TrackSelectionOverride kullanılarak ayarlanabilir. Örneğin, belirli bir audioTrackGroup içindeki 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 TrackGroup. Dolayısıyla sonraki medya öğesi için geçersiz kılma geçerli olmayabilir. oluşturabilirsiniz.

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

Video, ses veya metin gibi parça türleri, TrackSelectionParameters.Builder.setTrackTypeDisabled Devre dışı bırakılmış 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, parçaların belirli bir listeden seçilmesini TrackGroup:

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

Kanal seçiciyi özelleştirme

Kanal seçimi, TrackSelector adlı bir örneğin sorumluluğundadır Bunlar, ExoPlayer oluşturulduğunda ve daha sonra elde edildiğinde sağlanabilir. ExoPlayer.getTrackSelector() ile.

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ıma uygun esnek bir TrackSelector durumlarda işe yarar. Player içinde ayarlanan TrackSelectionParameters kullanılır, ancak aynı zamanda Veri Merkezi bölümünde belirtilebilecek bazı gelişmiş özelleştirme seçenekleri sunar. DefaultTrackSelector.ParametersBuilder:

Kotlin

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

Java

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

Tünel

Tünelsiz oynatmayı etkinleştirebilirsiniz. Örneğin, oluşturucu ve seçili parçalar bunu destekliyor. Bunu yapmak için, DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)

Ses Aktarımı

Şu gibi durumlarda yüklenmemiş ses çalmayı etkinleştirebilirsiniz: oluşturucuları ve seçili parçalar bunu destekler. Bunu yapmak için, TrackSelectionParameters cihazınızdaki AudioOffloadModePreferences.

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