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