जब किसी मीडिया आइटम में कई ट्रैक होते हैं, तो ट्रैक को चुनने की प्रोसेस
यह तय करती है कि उनमें से किसे वीडियो चलाने के लिए चुना जाएगा. ट्रैक चुनने की प्रोसेस
TrackSelectionParameters
ने कॉन्फ़िगर किया है, जिससे कई अलग-अलग
और तय की जाने वाली ट्रैक चुनने पर असर डालने वाली पाबंदियों को बदल देता है.
उपलब्ध ट्रैक के बारे में क्वेरी की जा रही है
Player.Listener.onTracksChanged
को सुनने पर, आपको बदलावों के बारे में सूचना मिलेगी
इनमें ये ट्रैक शामिल हैं:
- मीडिया आइटम तैयार करते समय, उपलब्ध ट्रैक का पता चलना पूरा चलाया जाता है. ध्यान दें कि प्लेयर को इसके बारे में जानने के लिए एक मीडिया आइटम तैयार करना होगा इसमें कौन-से ट्रैक हैं.
- एक मीडिया से प्लेबैक ट्रांज़िशन की वजह से, उपलब्ध ट्रैक बदल रहे हैं आइटम को किसी अन्य आइटम से जोड़ना.
- चुने गए ट्रैक में किए गए बदलाव.
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()
पर कॉल करके, मौजूदा ट्रैक के बारे में क्वेरी भी की जा सकती है.
लौटाए गए Tracks
में Track.Group
ऑब्जेक्ट की एक सूची है, जिसमें ट्रैक
एक Group
में वही कॉन्टेंट अलग-अलग फ़ॉर्मैट में दिखाया जाता है.
ट्रैक को अलग-अलग ग्रुप में बांटने के उदाहरण के तौर पर, यहां वीडियो चलाने के लिए ऐसे फ़ॉर्मैट का इस्तेमाल करें जिसमें एक मुख्य वीडियो फ़ीड, पांच बिटरेट में दिया जाता है. साथ ही, दूसरा वीडियो फ़ीड दिया जाता है (उदाहरण के लिए, खेल-कूद वाले किसी वीडियो में किसी दूसरे कैमरा ऐंगल का वीडियो), दो बिटरेट में दिया गया है. इस मामले में, वीडियो ट्रैक के दो ग्रुप होंगे. ग्रुप में शामिल एक मुख्य ग्रुप से जुड़ा होगा पांच ट्रैक वाला वीडियो फ़ीड. वहीं, दूसरे वीडियो फ़ीड के लिए एक सेकंड जिसमें दो ट्रैक शामिल हैं.
अलग-अलग भाषाओं वाले ऑडियो ट्रैक ग्रुप में नहीं किए जाते, क्योंकि अलग-अलग भाषाओं को एक जैसा नहीं माना जाता. वहीं दूसरी ओर, ऑडियो ट्रैक उसी भाषा में है जो सिर्फ़ बिटरेट, सैंपलिंग जैसी प्रॉपर्टी में अलग है दर, चैनल की संख्या वगैरह को ग्रुप में बांटा जा सकता है. यह टेक्स्ट ट्रैक पर भी लागू होता है.
हर Group
से यह तय करने के लिए क्वेरी की जा सकती है कि वे कौनसे ट्रैक पर काम करते हैं
प्लेबैक, जो अभी चुना गया है और हर ट्रैक किस Format
का इस्तेमाल करता है:
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
उस ट्रैक को डिकोड और रेंडर कर पाता हो सैंपल. ध्यान दें कि भले ही एक ही तरह के कई ट्रैक ग्रुप हों (उदाहरण के लिए, एकाधिक ऑडियो ट्रैक समूह) समर्थित हैं, तो इसका केवल यह अर्थ है कि वे व्यक्तिगत रूप से समर्थित होता है और यह ज़रूरी नहीं है कि खिलाड़ी उन्हें एक साथ. - किसी ट्रैक को तब चुना जाता है, जब उसे मौजूदा
TrackSelectionParameters
. अगर किसी एक ट्रैक ग्रुप में कई ट्रैक प्लेयर इन ट्रैक का इस्तेमाल अपने हिसाब से वीडियो चलाने के लिए करता है, तो प्लेयर इन ट्रैक का इस्तेमाल कर सकता है. उदाहरण के लिए, अलग-अलग बिटरेट वाले कई वीडियो ट्रैक होने चाहिए). ध्यान दें कि इनमें से सिर्फ़ एक ट्रैक को किसी भी समय चलाया जाएगा.
ट्रैक चुनने के पैरामीटर में बदलाव किया जा रहा है
ट्रैक चुनने की प्रोसेस को, इसका इस्तेमाल करके कॉन्फ़िगर किया जा सकता है
Player.setTrackSelectionParameters
. ऐसा करने से पहले और बीच में, दोनों तरह से ऐसा किया जा सकता है
प्लेबैक. नीचे दिए गए उदाहरण में, मौजूदा डेटा इंपोर्ट करने का तरीका बताया गया है
प्लेयर से TrackSelectionParameters
डाउनलोड करें, उनमें बदलाव करें, और Player
को अपडेट करें
बदले गए नतीजे के साथ:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
कंस्ट्रेंट के आधार पर ट्रैक चुनना
TrackSelectionParameters
में ज़्यादातर विकल्पों में, आपको सीमाएं तय करने की सुविधा मिलती है.
जो असल में उपलब्ध ट्रैक से अलग हों. उपलब्ध है
पाबंदियों में शामिल हैं:
- वीडियो की ज़्यादा से ज़्यादा और कम से कम चौड़ाई, ऊंचाई, फ़्रेम रेट, और बिटरेट.
- ऑडियो चैनल की ज़्यादा से ज़्यादा संख्या और बिटरेट.
- वीडियो और ऑडियो के लिए पसंदीदा MIME टाइप.
- पसंदीदा ऑडियो भाषाएं और रोल फ़्लैग.
- पसंदीदा टेक्स्ट भाषाएं और रोल फ़्लैग.
ExoPlayer, इन कंस्ट्रेंट के लिए सही डिफ़ॉल्ट का इस्तेमाल करता है, जैसे कि डिसप्ले साइज़ के हिसाब से वीडियो रिज़ॉल्यूशन और ऑडियो भाषा को प्राथमिकता देना उपयोगकर्ता के सिस्टम की स्थान-भाषा सेटिंग से मेल खाता हो.
मौजूदा ट्रैक चुनने के बजाय, कंस्ट्रेंट के हिसाब से ट्रैक चुनने के कई फ़ायदे हैं उपलब्ध ट्रैक में से खास ट्रैक चुनना:
- मीडिया आइटम क्या ट्रैक करता है, यह जानने से पहले आप कंस्ट्रेंट को तय कर सकते हैं. इसका मतलब है कि पाबंदियां तय करने के बाद ही प्लेयर, मीडिया आइटम को चुनने के दौरान, विशिष्ट ट्रैक को चुनने के लिए ऐप्लिकेशन कोड की आवश्यकता होती है उपलब्ध ट्रैक के उपलब्ध होने तक इंतज़ार करें.
- प्लेलिस्ट में मौजूद सभी मीडिया आइटम के लिए पाबंदियां लागू होती हैं. भले ही, वे
आइटम में अलग-अलग उपलब्ध ट्रैक हैं. उदाहरण के लिए, ऑडियो की कोई पसंदीदा भाषा
कंस्ट्रेंट अपने-आप सभी मीडिया आइटम के लिए लागू हो जाएगा, भले ही
उस भाषा में
Format
ट्रैक हर एक मीडिया आइटम के हिसाब से अलग-अलग होता है. जैसा कि नीचे बताया गया है, खास ट्रैक चुनते समय ऐसा नहीं होता.
खास ट्रैक चुनना
TrackSelectionParameters
का इस्तेमाल करके, खास ट्रैक चुने जा सकते हैं. सबसे पहले,
खिलाड़ी के वर्तमान में उपलब्ध ट्रैक का उपयोग करके क्वेरी करें
Player.getCurrentTracks
. दूसरा, यह पता करने के बाद कि कौनसे ट्रैक चुनने हैं,
इन्हें TrackSelectionParameters
पर TrackSelectionOverride
का इस्तेमाल करके सेट किया जा सकता है.
उदाहरण के लिए, किसी खास audioTrackGroup
में से पहला ट्रैक चुनने के लिए:
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
सिर्फ़ उन मीडिया आइटम पर लागू होगा जिनमें
TrackGroup
, ओवरराइड में दी गई वैल्यू से पूरी तरह मेल खाता है. इसलिए,
बाद के मीडिया आइटम पर बदलाव लागू नहीं हो सकता, अगर उस आइटम में
ट्रैक करने में मदद मिलती है.
ट्रैक के टाइप या ग्रुप बंद करना
वीडियो, ऑडियो या टेक्स्ट जैसे ट्रैक टाइप को
TrackSelectionParameters.Builder.setTrackTypeDisabled
. बंद किया गया ट्रैक टाइप
सभी मीडिया आइटम के लिए बंद कर दिया जाएगा:
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());
इसके अलावा, ऐसा हो सकता है कि आप किसी खास कैटगरी के ट्रैक न चुने
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());
ट्रैक सिलेक्टर को पसंद के मुताबिक बनाना
उदाहरण के लिए, TrackSelector
की ज़िम्मेदारी ट्रैक को चुनने की है
इनमें से ExoPlayer
को बनाने और बाद में पाने पर, यह जानकारी दी जा सकती है
ExoPlayer.getTrackSelector()
के साथ.
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
एक सुविधाजनक TrackSelector
है, जो ज़्यादातर इस्तेमाल के लिए सही है
मामले. यह Player
में सेट किए गए TrackSelectionParameters
का इस्तेमाल करता है, लेकिन
सेटिंग को पसंद के मुताबिक बनाने के कुछ बेहतर विकल्प उपलब्ध कराता है. इन विकल्पों को
DefaultTrackSelector.ParametersBuilder
:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
टनलिंग
ऐसे मामलों में टनल किए गए प्लेबैक को चालू किया जा सकता है जहां रेंडरर और
चुनिंदा ट्रैक इसका समर्थन करते हैं. ऐसा करने के लिए,
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
.
ऑडियो ऑफ़लोड
आप ऑफ़लोडेड ऑडियो प्लेबैक को उन मामलों में सक्षम कर सकते हैं जहां
रेंडरर और चुने गए ट्रैक इसका इस्तेमाल कर सकते हैं. ऐसा करने के लिए,
आपके TrackSelectionParameters
में 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()); );