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