ट्रैक चयन

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