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

যখন কোনও মিডিয়া আইটেমে একাধিক ট্র্যাক থাকে, তখন ট্র্যাক নির্বাচন হল সেই প্রক্রিয়া যা নির্ধারণ করে যে কোনটি প্লেব্যাকের জন্য বেছে নেওয়া হবে। ট্র্যাক নির্বাচন প্রক্রিয়াটি 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 Tracks.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());