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