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, lựa chọn bản nhạc là quá trình xác định bản nhạc nào được chọn để phát lại. Quy trình lựa chọn kênh được TrackSelectionParameters định cấu hình, cho phép chỉ định nhiều quy tắc ràng buộc và chế độ ghi đè khác nhau ảnh hưởng đến việc lựa chọn kênh.

Truy vấn các kênh có sẵn

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

  • Các bản nhạc có sẵn sẽ được biết đến khi quá trình chuẩn bị mục nội dung đa phương tiện đang phát hoàn tất. Xin 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 nội dung trong đó có nội dung gì.
  • Các bản nhạc có sẵn sẽ thay đổi do quá trình phát lại chuyển đổi từ mục nội dung đa phương tiện này sang mục khác.
  • Thay đổi đối với các bản nhạc đã 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 kênh 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 trình bày cùng một nội dung nhưng ở nhiều định dạng.

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

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

Mỗi Group có thể được truy vấn để xác định những bản nhạc được hỗ trợ để phát (hiện được chọn) và Format nội dung 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 bản nhạc được hỗ trợ nếu Player có thể giải mã và kết xuất mẫu của nó. Xin lưu ý rằng ngay cả khi nhiều nhóm bản nhạc cùng loại (ví dụ: nhiều nhóm bản âm thanh) được hỗ trợ, thì điều đó chỉ có nghĩa là các nhóm bản nhạc đó được hỗ trợ riêng lẻ và người chơi không nhất thiết có thể phát các bản nhạc đó cùng một lúc.
  • Một bản nhạc sẽ được chọn nếu đã được chọn để phát dựa trên TrackSelectionParameters hiện tại. Nếu bạn chọn nhiều bản nhạc trong một nhóm bản nhạc, thì trình phát 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). Xin lưu ý rằng hệ thống sẽ chỉ phát một trong số các bản nhạc này tại một thời điểm.

Sửa đổi các thông số lựa chọn kênh phát hành

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

Kotlin

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

Java

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

Chọn kênh phát hà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 điều kiện ràng buộc độc lập với các kênh thực sự có sẵn. Các hạn chế hiện có bao gồm:

  • Chiều rộng, chiều cao, tốc độ khung hình và tốc độ bit tối đa và tối thiểu của video.
  • Số lượng kênh âm thanh và tốc độ bit tối đa.
  • Loại MIME ưu tiên 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 quy tắc ràng buộc này, chẳng hạn như hạn chế độ phân giải video ở kích thước hiển thị và ưu tiên ngôn ngữ âm thanh khớp với cài đặt Ngôn ngữ hệ thống của người dù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 kênh cụ thể trong các kênh có sẵn:

  • Bạn có thể chỉ định các quy tắc ràng buộc trước khi biết tính năng theo dõi mà một mục nội dung đa phương tiện cung cấp. Điều này có nghĩa là bạn có thể chỉ định các điều kiện ràng buộc 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 các kênh cụ thể sẽ yêu cầu mã xử lý ứng dụng chờ cho đến khi biết được các kênh có sẵn.
  • 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 một danh sách phát, ngay cả khi các mục đó có các bản nhạc có sẵn khác nhau. Ví dụ: quy tắc hạn chế ngôn ngữ âm thanh ưu tiên 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 kênh ở ngôn ngữ đó thay đổi tuỳ theo mục nội dung đa phương tiện. Điều này không đúng khi chọn các bản nhạc cụ thể, như mô tả dưới đây.

Chọn các bản nhạc cụ thể

Bạn có thể chọn các bản nhạc cụ thể bằng TrackSelectionParameters. Trước tiên, các bản nhạc hiện có của người chơi phải được truy vấn bằng Player.getCurrentTracks. Thứ hai, sau khi xác định được các bản nhạc cần chọn, bạn có thể đặt các bản nhạc này trên TrackSelectionParameters bằng TrackSelectionOverride. Ví dụ: để chọn bản nhạc đầu tiên trong 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 phần tử đã chỉ định trong chế độ ghi đè. Do đó, 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 các kênh khác nhau.

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

Bạn có thể tắt hoàn toàn các loại kênh như video, âm thanh hoặc văn bản bằng cách sử dụng TrackSelectionParameters.Builder.setTrackTypeDisabled. Loại theo dõi bị tắt 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ó thể ngăn việc lựa chọn các kênh từ một TrackGroup cụ thể bằng cách chỉ định một 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

TrackSelector sẽ chịu trách nhiệm chọn bản nhạc. Thực thể này có thể được cung cấp bất cứ khi nào ExoPlayer được tạo và sau đó được lấy bằng 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 các trường hợp sử dụng. 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ể bật chế độ phát theo đường hầm trong trường hợp có sự kết hợp của các trình kết xuất đồ hoạ và các kênh đã chọn hỗ trợ tính năng này. Để thực hiện 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 tổ hợp trình kết xuất và các bản nhạc đã chọn hỗ trợ tính nă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());
);