انتخاب تراک

وقتی یک عنصر رسانه‌ای شامل چندین قطعه است، انتخاب قطعه فرایندی است که تعیین می‌کند کدام‌یک برای بازپخش انتخاب شوند. فرایند انتخاب قطعه توسط 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 محتوای یکسانی را ارائه می‌دهند اما در قالب‌های مختلف.

به‌عنوان نمونه‌ای از نحوه گروه‌بندی قطعه‌ها، به بازپخش تطبیقی توجه کنید که در آن یک فید ویدیویی اصلی با پنج نرخ بیت ارائه می‌شود و یک فید ویدیویی جایگزین (برای مثال، زاویه دوربین متفاوت در یک مسابقه ورزشی) با دو نرخ بیت ارائه می‌شود. در این مورد، دو گروه قطعه ویدیو وجود خواهد داشت، یکی مربوط به فید ویدیو اصلی حاوی پنج قطعه، و دیگری مربوط به فید ویدیو جایگزین حاوی دو قطعه.

قطعه‌های صوتی که زبان‌های متفاوتی دارند گروه‌بندی نمی‌شوند، زیرا محتوای به زبان‌های مختلف یکسان درنظر گرفته نمی‌شود. برعکس، قطعه‌های صوتی به یک زبان که فقط در ویژگی‌هایی مانند نرخ بیت، نرخ نمونه‌برداری، تعداد کانال و غیره متفاوت هستند، می‌توانند گروه‌بندی شوند. این موضوع برای قطعه‌های نوشتاری نیز اعمال می‌شود.

هر Group را می‌توان پُرسمان کرد تا مشخص شود کدام قطعه‌ها برای بازپخش پشتیبانی می‌شوند، کدام قطعه‌ها درحال‌حاضر انتخاب شده‌اند، و هر قطعه از چه Format استفاده می‌کند:

کاتلین

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 انعطاف‌پذیر است که برای اکثر موارد استفاده مناسب است. از TrackSelectionParameters تنظیم‌شده در Player استفاده می‌کند، اما گزینه‌های سفارشی‌سازی پیشرفته‌ای نیز ارائه می‌دهد که می‌توانند در DefaultTrackSelector.ParametersBuilder مشخص شوند:

کاتلین

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

جاوا

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

تونل‌سازی

تونل‌سازی ممکن است به بازپخش کارآمد ویدیو از جاری‌سازی‌های با وضوح بالا در برخی‌از دستگاه‌های تلویزیون کمک کند. برای یادداشت‌ها و جزئیات بیشتر، صفحه مصرف باتری را ببینید.

می‌توانید اولویتی برای بازپخش تونل‌دار تنظیم کنید تا در مواردی که ترکیب رندرکننده‌ها و قطعه‌های انتخابی از آن پشتیبانی می‌کنند، فعال شود. برای انجام این کار، از DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true) استفاده کنید.

تخلیه صدا

تخلیه صدا ممکن است به صرفه‌جویی در مصرف انرژی کمک کند، به‌ویژه برای بازپخش‌های طولانی‌تر با خاموش بودن صفحه. برای یادداشت‌ها و جزئیات بیشتر، صفحه مصرف باتری را ببینید.

می‌توانید اولویت‌هایی برای بازپخش صدای واگذارشده تنظیم کنید تا در مواردی که ترکیب رندرکننده‌ها و قطعه‌های انتخابی از آن پشتیبانی می‌کنند فعال شود. برای انجام این کار، AudioOffloadModePreferences را در TrackSelectionParameters مشخص کنید.

کاتلین

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