这个系列文章我们来介绍一位海外工程师如何探索 ExoPlayer 音视频播放技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 1 篇:ExoPlayer 入门指南。
—— 公众号关键帧Keyframe的分享
1、入门
使用集合保持条理井然根据您的喜好保存和分类内容。对于简单的使用场景,使用 ExoPlayer
入门包括实现以下步骤:
- 将 ExoPlayer 添加到您的项目中作为依赖项。
- 创建一个
ExoPlayer
实例。 - 将播放器附加到一个视图(用于视频输出和用户输入)。
- 使用
MediaItem
准备播放器进行播放。 - 播放完成后释放播放器。
下面更详细地描述了这些步骤。有关完整示例,请参阅主演示应用中的 PlayerActivity
。
2、将 ExoPlayer 添加为依赖项
2.1、添加 ExoPlayer 模块
使用 AndroidX Media3 入门的最简单方法是在应用模块的 build.gradle
文件中添加对所需库的 Gradle 依赖项。
例如,要依赖支持 DASH 播放的 ExoPlayer 和 UI 组件,可以添加对以下模块的依赖项:
2.2、Kotlin
implementation("androidx.media3:media3-exoplayer:1.5.1")
implementation("androidx.media3:media3-exoplayer-dash:1.5.1")
implementation("androidx.media3:media3-ui:1.5.1")
2.3、Groovy
implementation "androidx.media3:media3-exoplayer:1.5.1"
implementation "androidx.media3:media3-exoplayer-dash:1.5.1"
implementation "androidx.media3:media3-ui:1.5.1"
其中 1.5.1 是您首选的版本(最新版本可以通过查看发行说明来找到)。所有模块必须是同一版本。
AndroidX Media3 有依赖于外部库以提供额外功能的库模块。有些可以从 Maven 存储库中获取,而有些则必须手动构建。浏览库目录并查看各个 README 文件以了解详细信息。
有关可用库模块的更多信息,请访问 Google Maven AndroidX Media 页面。
2.4、启用 Java 8 支持
如果尚未启用,您需要在所有依赖于 ExoPlayer 的 build.gradle
文件中启用 Java 8 支持,通过在 android
部分添加以下内容:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
2.5、创建播放器
您可以使用 ExoPlayer.Builder
创建一个 ExoPlayer
实例,它提供了一系列自定义选项。以下代码是最简单的创建实例的示例。
2.6、Kotlin
val player = ExoPlayer.Builder(context).build()
2.7、Java
ExoPlayer player = new ExoPlayer.Builder(context).build();
2.8、关于线程的说明
ExoPlayer 实例必须从单个应用程序线程访问。在大多数情况下,这应该是应用程序的主线程。在使用 ExoPlayer 的 UI 组件或 IMA 扩展时,使用应用程序的主线程是必需的。
可以在线程上明确指定 ExoPlayer 实例必须访问的 Looper
,通过在创建播放器时传递一个 Looper
。如果没有指定 Looper
,则使用创建播放器的线程的 Looper
,或者如果该线程没有 Looper
,则使用应用程序主线程的 Looper
。在所有情况下,可以通过 Player.getApplicationLooper
查询播放器必须访问的线程的 Looper
。
有关 ExoPlayer 线程模型的更多信息,请参阅 ExoPlayer Javadoc 中的”线程模型”部分。
3、将播放器附加到视图
ExoPlayer 库提供了多种预构建的 UI 组件用于媒体播放。这些组件包括 PlayerView
,它封装了一个 PlayerControlView
、一个 SubtitleView
和一个用于渲染视频的 Surface
。PlayerView
可以包含在应用的布局 XML 中。例如,要将播放器绑定到视图:
3.1、Kotlin
// 将播放器绑定到视图。
playerView.player = player
3.2、Java
// 将播放器绑定到视图。
playerView.setPlayer(player);
您也可以将 PlayerControlView
作为独立组件使用,这对于仅音频的场景非常有用。
使用 ExoPlayer 的预构建 UI 组件是可选的。对于实现自定义 UI 的视频应用,可以分别使用 ExoPlayer 的 setVideoSurfaceView
、setVideoTextureView
、setVideoSurfaceHolder
和 setVideoSurface
方法设置目标 SurfaceView
、TextureView
、SurfaceHolder
或 Surface
。ExoPlayer 的 addTextOutput
方法可用于接收在播放期间应渲染的字幕。
4、填充播放列表并准备播放器
在 ExoPlayer 中,每个媒体文件由一个 MediaItem
表示。要播放媒体文件,需要构建相应的 MediaItem
,将其添加到播放器,准备播放器,然后调用 play
开始播放:
4.1、Kotlin
// 构建媒体项。
val mediaItem = MediaItem.fromUri(videoUri)
// 设置要播放的媒体项。
player.setMediaItem(mediaItem)
// 准备播放器。
player.prepare()
// 开始播放。
player.play()
4.2、Java
// 构建媒体项。
MediaItem mediaItem = MediaItem.fromUri(videoUri);
// 设置要播放的媒体项。
player.setMediaItem(mediaItem);
// 准备播放器。
player.prepare();
// 开始播放。
player.play();
ExoPlayer 直接支持播放列表,因此可以准备播放器以播放多个媒体项,这些媒体项将依次播放:
4.3、Kotlin
// 构建媒体项。
val firstItem = MediaItem.fromUri(firstVideoUri)
val secondItem = MediaItem.fromUri(secondVideoUri)
// 添加要播放的媒体项。
player.addMediaItem(firstItem)
player.addMediaItem(secondItem)
// 准备播放器。
player.prepare()
// 开始播放。
player.play()
4.4、Java
// 构建媒体项。
MediaItem firstItem = MediaItem.fromUri(firstVideoUri);
MediaItem secondItem = MediaItem.fromUri(secondVideoUri);
// 添加要播放的媒体项。
player.addMediaItem(firstItem);
player.addMediaItem(secondItem);
// 准备播放器。
player.prepare();
// 开始播放。
player.play();
可以在播放过程中更新播放列表,而无需再次准备播放器。有关填充和操作播放列表的更多信息,请参阅播放列表页面。有关构建媒体项时可用的不同选项的更多信息,例如剪辑和附加字幕文件,请参阅媒体项页面。
5、控制播放器
一旦播放器准备就绪,就可以通过调用播放器上的方法来控制播放。以下是一些最常用的方法:
play
和pause
分别开始和暂停播放。seekTo
允许在媒体中进行寻址。hasPrevious
、hasNext
、previous
和next
允许在播放列表中导航。setRepeatMode
控制媒体是否以及如何循环播放。setShuffleModeEnabled
控制播放列表的洗牌模式。setPlaybackParameters
调整播放速度和音频音高。
如果播放器绑定到 PlayerView
或 PlayerControlView
,则用户与这些组件的交互将导致播放器上相应方法被调用。
6、释放播放器
当不再需要播放器时,释放它很重要,这样可以释放有限的资源(如视频解码器)供其他应用程序使用。这可以通过调用 来完成 ExoPlayer.release
。
音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。