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