Chọn bản nhạc

Khi một mục nội dung nghe nhìn chứa nhiều bản nhạc, thì việc chọn bản nhạc là quá trình xác định bản nhạc nào sẽ được chọn để phát. Quy trình lựa chọn kênh được định cấu hình bằng TrackSelectionParameters, cho phép chỉ định nhiều quy tắc ràng buộc và ghi đè khác nhau ảnh hưởng đến lựa chọn kênh.

Truy vấn các bản nhạc có sẵn

Bạn có thể theo dõi Player.Listener.onTracksChanged để nhận 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 khi quá trình chuẩn bị của mục nội dung đa phương tiện đang phát hoàn tất. Xin lưu ý rằng trình phát cần chuẩn bị một mục nội dung nghe nhìn để biết những bản nhạc có trong mục đó.
  • Các bản nhạc có sẵn thay đổi do quá trình phát chuyển từ một mục nội dung nghe nhìn sang mục khác.
  • Các thay đổi đối với các 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 bản nhạc hiện tại bằng cách gọi player.getCurrentTracks(). Tracks được trả về chứa danh sách các đối tượng Tracks.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 ở các định dạng khác nhau.

Ví dụ về cách nhóm các kênh, hãy xem xét chế độ 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 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 kênh video, một nhóm tương ứng với nguồn cấp dữ liệu video chính chứa 5 kênh và một nhóm tương ứng với nguồn cấp dữ liệu video thay thế chứa 2 kênh.

Các bản âm thanh có ngôn ngữ khác nhau sẽ không được nhóm lại với nhau vì nội dung bằng nhiều ngôn ngữ không được coi là giống nhau. Ngược lại, bạn có thể nhóm các bản âm thanh bằng 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. Điều này cũng áp dụng cho các kênh văn bản.

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

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 cách sử dụng Player.setTrackSelectionParameters. Bạn có thể làm việc này cả trước và trong khi phát. Ví dụ sau đây minh hoạ cách lấy TrackSelectionParameters hiện tại từ người chơi, sửa đổi các TrackSelectionParameters đó 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 dựa trên quy tắc ràng buộc

Hầu hết các tuỳ chọn trong TrackSelectionParameters 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 điều kiện ràng buộc có sẵn 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ư giới hạn độ phân giải video theo kích thước màn hình và ưu tiên ngôn ngữ âm thanh khớp với chế độ cài đặt Ngôn ngữ hệ thống của người dùng.

Việc sử dụng tính năng lựa chọn kênh dựa trên quy tắc ràng buộc sẽ mang lại một số lợi ích so với việc chọn các kênh cụ thể trong số 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 nội dung đa phương tiện cung cấp những bản nhạc nào. Điều này có nghĩa là bạn có thể chỉ định các quy tắc ràng buộc trước khi trình phát chuẩn bị một mục nội dung nghe nhìn, trong khi việc chọn các bản nhạc cụ thể yêu cầu mã ứng dụng phải đợi cho đến khi biết được các bản nhạc có sẵn.
  • Các quy tắc ràng buộc được áp dụng cho tất cả các mục nội dung nghe nhìn trong danh sách phát, ngay cả khi các mục đó có các bản nhạc khác nhau. Ví dụ: quy tắc ràng buộc về ngôn ngữ âm thanh ưu tiên sẽ tự động áp dụng cho tất cả các mục nội dung nghe nhìn, ngay cả khi Format của bản nhạc bằng ngôn ngữ đó thay đổi từ mục nội dung nghe nhìn này sang mục nội dung nghe nhìn khác. Tuy nhiên, điều này không xảy ra khi bạn chọn các bản nhạc cụ thể, như mô tả bên dưới.

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, bạn nên truy vấn các bản nhạc hiện có của trình phát bằng Player.getCurrentTracks. Thứ hai, sau khi xác định được các kênh cần chọn, bạn có thể đặt các kênh đó 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 nghe nhìn chứa TrackGroup khớp chính xác với mục được chỉ định trong cơ chế ghi đè. Do đó, chế độ ghi đè có thể không áp dụng cho mục nội dung nghe nhìn tiếp theo nếu mục đó chứa nhiều bản nhạc.

Tắt các loại hoặc nhóm kênh

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 kênh bị tắt sẽ bị tắt đối với tất cả các mục nội dung nghe nhì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 chọn các bản nhạc từ một TrackGroup cụ thể bằng cách chỉ định một giá trị 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 kênh

Việc chọn kênh là trách nhiệm của TrackSelector, một thực thể 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 tính năng phát qua đường hầm trong trường hợp tổ hợp trình kết xuất và các kênh đã chọn hỗ trợ tính nă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 được tải xuống 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.

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