如果媒體項目包含多個音軌,
將由系統選擇播放的內容。音軌選取程序為
是由 TrackSelectionParameters
設定,因此可採用
有限制條件和覆寫值會影響指定的音軌選擇。
查詢可用的曲目
你可以聆聽Player.Listener.onTracksChanged
,以便接收變更通知
曲目:
- 媒體項目準備作業時,可用的音軌就會出現 播放完畢。請注意,播放器需要先準備要偵測的媒體項目 以及其中包含的音軌
- 從一個媒體開始播放時,可用的曲目會有所變動 移至另一個項目
- 所選測試群組的變更。
player.addListener(
object : Player.Listener {
override fun onTracksChanged(tracks: Tracks) {
// Update UI using current tracks.
}
}
)
player.addListener(
new Player.Listener() {
@Override
public void onTracksChanged(Tracks tracks) {
// Update UI using current tracks.
}
});
您也可以呼叫 player.getCurrentTracks()
來查詢目前的測試群組。
傳回的 Tracks
包含 Track.Group
物件清單,而該清單內的追蹤
單一 Group
提供相同內容,但格式不同。
為了示範如何將曲目分組,你不妨考慮採用自動調整播放功能, 主要視訊動態饋給會以五位元率提供,以及另一個影片動態饋給 (例如運動賽事的不同攝影機角度) 會以兩種位元率提供。 本例中會有兩個視訊軌群組,一個與主要測試群組對應 含有五首曲目的影片動態消息,以及 1 則替代視訊動態饋給 內含兩首音軌
不分語言的音軌,因為 系統不會把不同的語言視為相同相反地,音軌 有別於相同語言,但位元率、取樣等屬性 費率和頻道數等都能分組這也適用於文字軌。
您可以查詢每個 Group
,以決定支援哪些音軌
播放 (目前選取的項目),以及各首曲目使用的 Format
:
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)
}
}
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);
}
}
- 如果
Player
能夠解碼及轉譯音軌,就表示支援音軌 樣本。請注意,即使有多個同類型的測試群組群組 (例如 多個音軌群組), 而且播放器不一定可以在 - 如果已針對目前播放的曲目選擇播放音軌,系統就會選取
TrackSelectionParameters
。如果單一測試群組中的多個測試群組 選擇後,播放器就會使用這些音軌自動調整播放頻率 (例如 擁有不同位元率的多個視訊軌)。請注意,上述其中一個 音訊會同時播放
修改音軌選取參數
可以透過以下方法設定音軌選取程序:
Player.setTrackSelectionParameters
。無論是在前後
播放。以下範例說明如何取得
TrackSelectionParameters
,修改播放器並更新 Player
修改後的結果:
player.trackSelectionParameters =
player.trackSelectionParameters
.buildUpon()
.setMaxVideoSizeSd()
.setPreferredAudioLanguage("hu")
.build()
player.setTrackSelectionParameters(
player
.getTrackSelectionParameters()
.buildUpon()
.setMaxVideoSizeSd()
.setPreferredAudioLanguage("hu")
.build());
限製播放曲目
TrackSelectionParameters
中的大部分選項都可讓您指定限制條件
獨立於實際的可用音軌。可用
限制包括:
- 影片寬度、高度、畫面更新率和位元率。
- 音訊聲道數和位元率上限。
- 影片和音訊建議使用的 MIME 類型。
- 偏好的音訊語言和角色旗標。
- 偏好的文字語言和角色旗標。
ExoPlayer 在這些限制中使用合理的預設值,例如限制 影片解析度最好能配合顯示大小,並最好使用 符合使用者的系統語言代碼設定。
相較於使用限制式音軌,我們建議採用下列做法: 並從中選擇可用的音軌:
- 您可以先指定限制,再得知媒體項目提供的追蹤項目。 這表示您可以在玩家準備 媒體項目,而選取特定音軌時,需要執行應用程式程式碼 等到可用的曲目變為已知時再處理
- 限制條件會套用至播放清單中的所有媒體項目,即使這些媒體項目
項目的可用軌跡各不相同。例如偏好的音訊語言
限制條件會自動套用至所有媒體項目,即使
該語言音軌的
Format
會因媒體項目而異。 選取特定音軌時,情況不會改變,詳情請見下文。
選取特定音軌
您可以使用 TrackSelectionParameters
選取特定音軌。首先
如要查詢玩家目前可用的曲目,請使用
Player.getCurrentTracks
。第二,找出要選取的音軌
他們可以使用 TrackSelectionOverride
在 TrackSelectionParameters
上進行設定。
例如,如要從特定 audioTrackGroup
選取第一個音軌:
player.trackSelectionParameters =
player.trackSelectionParameters
.buildUpon()
.setOverrideForType(
TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0)
)
.build()
player.setTrackSelectionParameters(
player
.getTrackSelectionParameters()
.buildUpon()
.setOverrideForType(
new TrackSelectionOverride(
audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0))
.build());
TrackSelectionOverride
只會套用至含有
TrackGroup
與覆寫項目中指定的值完全相符。因此,
如果後續媒體項目包含:
不同的音軌
停用測試群組類型或群組
如要完全停用影片、音訊或文字等追蹤類型,您可以使用
TrackSelectionParameters.Builder.setTrackTypeDisabled
。停用的測試群組類型
將停用所有媒體項目:
player.trackSelectionParameters =
player.trackSelectionParameters
.buildUpon()
.setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
.build()
player.setTrackSelectionParameters(
player
.getTrackSelectionParameters()
.buildUpon()
.setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
.build());
此外,您也可以禁止從特定音軌選擇使用
TrackGroup
,方法是為該群組指定空白的覆寫值:
player.trackSelectionParameters =
player.trackSelectionParameters
.buildUpon()
.addOverride(
TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf())
)
.build()
player.setTrackSelectionParameters(
player
.getTrackSelectionParameters()
.buildUpon()
.addOverride(
new TrackSelectionOverride(
disabledTrackGroup.getMediaTrackGroup(),
/* trackIndices= */ ImmutableList.of()))
.build());
自訂音軌選取器
追蹤選取項目負責 TrackSelector
,即執行個體
您可在建構 ExoPlayer
後取得
搭配 ExoPlayer.getTrackSelector()
。
val trackSelector = DefaultTrackSelector(context)
val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
DefaultTrackSelector
是適合大多數使用的彈性 TrackSelector
用途這會使用 Player
中設定的 TrackSelectionParameters
,但也會使用
提供一些進階自訂選項
DefaultTrackSelector.ParametersBuilder
:
trackSelector.setParameters(
trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)
trackSelector.setParameters(
trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
隧道
如果同時使用轉譯器和轉譯器
所選音軌支援這項功能方法是使用
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
。
音訊卸載
在下列情況中,您可以啟用卸載音訊播放功能
轉譯器和所選測試群組都支援這項功能。方法是指定
您的 TrackSelectionParameters
中的 AudioOffloadModePreferences
。
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()
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());
);