ট্র্যাক নির্বাচন

যখন একটি মিডিয়া আইটেমে একাধিক ট্র্যাক থাকে, তখন ট্র্যাক নির্বাচন হল সেই প্রক্রিয়া যা নির্ধারণ করে যে কোনটি প্লেব্যাকের জন্য বেছে নেওয়া হবে। ট্র্যাক নির্বাচন প্রক্রিয়াটি TrackSelectionParameters দ্বারা কনফিগার করা হয়েছে, যা বিভিন্ন সীমাবদ্ধতা এবং ট্র্যাক নির্বাচনকে প্রভাবিত করে ওভাররাইডকে নির্দিষ্ট করার অনুমতি দেয়।

উপলব্ধ ট্র্যাক জিজ্ঞাসা

আপনি Player.Listener.onTracksChanged শুনতে পারেন ট্র্যাকের পরিবর্তনগুলি সম্পর্কে অবহিত করার জন্য, যার মধ্যে রয়েছে:

  • মিডিয়া আইটেম চালানোর প্রস্তুতি সম্পন্ন হলে উপলব্ধ ট্র্যাকগুলি পরিচিত হয়৷ নোট করুন যে প্লেয়ারকে একটি মিডিয়া আইটেম প্রস্তুত করতে হবে যাতে এটিতে কী ট্র্যাক রয়েছে তা জানার জন্য।
  • প্লেব্যাক একটি মিডিয়া আইটেম থেকে অন্য আইটেম পরিবর্তনের কারণে উপলব্ধ ট্র্যাকগুলি পরিবর্তিত হচ্ছে৷
  • নির্বাচিত ট্র্যাক পরিবর্তন.

কোটলিন

player.addListener(
  object : Player.Listener {
    override fun onTracksChanged(tracks: Tracks) {
      // Update UI using current tracks.
    }
  }
)

জাভা

player.addListener(
    new Player.Listener() {
      @Override
      public void onTracksChanged(Tracks tracks) {
        // Update UI using current tracks.
      }
    });

আপনি player.getCurrentTracks() কল করে বর্তমান ট্র্যাকগুলি জিজ্ঞাসা করতে পারেন। প্রত্যাবর্তিত Tracks Track.Group অবজেক্টের একটি তালিকা রয়েছে, যেখানে একটি একক Group মধ্যে ট্র্যাকগুলি একই বিষয়বস্তু উপস্থাপন করে কিন্তু বিভিন্ন ফর্ম্যাটে।

ট্র্যাকগুলিকে কীভাবে গোষ্ঠীভুক্ত করা যায় তার উদাহরণ হিসাবে, একটি অভিযোজিত প্লেব্যাক বিবেচনা করুন যেখানে একটি প্রধান ভিডিও ফিড পাঁচটি বিটরেটে সরবরাহ করা হয় এবং একটি বিকল্প ভিডিও ফিড (উদাহরণস্বরূপ, একটি ক্রীড়া ম্যাচে একটি ভিন্ন ক্যামেরা কোণ) দুটি বিটরেটে সরবরাহ করা হয়। এই ক্ষেত্রে দুটি ভিডিও ট্র্যাক গ্রুপ থাকবে, একটি পাঁচটি ট্র্যাক সম্বলিত প্রধান ভিডিও ফিডের সাথে সম্পর্কিত এবং দুটি ট্র্যাক ধারণকারী বিকল্প ভিডিও ফিডের জন্য একটি দ্বিতীয়।

অডিও ট্র্যাক যেগুলির ভাষা আলাদা, সেগুলিকে গোষ্ঠীভুক্ত করা হয় না, কারণ বিভিন্ন ভাষার সামগ্রী একই বলে বিবেচিত হয় না৷ বিপরীতভাবে, একই ভাষায় অডিও ট্র্যাকগুলি যা শুধুমাত্র বিটরেট, স্যাম্পলিং রেট, চ্যানেলের সংখ্যা এবং আরও কিছু বৈশিষ্ট্যের মধ্যে আলাদা। এটি পাঠ্য ট্র্যাকের ক্ষেত্রেও প্রযোজ্য।

প্লেব্যাকের জন্য কোন ট্র্যাকগুলি সমর্থিত, কোনটি বর্তমানে নির্বাচিত, এবং প্রতিটি ট্র্যাক কোন Format ব্যবহার করে তা নির্ধারণ করতে প্রতিটি Group জিজ্ঞাসা করা যেতে পারে:

কোটলিন

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)
  }
}

জাভা

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 আপডেট করা যায়:

কোটলিন

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setMaxVideoSizeSd()
    .setPreferredAudioLanguage("hu")
    .build()

জাভা

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setMaxVideoSizeSd()
        .setPreferredAudioLanguage("hu")
        .build());

সীমাবদ্ধতা-ভিত্তিক ট্র্যাক নির্বাচন

TrackSelectionParameters এর বেশিরভাগ বিকল্প আপনাকে সীমাবদ্ধতাগুলি নির্দিষ্ট করতে দেয়, যা আসলে উপলব্ধ ট্র্যাকগুলির থেকে স্বাধীন। উপলব্ধ সীমাবদ্ধতা অন্তর্ভুক্ত:

  • ভিডিওর সর্বোচ্চ এবং সর্বনিম্ন প্রস্থ, উচ্চতা, ফ্রেম রেট এবং বিটরেট।
  • সর্বাধিক অডিও চ্যানেল গণনা এবং বিটরেট।
  • ভিডিও এবং অডিওর জন্য পছন্দের MIME প্রকার।
  • পছন্দের অডিও ভাষা এবং ভূমিকা পতাকা.
  • পছন্দের পাঠ্য ভাষা এবং ভূমিকা পতাকা।

ExoPlayer এই সীমাবদ্ধতার জন্য সংবেদনশীল ডিফল্ট ব্যবহার করে, উদাহরণস্বরূপ ভিডিও রেজোলিউশনকে ডিসপ্লে আকারে সীমাবদ্ধ করা এবং ব্যবহারকারীর সিস্টেম লোকেল সেটিং এর সাথে মেলে এমন অডিও ভাষা পছন্দ করা।

উপলব্ধ ট্র্যাকগুলি থেকে নির্দিষ্ট ট্র্যাকগুলি নির্বাচন করার পরিবর্তে সীমাবদ্ধতা-ভিত্তিক ট্র্যাক নির্বাচন ব্যবহার করার বিভিন্ন সুবিধা রয়েছে:

  • একটি মিডিয়া আইটেম কি ট্র্যাক প্রদান করে তা জানার আগে আপনি সীমাবদ্ধতাগুলি নির্দিষ্ট করতে পারেন৷ এর মানে হল যে প্লেয়ার একটি মিডিয়া আইটেম প্রস্তুত করার আগে সীমাবদ্ধতাগুলি নির্দিষ্ট করা যেতে পারে, যেখানে নির্দিষ্ট ট্র্যাকগুলি নির্বাচন করার জন্য উপলব্ধ ট্র্যাকগুলি জানা না হওয়া পর্যন্ত অপেক্ষা করতে অ্যাপ্লিকেশন কোডের প্রয়োজন হয়৷
  • প্লেলিস্টের সমস্ত মিডিয়া আইটেমের জন্য সীমাবদ্ধতা প্রয়োগ করা হয়, এমনকি সেই আইটেমগুলির বিভিন্ন উপলব্ধ ট্র্যাক থাকলেও৷ উদাহরণস্বরূপ, সমস্ত মিডিয়া আইটেমের জন্য একটি পছন্দের অডিও ভাষার সীমাবদ্ধতা স্বয়ংক্রিয়ভাবে প্রয়োগ করা হবে, এমনকি যদি সেই ভাষার ট্র্যাকের Format একটি মিডিয়া আইটেম থেকে পরবর্তীতে পরিবর্তিত হয়। নীচে বর্ণিত হিসাবে নির্দিষ্ট ট্র্যাক নির্বাচন করার সময় এটি হয় না।

নির্দিষ্ট ট্র্যাক নির্বাচন

TrackSelectionParameters ব্যবহার করে নির্দিষ্ট ট্র্যাক নির্বাচন করা সম্ভব। প্রথমত, প্লেয়ারের বর্তমানে উপলব্ধ ট্র্যাকগুলি Player.getCurrentTracks ব্যবহার করে জিজ্ঞাসা করা উচিত। দ্বিতীয়ত, কোন ট্র্যাকগুলি নির্বাচন করতে হবে তা চিহ্নিত করার পরে, সেগুলি একটি TrackSelectionOverride ব্যবহার করে TrackSelectionParameters এ সেট করা যেতে পারে। উদাহরণস্বরূপ, একটি নির্দিষ্ট audioTrackGroup থেকে প্রথম ট্র্যাক নির্বাচন করতে:

কোটলিন

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setOverrideForType(
      TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0)
    )
    .build()

জাভা

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setOverrideForType(
            new TrackSelectionOverride(
                audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0))
        .build());

একটি TrackSelectionOverride শুধুমাত্র মিডিয়া আইটেমগুলিতে প্রযোজ্য হবে যেগুলিতে ওভাররাইডে নির্দিষ্ট করা একটি TrackGroup সাথে হুবহু মিলে যায়৷ তাই একটি ওভাররাইড পরবর্তী মিডিয়া আইটেমের ক্ষেত্রে প্রযোজ্য নাও হতে পারে যদি সেই আইটেমে বিভিন্ন ট্র্যাক থাকে।

ট্র্যাক প্রকার বা গোষ্ঠী অক্ষম করা হচ্ছে

ভিডিও, অডিও বা টেক্সটের মতো ট্র্যাকের প্রকারগুলি TrackSelectionParameters.Builder.setTrackTypeDisabled ব্যবহার করে সম্পূর্ণরূপে নিষ্ক্রিয় করা যেতে পারে। সমস্ত মিডিয়া আইটেমের জন্য একটি অক্ষম ট্র্যাক প্রকার অক্ষম করা হবে:

কোটলিন

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
    .build()

জাভা

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
        .build());

বিকল্পভাবে, সেই গোষ্ঠীর জন্য একটি খালি ওভাররাইড নির্দিষ্ট করে একটি নির্দিষ্ট TrackGroup থেকে ট্র্যাক নির্বাচন প্রতিরোধ করা সম্ভব:

কোটলিন

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .addOverride(
      TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf())
    )
    .build()

জাভা

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .addOverride(
            new TrackSelectionOverride(
                disabledTrackGroup.getMediaTrackGroup(),
                /* trackIndices= */ ImmutableList.of()))
        .build());

ট্র্যাক নির্বাচক কাস্টমাইজ করা

ট্র্যাক নির্বাচন একটি TrackSelector এর দায়িত্ব, যার একটি উদাহরণ প্রদান করা যেতে পারে যখনই একটি ExoPlayer তৈরি করা হয় এবং পরে ExoPlayer.getTrackSelector() এর মাধ্যমে প্রাপ্ত হয়৷

কোটলিন

val trackSelector = DefaultTrackSelector(context)
val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()

জাভা

DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();

DefaultTrackSelector হল একটি নমনীয় TrackSelector যা বেশিরভাগ ব্যবহারের ক্ষেত্রে উপযুক্ত। এটি Player সেট করা TrackSelectionParameters ব্যবহার করে, তবে কিছু উন্নত কাস্টমাইজেশন বিকল্পও প্রদান করে যা DefaultTrackSelector.ParametersBuilder এ নির্দিষ্ট করা যেতে পারে:

কোটলিন

trackSelector.setParameters(
  trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)

জাভা

trackSelector.setParameters(
    trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

টানেলিং

রেন্ডারার এবং নির্বাচিত ট্র্যাকগুলির সংমিশ্রণ এটিকে সমর্থন করে এমন ক্ষেত্রে আপনি টানেল প্লেব্যাক সক্ষম করতে পারেন৷ এটি করার জন্য, DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true) ব্যবহার করুন।

অডিও অফলোড

আপনি এমন ক্ষেত্রে অফলোড করা অডিও প্লেব্যাক সক্ষম করতে পারেন যেখানে রেন্ডারার এবং নির্বাচিত ট্র্যাকের সংমিশ্রণ এটিকে সমর্থন করে। এটি করার জন্য, আপনার TrackSelectionParametersAudioOffloadModePreferences উল্লেখ করুন।

কোটলিন

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

জাভা

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