انتخاب آهنگ

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

غیرفعال کردن انواع یا گروه‌های آهنگ

انواع آهنگ مانند ویدیو، صدا یا متن را می‌توان با استفاده از 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());

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

کاتلین

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

جاوا

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

تونل سازی

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

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

تخلیه صوتی

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

شما می‌توانید تنظیمات مربوط به پخش صدای offloaded را تنظیم کنید تا در مواردی که ترکیب رندرکننده‌ها و آهنگ‌های انتخاب‌شده از آن پشتیبانی می‌کنند، فعال شود. برای انجام این کار، 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());