Media3 1.11 已发布。此版本为绝大多数热门 Android 媒体应用提供支持,并在播放、编辑和界面组件方面带来了新功能、bug 修复和改进。我们正在扩展 Jetpack Compose 界面模块,使其具有可自定义的 Player slot 和易于使用的默认值、互动式手势、状态观察器,并使用 PlayerPool 预加载短视频。我们还对 Media3 Cast 集成进行了现代化改造,使其支持 SystemUI 输出切换器,引入了新的 Ktor HTTP 客户端网络扩展,并为 Ogg 和 WAV 文件添加了新的多路复用实用程序。
请继续阅读以了解主要亮点,并查看完整的版本说明,获取全面的变更列表。
播放界面和 Compose
随着 Android 优先采用 Compose,我们将继续扩展 media3-ui-compose 和 media3-ui-compose-material3 模块。此次更新引入了更精细的播放器布局控制、更丰富的互动模式,并与 Material3 进行了更深入的集成。
可自定义的播放器布局
Material 3 播放器可组合项现在支持 topControls、centerControls、bottomControls 和 errorOverlay 的专用内容槽位。您可以添加自己的可组合项,也可以使用 PlayerDefaults 中发布的现成默认可组合项:
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
Player 可组合项还集成了 FocusRequester 支持,可在 Android TV、可折叠设备和桌面环境中实现无缝的方向键和键盘导航。
手势和播放速度控制
PlaybackSpeedState 现在提供快进/慢动作 API。demo-compose app 通过长按手势快进播放和双击手势进行搜索来展示这一点。与 1.10 中引入的 ProgressSlider 相结合,Compose 播放器界面现在可提供丰富的触控和手势互动功能。
使用 PlayerPool 预加载短视频
对于具有滑动窗口媒体 Feed(例如竖屏短视频)的应用,如何高效管理多个 ExoPlayer 实例是一项常见挑战。Media3 1.11 引入了 PlayerPool(位于 common-ktx 中)和 rememberPooledPlayer(位于 ui-compose 中),用于自动处理播放器回收和预加载。
demo-compose 中的新 ShortFormPlayerScreen 展示了这种效果,这是一个垂直分页的 Feed,其中播放器在用户滚动时会进行池化、预加载和无缝回收。
MiniController
media3-ui-compose-material3 中的新 MiniController 可组合项提供了一个紧凑的播放栏,其中显示了当前内容的标题、音乐人、封面和进度,以及播放/暂停控件。与 media3-ui-compose-material3 中的所有默认可组合项一样,MiniController 支持 Material3 动态配色集成,可自动适应用户的壁纸主题。这非常适合持久性底部工作表或迷你播放器,例如在用户浏览内容或在活跃的 Cast 会话期间。
扩展了元数据和错误的状态持有者
我们向 media3-ui-compose 添加了多个新的响应式状态持有者:
rememberCurrentMediaItemState- 观察有关当前播放项的元数据rememberPlaylistState- 观察完整播放列表和有效索引rememberErrorState- 跟踪播放错误,在 Material3 中具有匹配的ErrorText可组合项和默认的ErrorOverlay
我们将在即将发布的版本中继续添加新内容和更多自定义选项。请分享您对项目问题跟踪器的看法。
现代化的 Cast 集成
Media3 1.11 更新了 Cast 扩展程序,添加了程序化配置选项并支持操作系统级路由。
CastParams 和 SystemUI 输出切换器
您现在可以使用 CastParams 配置 Cast 扩展服务:
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
设置 setShowSystemOutputSwitcherOnCastIconClick(true) 会配置 MediaRouteButton 以在受支持的平台版本上打开 Android 的原生 SystemUI 输出切换器,从而提供统一的输出选择器体验。
Compose 中的响应式 MediaRouteButton 状态
使用 Jetpack Compose 的应用现在可以轻松添加媒体路由按钮(也称为“投放”按钮),该按钮会自动观察对话框状态并相应地进行更新。与 Media3 的 CastPlayer 一起使用时,无需进一步的逻辑!
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
核心播放和会话增强功能
Eclipsa Video - HAGC 动态 HDR 元数据(API 37 及更高版本)
Eclipsa Video 承诺在各种设备上提供更一致的 HDR 体验,具有一致的基准 HDR 白色、根据屏幕和周围环境自适应的动态余量,确保在所有设备上保留创意意图。
ExoPlayer 现在支持播放渐进式媒体(MP4、Matroska)所需的 HAGC (ST 2094-50) 定时元数据。播放器会自动将 HAGC 元数据轨道与关联的视频轨道合并,并将元数据带外传递给 API 37 及更高版本设备上的解码器。在旧版设备上,ExoPlayer 会无缝回退到提供标准的 HDR 播放体验,而无需进行调整。
新的 Ktor HTTP 客户端扩展程序
新的 media3-datasource-ktor 扩展模块提供由 Ktor HTTP 堆栈支持的 KtorDataSource。这为现有的 Cronet 和 OkHttp 数据源模块提供了一个以 Kotlin 为先、对协程友好的替代方案。
异步 MediaSession 连接
MediaSession.Callback 现在包含 onConnectAsync(),可让您异步处理控制器连接尝试,例如在接受连接之前验证授权。您可以立即返回 Future,并使用 Futures.immediateFuture(ConnectionResult) 来实现与现有 onConnect 相同的行为。
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
更安全的 MediaSession 默认设置
对于未在 MediaSession.Callback 中替换 onConnect 或 onConnectAsync 的应用,该库现在默认采用更安全的配置。具体而言,会话数据不再默认与不受信任的控制器共享,这意味着缺乏通知访问权限的第三方应用或非系统应用无法访问会话数据,除非您明确实现这些回调方法来授权连接。
新的 Muxer 实现和容器解析
OggMuxer 和 WavMuxer
我们添加了两个新的专用混合器:OggMuxer 用于将 OPUS 和 VORBIS 流混合到标准 .ogg 文件中,以及 WavMuxer 用于生成未压缩的浮点 PCM .wav 音频文件。
容器解析和轨道引用
- MP4 轨道参考 (
tref):Mp4Muxer.addTrackReference允许将相关元数据或辅助轨道链接到主视频流。 - 章节提取:现在,系统会从 MP4 文件(
.m4a、.m4b)中提取 QuickTime 和 Nero 章节,以及 Matroska 章节,作为有声读物和播客导航的Chapter元数据条目。
如果您要报告任何 bug,或者有任何问题或功能请求,请使用问题跟踪器。我们期待您的加入!
-
方法指南欢迎回到“打造智能 Android 应用”系列博文,我们将在此系列博文中介绍如何将基本的 Android 应用转变为个性化、智能化和智能体化的体验。在之前的博文中,我们介绍了 Jetpacker,这是我们将在本系列文章中使用的演示版应用。
Caren Chang • 阅读用时:6 分钟 -
方法指南Jetpacker 是一款技术展示应用,由我们的团队从头开始构建,用于今年的 Google I/O 大会(使用 Antigravity 构建)。Jetpacker 的核心功能是帮助用户规划、探索和享受下一次精彩的冒险之旅。
Jolanda Verhoef • 阅读用时:4 分钟 -
方法指南欢迎回到“打造智能 Android 应用”系列博文,我们将在此系列博文中介绍如何将基本的 Android 应用转变为个性化、智能化和智能体化的体验。在之前的博文中,我们探讨了如何利用 Firebase AI Logic 构建云托管型和混合型 AI 功能。
每周通过电子邮件接收最新的 Android 开发洞见。