对于简单的用例,使用 ExoPlayer
入门包括实现以下步骤
- 将 ExoPlayer 作为依赖项添加到您的项目中。
- 创建一个
ExoPlayer
实例。 - 将播放器附加到视图(用于视频输出和用户输入)。
- 使用
MediaItem
准备播放器以进行播放。 - 完成后释放播放器。
下面将更详细地介绍这些步骤。有关完整示例,请参阅 主演示应用程序 中的 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
,它封装了 PlayerControlView
、SubtitleView
和一个 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 的 setVideoSurfaceView
、setVideoTextureView
、setVideoSurfaceHolder
和 setVideoSurface
方法分别设置目标 SurfaceView
、TextureView
、SurfaceHolder
或 Surface
。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();
可以在播放期间更新播放列表,而无需再次准备播放器。在 播放列表页面 上阅读有关填充和操作播放列表的更多信息。在 媒体项页面 上阅读有关构建媒体项时可用的不同选项(例如剪辑和附加字幕文件)的更多信息。
控制播放器
播放器准备就绪后,可以通过调用播放器上的方法来控制播放。以下是一些最常用的方法
play
和pause
分别开始和暂停播放。seekTo
允许在媒体中搜索。hasPrevious
、hasNext
、previous
和next
允许在播放列表中导航。setRepeatMode
控制是否以及如何循环媒体。setShuffleModeEnabled
控制播放列表随机播放。setPlaybackParameters
调整播放速度和音频音调。
如果播放器绑定到 PlayerView
或 PlayerControlView
,则用户与这些组件的交互将导致调用播放器上的相应方法。
释放播放器
当不再需要播放器时释放它非常重要,以便释放视频解码器等有限资源供其他应用程序使用。这可以通过调用 ExoPlayer.release
来完成。