探索 ExoPlayer 音视频播放技术(1):入门指南

这个系列文章我们来介绍一位海外工程师如何探索 ExoPlayer 音视频播放技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 1 篇:ExoPlayer 入门指南。

—— 公众号关键帧Keyframe的分享

1、入门

使用集合保持条理井然根据您的喜好保存和分类内容。对于简单的使用场景,使用 ExoPlayer 入门包括实现以下步骤:

  1. 将 ExoPlayer 添加到您的项目中作为依赖项。
  2. 创建一个 ExoPlayer 实例。
  3. 将播放器附加到一个视图(用于视频输出和用户输入)。
  4. 使用 MediaItem 准备播放器进行播放。
  5. 播放完成后释放播放器。

下面更详细地描述了这些步骤。有关完整示例,请参阅主演示应用中的 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 和一个用于渲染视频的 SurfacePlayerView 可以包含在应用的布局 XML 中。例如,要将播放器绑定到视图:

3.1、Kotlin

// 将播放器绑定到视图。
playerView.player = player

3.2、Java

// 将播放器绑定到视图。
playerView.setPlayer(player);

您也可以将 PlayerControlView 作为独立组件使用,这对于仅音频的场景非常有用。

使用 ExoPlayer 的预构建 UI 组件是可选的。对于实现自定义 UI 的视频应用,可以分别使用 ExoPlayer 的 setVideoSurfaceViewsetVideoTextureViewsetVideoSurfaceHolder 和 setVideoSurface 方法设置目标 SurfaceViewTextureViewSurfaceHolder 或 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 允许在媒体中进行寻址。
  • hasPrevioushasNextprevious 和 next 允许在播放列表中导航。
  • setRepeatMode 控制媒体是否以及如何循环播放。
  • setShuffleModeEnabled 控制播放列表的洗牌模式。
  • setPlaybackParameters 调整播放速度和音频音高。

如果播放器绑定到 PlayerView 或 PlayerControlView,则用户与这些组件的交互将导致播放器上相应方法被调用。

6、释放播放器

当不再需要播放器时,释放它很重要,这样可以释放有限的资源(如视频解码器)供其他应用程序使用。这可以通过调用 来完成 ExoPlayer.release

音视频方向学习、求职,欢迎加入我们的星球

丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

探索 ExoPlayer 音视频播放技术(1):入门指南

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论