जब किसी मीडिया आइटम में एक से ज़्यादा ट्रैक होते हैं, तो ट्रैक चुनने की प्रोसेस से यह तय होता है कि चलाने के लिए उनमें से किस ट्रैक को चुना जाए. ट्रैक चुनने की प्रोसेस को 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
में Tracks.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
में मौजूद ज़्यादातर विकल्पों की मदद से, पाबंदियां तय की जा सकती हैं. ये पाबंदियां, असल में उपलब्ध ट्रैक से अलग होती हैं. उपलब्ध सीमाओं में ये शामिल हैं:
- वीडियो की चौड़ाई, ऊंचाई, फ़्रेम रेट, और बिटरेट की ज़्यादा से ज़्यादा और कम से कम वैल्यू.
- ऑडियो चैनल की ज़्यादा से ज़्यादा संख्या और बिटरेट.
- वीडियो और ऑडियो के लिए पसंदीदा एमआईएमई टाइप.
- ऑडियो की पसंदीदा भाषाएं और भूमिका के फ़्लैग.
- टेक्स्ट के लिए पसंदीदा भाषाएं और भूमिका के फ़्लैग.
ExoPlayer, इन सीमाओं के लिए डिफ़ॉल्ट तौर पर सही विकल्पों का इस्तेमाल करता है. उदाहरण के लिए, वीडियो रिज़ॉल्यूशन को डिसप्ले साइज़ तक सीमित करना और ऑडियो की ऐसी भाषा को प्राथमिकता देना जो उपयोगकर्ता के सिस्टम की लोकल सेटिंग से मेल खाती हो.
उपलब्ध ट्रैक में से किसी खास ट्रैक को चुनने के बजाय, पाबंदी के आधार पर ट्रैक चुनने के कई फ़ायदे हैं:
- किसी मीडिया आइटम में कौनसे ट्रैक मौजूद हैं, यह जानने से पहले ही आपके पास पाबंदियां तय करने का विकल्प होता है. इसका मतलब है कि प्लेयर के मीडिया आइटम को तैयार करने से पहले, पाबंदियां तय की जा सकती हैं. वहीं, खास ट्रैक चुनने के लिए, ऐप्लिकेशन को उपलब्ध ट्रैक के बारे में पता चलने तक इंतज़ार करना पड़ता है.
- प्लेलिस्ट में मौजूद सभी मीडिया आइटम पर पाबंदियां लागू होती हैं. भले ही, उन आइटम में अलग-अलग ट्रैक उपलब्ध हों. उदाहरण के लिए, ऑडियो की पसंदीदा भाषा से जुड़ी पाबंदी, सभी मीडिया आइटम पर अपने-आप लागू हो जाएगी. भले ही, उस भाषा में ट्रैक का
Format
एक मीडिया आइटम से दूसरे मीडिया आइटम में अलग हो. हालांकि, चुनिंदा ट्रैक चुनने पर ऐसा नहीं होता. इस बारे में नीचे बताया गया है.
खास ट्रैक चुनना
TrackSelectionParameters
का इस्तेमाल करके, खास ट्रैक चुने जा सकते हैं. सबसे पहले, Player.getCurrentTracks
का इस्तेमाल करके, प्लेयर में मौजूद ट्रैक के बारे में जानकारी मांगी जानी चाहिए. दूसरा, यह तय करने के बाद कि कौनसे ट्रैक चुनने हैं, TrackSelectionOverride
का इस्तेमाल करके उन्हें TrackSelectionParameters
पर सेट किया जा सकता है.
उदाहरण के लिए, किसी खास 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
सिर्फ़ उन मीडिया आइटम पर लागू होगा जिनमें ऐसा TrackSelectionOverride
शामिल हो जो बदलाव करने के लिए दिए गए 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()); );