入门

对于简单的用例,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来完成。