選取軌道

如果媒體項目包含多個音軌, 將由系統選擇播放的內容。音軌選取程序為 是由 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。第二,找出要選取的音軌 他們可以使用 TrackSelectionOverrideTrackSelectionParameters 上進行設定。 例如,如要從特定 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());
);