जब किसी मीडिया आइटम में एक से ज़्यादा ट्रैक होते हैं, तो ट्रैक चुनने की प्रोसेस यह तय करती है कि उनमें से कौनसे ट्रैक को चलाने के लिए चुना जाएगा. ट्रैक चुनने की प्रोसेस को 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 सिर्फ़ उन मीडिया आइटम पर लागू होगा जिनमें TrackGroup, ओवरराइड में बताए गए 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());