ট্র্যাক বেছে নেওয়া

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

উপলভ্য ট্র্যাক কোয়েরি করা হচ্ছে

ট্র্যাকে হওয়া পরিবর্তন সম্পর্কে বিজ্ঞপ্তি পেতে আপনি Player.Listener.onTracksChanged-এর কথা শুনতে পারেন যার মধ্যে এগুলি অন্তর্ভুক্ত:

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

Kotlin

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

জাভা

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

জাভা

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

জাভা

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

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

ট্র্যাকের ধরন বা গ্রুপ বন্ধ করা

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

Kotlin

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 গ্রুপের জন্য খালি ওভাররাইড নির্দিষ্ট করে সেই গ্রুপ থেকে ট্র্যাক বেছে নেওয়া আটকানো যেতে পারে:

Kotlin

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()-এর মাধ্যমে পাওয়া যেতে পারে।

Kotlin

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-এ উল্লেখ করা যেতে পারে:

Kotlin

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

জাভা

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

জাভা

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