開始使用

如果是簡單的用途,開始使用 ExoPlayer 包括實作以下步驟:

  1. 將 ExoPlayer 新增為專案的依附元件。
  2. 建立 ExoPlayer 執行個體。
  3. 將播放器附加至檢視區塊 (用於輸出影片和使用者輸入內容)。
  4. 利用 MediaItem 準備玩家可以進行的遊戲。
  5. 完成後,請放開播放器。

以下將詳細說明這些步驟。如需完整範例,請參閱主要試用版應用程式中的 PlayerActivity

將 ExoPlayer 新增為依附元件

新增 ExoPlayer 模組

如要開始使用 AndroidX Media3,最簡單的方法是在應用程式模組的 build.gradle 檔案中,將所需的程式庫加入 Gradle 依附元件。

舉例來說,如要依附具有 DASH 播放功能的 ExoPlayer 和 UI 元件,您可以在模組中新增依附元件,如下所示:

Kotlin

implementation("androidx.media3:media3-exoplayer:1.3.1")
implementation("androidx.media3:media3-exoplayer-dash:1.3.1")
implementation("androidx.media3:media3-ui:1.3.1")

Groovy

implementation "androidx.media3:media3-exoplayer:1.3.1"
implementation "androidx.media3:media3-exoplayer-dash:1.3.1"
implementation "androidx.media3:media3-ui:1.3.1"

1.3.1 代表您偏好的版本 (如要瞭解最新版本,請參閱版本資訊)。所有模組都必須相同。

AndroidX Media3 的程式庫模組依附於外部程式庫,以提供額外功能。有些可從 Maven 存放區取得,有些必須手動建構。瀏覽程式庫目錄,並查看個別 README 檔案,瞭解詳細資訊。

如要進一步瞭解可用的程式庫模組,請參閱 Google Maven AndroidX Media 頁面

開啟 Java 8 支援功能

如果尚未啟用,您需要在 android 區段新增以下內容,為所有依附 ExoPlayer 的 build.gradle 檔案啟用 Java 8 支援功能:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

啟用 multidex

如果 Gradle minSdkVersion 為 20 以下,則應啟用 Multidex 以避免建構錯誤。

建立播放器

您可以使用 ExoPlayer.Builder 建立 ExoPlayer 執行個體,提供各種自訂選項。以下程式碼是建立執行個體最簡單的範例。

Kotlin

val player = ExoPlayer.Builder(context).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();

執行緒注意事項

ExoPlayer 執行個體必須從單一應用程式執行緒存取。在大多數情況下,這應該是應用程式的主執行緒。使用 ExoPlayer 的 UI 元件或 IMA 擴充功能時,必須使用應用程式的主要執行緒。

可以在建立播放器時傳遞 Looper,明確指定必須存取 ExoPlayer 執行個體的執行緒。如未指定 Looper,系統會使用建立玩家所在執行緒的 Looper;如果該執行緒沒有 Looper,系統會使用應用程式主執行緒的 Looper。在所有情況下,玩家必須存取該執行緒的 Looper,才能使用 Player.getApplicationLooper 進行查詢。

如要進一步瞭解 ExoPlayer 的執行緒模型,請參閱 ExoPlayer Javadoc 的「執行緒模型」一節

將播放器附加至檢視畫面

ExoPlayer 程式庫提供各種預先建構的 UI 元件,適合播放媒體。其中包括 PlayerView,用於封裝 PlayerControlViewSubtitleView,以及算繪影片的 Surface。您可以在應用程式的版面配置 XML 中加入 PlayerView。舉例來說,如要將播放器繫結至檢視畫面:

Kotlin

// Bind the player to the view.
playerView.player = player

Java

// Bind the player to the view.
playerView.setPlayer(player);

您也可以使用 PlayerControlView 做為獨立元件,這對於純音訊用途而言相當實用。

您可以選擇是否要使用 ExoPlayer 的預先建構 UI 元件。對於實作專屬 UI 的影片應用程式,您可以分別使用 ExoPlayer 的 setVideoSurfaceViewsetVideoTextureViewsetVideoSurfaceHoldersetVideoSurface 方法設定目標 SurfaceViewTextureViewSurfaceHolderSurface。ExoPlayer 的 addTextOutput 方法可用來接收應在播放期間轉譯的字幕。

填入播放清單並準備播放器

在 ExoPlayer 中,每個媒體都以 MediaItem 表示。如要播放媒體,您必須建構對應的 MediaItem、將其新增至播放器、準備播放器,並呼叫 play 以開始播放:

Kotlin

// Build the media item.
val mediaItem = MediaItem.fromUri(videoUri)
// Set the media item to be played.
player.setMediaItem(mediaItem)
// Prepare the player.
player.prepare()
// Start the playback.
player.play()

Java

// Build the media item.
MediaItem mediaItem = MediaItem.fromUri(videoUri);
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.prepare();
// Start the playback.
player.play();

ExoPlayer 直接支援播放清單,因此可以讓具有多個媒體項目的玩家能夠連續播放:

Kotlin

// Build the media items.
val firstItem = MediaItem.fromUri(firstVideoUri)
val secondItem = MediaItem.fromUri(secondVideoUri)
// Add the media items to be played.
player.addMediaItem(firstItem)
player.addMediaItem(secondItem)
// Prepare the player.
player.prepare()
// Start the playback.
player.play()

Java

// Build the media items.
MediaItem firstItem = MediaItem.fromUri(firstVideoUri);
MediaItem secondItem = MediaItem.fromUri(secondVideoUri);
// Add the media items to be played.
player.addMediaItem(firstItem);
player.addMediaItem(secondItem);
// Prepare the player.
player.prepare();
// Start the playback.
player.play();

播放清單可在播放期間更新,無須再次準備播放器。請參閱「播放清單」頁面,進一步瞭解如何填入和操控播放清單。如要進一步瞭解建立媒體項目時可用的不同選項,例如裁剪及附加字幕檔案,請參閱媒體項目頁面

控製播放器

播放器準備就緒後,即可透過播放器呼叫方法控製播放功能。以下列舉幾個最常用的方法:

  • playpause 可開始及暫停播放。
  • seekTo 可讓使用者在媒體中進行搜尋。
  • hasPrevioushasNextpreviousnext 可讓使用者瀏覽播放清單。
  • setRepeatMode 可控制是否要循環播放媒體,以及循環播放的方式。
  • setShuffleModeEnabled 可控製播放清單隨機播放功能。
  • setPlaybackParameters 會調整播放速度和音調。

如果玩家已繫結至 PlayerViewPlayerControlView,則使用者與這些元件的互動會導致系統叫用播放器上的對應方法。

放開播放器

不再需要播放器時,請務必釋放播放器,以便釋放有限的資源 (例如影片解碼器) 供其他應用程式使用。呼叫 ExoPlayer.release 即可達成。