選取軌道

如果媒體項目包含多個音軌, 將由系統選擇播放的內容。音軌選取程序為 是由 TrackSelectionParameters 設定,因此可採用 有限制條件和覆寫值會影響指定的音軌選擇。

查詢可用的曲目

你可以聆聽Player.Listener.onTracksChanged,以便接收變更通知 曲目:

  • 媒體項目準備作業時,可用的音軌就會出現 播放完畢。請注意,播放器需要先準備要偵測的媒體項目 以及其中包含的音軌
  • 從一個媒體開始播放時,可用的曲目會有所變動 移至另一個項目
  • 所選測試群組的變更。
KotlinJava
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

KotlinJava
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 修改後的結果:

KotlinJava
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。第二,找出要選取的音軌 他們可以使用 TrackSelectionOverrideTrackSelectionParameters 上進行設定。 例如,如要從特定 audioTrackGroup 選取第一個音軌:

KotlinJava
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。停用的測試群組類型 將停用所有媒體項目:

KotlinJava
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,方法是為該群組指定空白的覆寫值:

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

KotlinJava
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:

KotlinJava
trackSelector.setParameters(
  trackSelector
.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)
trackSelector.setParameters(
    trackSelector
.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

隧道

如果同時使用轉譯器和轉譯器 所選音軌支援這項功能方法是使用 DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)

音訊卸載

在下列情況中,您可以啟用卸載音訊播放功能 轉譯器和所選測試群組都支援這項功能。方法是指定 您的 TrackSelectionParameters 中的 AudioOffloadModePreferences

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