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