入门

对于简单的用例,使用 ExoPlayer 入门包括实现以下步骤

  1. 将 ExoPlayer 作为依赖项添加到您的项目中。
  2. 创建一个 ExoPlayer 实例。
  3. 将播放器附加到视图(用于视频输出和用户输入)。
  4. 使用 MediaItem 准备播放器以进行播放。
  5. 完成后释放播放器。

下面将更详细地介绍这些步骤。有关完整示例,请参阅 主演示应用程序 中的 PlayerActivity

将 ExoPlayer 作为依赖项添加

添加 ExoPlayer 模块

使用 AndroidX Media3 入门最简单的方法是在应用程序模块的 build.gradle 文件中添加所需库的 Gradle 依赖项。

例如,要依赖支持 DASH 播放和 UI 组件的 ExoPlayer,您可以像这样添加模块的依赖项

Kotlin

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

Groovy

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

其中 1.4.1 是您首选的版本(可以通过查阅 发行说明 找到最新版本)。所有模块必须具有相同的版本。

AndroidX Media3 具有依赖于外部库以提供附加功能的库模块。一些可从 Maven 存储库获取,而其他一些必须手动构建。浏览 库目录 并查看各个自述文件以获取详细信息。

有关可用库模块的更多信息,请参阅 Google Maven AndroidX Media 页面

启用 Java 8 支持

如果尚未启用,则需要在所有依赖于 ExoPlayer 的 build.gradle 文件中启用 Java 8 支持,方法是在 android 部分添加以下内容

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。在所有情况下,都可以使用 Player.getApplicationLooper 查询必须从其访问播放器的线程的 Looper

有关 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 来完成。