انتخاب آهنگ

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

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

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

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

استفاده از انتخاب آهنگ مبتنی بر محدودیت به جای انتخاب آهنگ‌های خاص از میان موارد موجود، مزایای متعددی دارد:

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

انتخاب آهنگ های خاص

با استفاده از TrackSelectionParameters می توان آهنگ های خاصی را انتخاب کرد. ابتدا، آهنگ‌های موجود در حال حاضر پخش‌کننده باید با استفاده از Player.getCurrentTracks جستجو شوند. دوم، با شناسایی آهنگ‌هایی که باید انتخاب شوند، می‌توان آن‌ها را روی TrackSelectionParameters با استفاده از TrackSelectionOverride تنظیم کرد. به عنوان مثال، برای انتخاب اولین آهنگ از یک 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) استفاده کنید.

Offload صوتی

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