入门

对于简单的用例,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.7.1")
implementation("androidx.media3:media3-exoplayer-dash:1.7.1")
implementation("androidx.media3:media3-ui:1.7.1")
implementation("androidx.media3:media3-ui-compose:1.7.1")

Groovy

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

其中 1.7.1 是您的首选版本(最新版本可在版本说明中找到)。所有模块的版本必须相同。

AndroidX Media3 包含依赖于外部库以提供额外功能的库模块。其中一些可从 Maven 仓库获取,而另一些则必须手动构建。请浏览库目录并查看各个 README 文件以获取详细信息。

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

启用 Java 8 支持

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

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

创建播放器

您可以使用 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);

ExoPlayer 的预构建 UI 组件是可选的。对于实现自己的 UI 的视频应用,可以使用 ExoPlayer 的 setVideoSurfaceViewsetVideoTextureViewsetVideoSurfaceHoldersetVideoSurface 方法分别设置目标 SurfaceViewTextureViewSurfaceHolderSurface。可以使用 Listener.onCues 回调来接收应在播放期间渲染的字幕,并且可以使用 setImageOutput 来接收已解码的图像。

为了获得更舒适的用户体验,请考虑添加 keepScreenOn 属性或在 ExoPlayer 上设置唤醒锁。您可以在后台工作页面中查看其他使设备保持唤醒状态的操作。

android:keepScreenOn="true"

如需详细了解如何使用 Media3 UI 组件及其自定义设置,请访问界面页面

填充播放列表并准备播放器

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