Khi một mục nội dung nghe nhìn có nhiều bản âm thanh, việc chọn bản âm thanh là quy trình xác định bản âm thanh nào được chọn để phát. Quy trình chọn tệp phụ đề được TrackSelectionParameters định cấu hình, cho phép chỉ định nhiều ràng buộc và chế độ ghi đè khác nhau ảnh hưởng đến việc chọn tệp phụ đề.
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 bản nhạc, bao gồm:
- Các phụ đề/chú thích có sẵn sẽ xuất hiệ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 trình phát cần chuẩn bị một mục nội dung nghe nhìn để biết mục đó chứa những bản nhạc nào.
- Các phụ đề có sẵn thay đổi do quá trình phát chuyển từ một mục nội dung nghe nhì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 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 duy nhất 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 bản phụ đề, hãy xem xét mộ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 quay camera 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ó 2 nhóm bản 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 và một nhóm thứ hai cho nguồn cấp dữ liệu video thay thế chứa 2 bản.
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 các ngôn ngữ khác nhau không được coi là giống nhau. Ngược lại, các phụ đề bằng cùng một ngôn ngữ như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. Điều này cũng áp dụng cho phụ đề.
Bạn có thể truy vấn từng Group để xác định những kênh được hỗ trợ để phát, những kênh hiện được chọn và Format mà mỗi kênh 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 phụ đề được hỗ trợ nếu
Playercó thể giải mã và hiển thị các mẫu của bản phụ đề đó. Xin lưu ý rằng ngay cả khi nhiều nhóm phụ đề thuộc cùng một loại (ví dụ: nhiều nhóm phụ đề â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 có thể phát các nhóm đó cùng một lúc. - Một bản phụ đề được chọn nếu bản phụ đề đó được chọn để phát trong
TrackSelectionParametershiện tại. Nếu bạn chọn nhiều bản phụ đề trong một nhóm bản phụ đề, thì trình phát sẽ dùng các bản phụ đề này để phát thích ứng (ví dụ: nhiều bản phụ đề video có tốc độ bit khác nhau). Xin lưu ý rằng chỉ một trong các bản phụ đề này sẽ được phát tại một thời điểm.
Sửa đổi các thông số lựa chọn phụ đề
Bạn có thể định cấu hình quy trình chọn bản phụ đề bằng cách sử dụng Player.setTrackSelectionParameters. Bạn có thể thực hiện 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 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());
Lựa chọn phụ đề dựa trên các ràng buộc
Hầu hết các lựa 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 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 và cờ vai trò ưu tiên.
- 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 video theo kích thước màn hình và ưu tiên ngôn ngữ âm thanh phù hợ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 chọn phụ đề dựa trên điều kiện ràng buộc thay vì chọn phụ đề cụ thể trong số những phụ đề có sẵn mang lại một số lợi ích sau:
- Bạn có thể chỉ định các điều kiện ràng buộc trước khi biết một mục nội dung nghe nhì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 điều kiện hạn chế 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 phụ đề cụ thể yêu cầu mã ứng dụng phải đợi cho đến khi các bản phụ đề có sẵn được biết.
- Các ràng buộc được áp dụng cho tất cả các mục nội dung nghe nhìn trong một danh sách phát, ngay cả khi những mục đó có các bản nhạc khác nhau. Ví dụ: một ràng buộc về 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 nghe nhìn, ngay cả khi
Formatcủa bản âm thanh 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. Đ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 cách sử dụ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 cách sử dụng Player.getCurrentTracks. Thứ hai, sau khi xác định những bản nhạc cần chọn, bạn có thể đặt các bản nhạc đó trên TrackSelectionParameters bằng cách sử dụ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 những mục nội dung nghe nhìn có TrackGroup khớp chính xác với mục nội dung nghe nhìn được chỉ định trong chế độ cài đặt thay thế. Do đó, chế độ ghi đè có thể không áp dụng cho một mục nội dung nghe nhìn tiếp theo nếu mục đó chứa các bản nhạc khác.
Tắt các loại hoặc nhóm đường chạy
Bạn có thể tắt hoàn toàn các loại phụ đề như video, âm thanh hoặc văn bản bằng cách sử dụng TrackSelectionParameters.Builder.setTrackTypeDisabled. Loại phụ đề bị vô hiệu hoá sẽ bị vô hiệu hoá đố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 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 phụ đề/âm thanh
Việc chọn bản nhạc 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. Thư viện này sử dụng TrackSelectionParameters được đặt trong Player, nhưng cũng cung cấp một số lựa chọn tuỳ chỉnh nâng cao mà bạn có thể chỉ định trong DefaultTrackSelector.ParametersBuilder:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Đường hầm
Việc tạo đường hầm có thể giúp phát video hiệu quả đối với các luồng có độ phân giải cao trên một số thiết bị TV. Hãy xem trang mức tiêu thụ pin để biết thêm các lưu ý và thông tin chi tiết.
Bạn có thể đặt lựa chọn ưu tiên cho chế độ phát qua đường hầm để bật chế độ này 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ợ chế độ 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
Tính năng chuyển tải âm thanh có thể giúp tiết kiệm pin, đặc biệt là khi phát trong thời gian dài mà màn hình tắt. Hãy xem trang mức tiêu thụ pin để biết thêm ghi chú và thông tin chi tiết.
Bạn có thể đặt lựa chọn ưu tiên cho chế độ phát âm thanh được chuyển bớt tải để bật chế độ này 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ợ chế độ này. Để làm 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());