Chọn bản nhạc

Khi một mục nội dung đa phương tiện chứa nhiều bản nhạc, quá trình lựa chọn bản nhạc là quá trình xác định video nào trong số đó được chọn để phát lại. Quá trình lựa chọn kênh phát hành là do TrackSelectionParameters định cấu hình. Công cụ này cho phép nhiều chế độ cài đặt các quy tắc ràng buộc và ghi đè ảnh hưởng đến việc lựa chọn bản nhạc sẽ được chỉ định.

Truy vấn các kênh hiện có

Bạn có thể nghe Player.Listener.onTracksChanged để được thông báo về các thay đổi vào kênh, bao gồm:

  • Các bản nhạc hiện có sẽ được biết đến khi quá trình chuẩn bị cho mục nội dung đa phương tiện đang được số lượt hoàn thành đã phát. Lưu ý rằng người chơi cần chuẩn bị một mục nội dung đa phương tiện để biết những bản nhạc trong đó.
  • Các bản nhạc hiện có sẽ thay đổi do việc chuyển đổi phát từ một nội dung nghe nhìn mục này sang mục khác.
  • Có thay đổi đối với những kênh đã chọn.

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTracksChanged(tracks: Tracks) {
      // Update UI using current tracks.
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTracksChanged(Tracks tracks) {
        // Update UI using current tracks.
      }
    });

Bạn cũng có thể truy vấn các tuyến đường hiện tại bằng cách gọi player.getCurrentTracks(). Tracks được trả về chứa danh sách đối tượng Track.Group, trong đó các bản nhạc trong một Group duy nhất trình bày cùng một nội dung nhưng ở định dạng khác nhau.

Ví dụ về cách nhóm các bản nhạc, hãy cân nhắc việc phát thích ứng trong đó nguồn cấp dữ liệu video chính được cung cấp ở 5 tốc độ bit và nguồn cấp dữ liệu video thay thế (ví dụ: góc quay khác trong một trận đấu thể thao) được cung cấp trong hai tốc độ bit. Trong trường hợp này, sẽ có hai nhóm bản video, một nhóm tương ứng với nguồn cấp dữ liệu video chứa 5 bản nhạc và một giây cho nguồn cấp dữ liệu video thay thế có hai bản nhạc.

Các bản âm thanh có ngôn ngữ khác nhau không được nhóm lại vì nội dung trong các ngôn ngữ khác nhau sẽ không được coi là giống nhau. Ngược lại, bản âm thanh có cùng ngôn ngữ, chỉ khác về thuộc tính như tốc độ bit, hoạt động lấy mẫu có thể được nhóm lại, số lượng kênh, v.v. Chế độ này cũng áp dụng cho các bản văn bản.

Bạn có thể truy vấn mỗi Group để xác định bản nhạc được hỗ trợ chế độ phát (hiện đang được chọn) và chế độ Format mà mỗi bản nhạc sử dụng:

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

Java

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

  • Một kênh sẽ được hỗ trợ nếu Player có thể giải mã và kết xuất kênh đó mẫu. Xin lưu ý rằng ngay cả khi nhiều nhóm kênh theo dõi cùng loại (ví dụ: nhiều nhóm bản âm thanh) được hỗ trợ, nhưng điều đó chỉ có nghĩa là các nhóm này được hỗ trợ riêng và người chơi không nhất thiết phải có thể phát các video đó tại .
  • Một bản nhạc sẽ được chọn nếu bản nhạc đó đã được chọn để phát dựa trên TrackSelectionParameters. Nếu nhiều kênh trong một nhóm kênh phát hành đã chọn, trình phát sẽ sử dụng các bản nhạc này để phát thích ứng (ví dụ: nhiều bản video có tốc độ bit khác nhau). Lưu ý rằng chỉ một trong số này bản nhạc sẽ được phát cùng lúc.

Sửa đổi thông số lựa chọn kênh

Bạn có thể định cấu hình quá trình lựa chọn kênh bằng Player.setTrackSelectionParameters. Bạn có thể làm việc này cả trước và trong khi video. Ví dụ sau đây minh hoạ cách lấy giá trị hiện tại TrackSelectionParameters trong trình phát, sửa đổi chúng và cập nhật Player với kết quả được sửa đổi:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setMaxVideoSizeSd()
    .setPreferredAudioLanguage("hu")
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setMaxVideoSizeSd()
        .setPreferredAudioLanguage("hu")
        .build());

Lựa chọn kênh dựa trên ràng buộc

Hầu hết các tuỳ chọn trong TrackSelectionParameters đều cho phép bạn chỉ định các quy tắc ràng buộc, độc lập với các bản nhạc thực sự có sẵn. Có sẵn các quy tắc ràng buộc bao gồm:

  • Chiều rộng, chiều cao, tốc độ khung hình và tốc độ bit của video tối đa và tối thiểu.
  • Số lượng kênh âm thanh và tốc độ bit tối đa.
  • Các loại MIME được ưu tiên dùng cho video và âm thanh.
  • Ngôn ngữ âm thanh ưu tiên và cờ vai trò.
  • Ngôn ngữ văn bản ưu tiên và cờ vai trò.

ExoPlayer sử dụng các giá trị mặc định hợp lý cho những hạn chế này, chẳng hạn như hạn chế độ phân giải của video so với kích thước hiển thị và ưu tiên ngôn ngữ âm thanh khớp với chế độ cài đặt Ngôn ngữ của hệ thống.

Việc sử dụng lựa chọn kênh dựa trên ràng buộc mang lại một số lợi ích thay vì chọn các bản nhạc cụ thể trong số những bản nhạc có sẵn:

  • Bạn có thể chỉ định các quy tắc ràng buộc trước khi biết được bản nhạc nào mà một mục nội dung đa phương tiện cung cấp. Điều này có nghĩa là các quy tắc ràng buộc có thể được chỉ định trước khi người chơi chuẩn bị một mục nội dung đa phương tiện, trong khi việc chọn kênh cụ thể lại yêu cầu mã xử lý ứng dụng để đợi cho đến khi xác định được các bản nhạc hiện có.
  • Các quy tắc ràng buộc được áp dụng cho mọi mục nội dung đa phương tiện trong danh sách phát, ngay cả khi các mục đó mỗi mục có các bản nhạc có sẵn khác nhau. Ví dụ: một ngôn ngữ ưu tiên cho nội dung âm thanh quy tắc ràng buộc sẽ tự động được áp dụng cho tất cả các mục nội dung đa phương tiện, ngay cả khi Format của bản nhạc bằng ngôn ngữ đó sẽ thay đổi tuỳ theo mục nội dung đa phương tiện. Tuy nhiên, trường hợp này không xảy ra khi chọn các bản nhạc cụ thể, như mô tả dưới đây.

Chọn những bản nhạc cụ thể

Bạn có thể chọn những kênh cụ thể bằng TrackSelectionParameters. Đầu tiên, bản nhạc hiện có của trình phát nên được truy vấn bằng cách sử dụng Player.getCurrentTracks. Thứ hai, khi đã xác định được kênh cần chọn, bạn có thể đặt chúng trên TrackSelectionParameters bằng TrackSelectionOverride. Ví dụ: để chọn bản nhạc đầu tiên từ một audioTrackGroup cụ thể:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setOverrideForType(
      TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0)
    )
    .build()

Java

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

TrackSelectionOverride sẽ chỉ áp dụng cho các mục nội dung đa phương tiện chứa TrackGroup khớp chính xác với giá trị được chỉ định trong phần ghi đè. Do đó, một chế độ ghi đè có thể không áp dụng cho mục nội dung đa phương tiện tiếp theo nếu mục đó chứa bản nhạc khác nhau.

Tắt các loại hoặc nhóm theo dõi

Bạn có thể tắt hoàn toàn các loại bản nhạc như video, âm thanh hoặc văn bản bằng cách sử dụng TrackSelectionParameters.Builder.setTrackTypeDisabled. Một loại kênh bị vô hiệu hoá sẽ bị tắt đối với tất cả các mục nội dung đa phương tiện:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
        .build());

Ngoài ra, bạn cũng có thể ngăn việc lựa chọn các bản nhạc từ một TrackGroup bằng cách chỉ định cơ chế ghi đè trống cho nhóm đó:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .addOverride(
      TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf())
    )
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .addOverride(
            new TrackSelectionOverride(
                disabledTrackGroup.getMediaTrackGroup(),
                /* trackIndices= */ ImmutableList.of()))
        .build());

Tuỳ chỉnh bộ chọn bản nhạc

Việc lựa chọn kênh là trách nhiệm của TrackSelector, một thực thể Bạn có thể cung cấp số này bất cứ khi nào tạo ExoPlayer và lấy được sau cùng với ExoPlayer.getTrackSelector().

Kotlin

val trackSelector = DefaultTrackSelector(context)
val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()

Java

DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();

DefaultTrackSelector là một TrackSelector linh hoạt phù hợp với hầu hết nhu cầu sử dụng trường hợp. Phương thức này sử dụng TrackSelectionParameters được đặt trong Player, nhưng cũng cung cấp một số tuỳ chọn tuỳ chỉnh nâng cao có thể được chỉ định trong DefaultTrackSelector.ParametersBuilder:

Kotlin

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

Java

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

Tạo đường hầm

Bạn có thể cho phép phát theo đường hầm trong trường hợp sự kết hợp giữa trình kết xuất và các kênh được chọn có hỗ trợ định dạng này. Để làm việc này, hãy sử dụng DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Giảm tải âm thanh

Bạn có thể bật tính năng phát âm thanh giảm tải trong trường hợp trình kết xuất đồ hoạ và kênh được chọn hỗ trợ định dạng này. Để thực hiện việc này, hãy chỉ định AudioOffloadModePreferences trong TrackSelectionParameters của bạn.

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

Java

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