苦等多年!Compose 终于迎来原生 Media3 播放器

本文首发于公众号"Android技术圈HPro"

前两天,Google 正式发布了 Media3 1.10

对开发者来说最炸的莫不过Compose终于有自己的播放器了!

Compose 播放器来了

过去一提 Compose 播放器,很多团队的真实状态其实都差不多。

要么继续用 PlayerView,外面包一层 AndroidView();要么自己把内容层、控制层、进度条、手势和倍速按钮一块一块拼出来。

问题不是做不到,而是很费。

尤其是当你既想保留 Compose 的声明式写法,又想让界面更接近 Material 3 风格时,工作量很容易失控。

这次 Media3 1.10media3-ui-compose-material3 上继续扩模块,并新增了一个可直接上手的 Player Composable

官方给它的定位很明确:把内容显示和可定制的播放控制组合起来,先给你一套开箱可用的现代播放器骨架。

同时,这版还补了几个很关键的小部件:

  • ProgressSlider,支持拖拽和点击 seek

  • PlaybackSpeedControl,做倍速管理

  • PlaybackSpeedToggleButton,提供 Material 3 风格的倍速切换按钮

这件事真正有价值的地方,不是"少写几个控件"。

而是团队终于可以先拿到一套官方 Compose 播放器底座,再决定哪些地方自己定制,而不是从零开始手搓一整套媒体交互层。

如果你只是想先把依赖拉起来,最小升级可以先这样配:

bash 复制代码
implementation("androidx.media3:media3-exoplayer:1.10.0")
implementation("androidx.media3:media3-ui-compose:1.10.0")
implementation("androidx.media3:media3-ui-compose-material3:1.10.0")

如果你们现在还停留在 PlayerView + Compose 包壳 的过渡方案,这版已经值得单独拉一个分支试一轮。

你们更想要官方接下来先补字幕、轨道选择,还是更细粒度的播放器插槽?我觉得这会直接决定 Media3 Compose 这条线成熟得有多快。

性能提升

很多版本发布喜欢讲新能力,但业务里真正要命的,往往不是"有没有新 API",而是"这个资源到底播不播得出来""出错了能不能兜住""高负载时还能不能稳一点"。

Media3 1.10 在播放层补的,很多就是这种更贴近实战的问题。

先看格式支持。

这次 ExoPlayer 新增了对 MP4 容器中 Dolby Vision Profile 10VVC track 提取的支持,decoder_mpegh 扩展加入了 MPEG-H UI managerIAMF 扩展也更顺滑地支持双耳输出,并且能借助 Android Spatializer 更好匹配扬声器布局。

这几项放在一起看,信号很清楚:

ExoPlayer 不是只在补"能不能播",而是在继续往更复杂、更高规格的媒体场景靠。

除此之外,这版还做了几件非常工程化的改进:

  • • 广告播放链路继续提升可靠性

  • • HLS interstitial 更好支持 X-PLAYOUT-LIMITX-SNAP

  • • HLS 遇到加载错误时,如果有不同 location 的冗余流,可以做 location fallback

  • MediaSessionService 现在继承 LifecycleService,服务生命周期管理会自然很多

还有一个我很在意的小实验能力:官方开始支持用更高效的方式调度核心播放循环。

如果你们有多实例播放、长列表视频预览、后台音频或直播场景,这个方向值得马上盯住。

试验开关也很直接:

bash 复制代码
val player = ExoPlayer.Builder(context)
    .experimentalSetDynamicSchedulingEnabled(true)
    .build()

它现在还是实验能力,但方向已经很明确了。

Media3 今年一个重点,不只是让播放器"能跑起来",而是让播放器"跑得更有效率"。

如果你们团队最近正好在排查掉帧、发热、功耗或者复杂 HLS 兼容问题,这段更新比表面上看更值钱。

倍速导出这件事,终于更稳了

做媒体编辑的人都知道,倍速从来不只是把数值改成 1.25x1.5x 那么简单。

一旦进入导出链路,帧率、输出体积、处理性能很快就会互相牵制。

很多时候你以为自己只是做了一个"调速度"的功能,最后踩到的却是导出体积异常、处理时间拉长,或者成片表现不稳定。

这次 Transformer 的改动不花哨,但非常实用。

EditedMediaItem.Builder.setFrameRate() 现在可以用来设置视频的最大输出帧率,在和 setSpeed() 配合时尤其有价值。

一个很实用的写法大概就是这样:

bash 复制代码
val editedItem = EditedMediaItem.Builder(mediaItem)
    .setSpeed(1.5f)
    .setFrameRate(30)
    .build()

如果你们在做短视频剪辑、模板导出、运动视频快放,或者任何"用户会频繁改速度"的编辑场景,这个点建议直接转给负责导出链路的同学。

因为它解决的不是 API 好不好看,而是倍速导出最容易出事的那个位置,终于有了更明确的控制杆。

写在最后

要不要升级?我的建议很简单:

  • • 正在做 Compose 播放器,建议尽快开分支验证

  • • 业务里有复杂格式、HLS、广告、空间音频,建议安排升级评估

  • • 正在做导出或剪辑链路,至少把 Transformer 的帧率控制测一轮

  • • 如果当前项目改动窗口很小,可以先观察,但没必要忽略这版

你们团队现在最痛的是播放器 UI、格式兼容,还是视频导出?

#Android #Media3 #ExoPlayer #Compose #音视频开发

相关推荐
imuliuliang12 分钟前
Laravel6.x核心特性全解析
android·php·laravel
idingzhi1 小时前
A股量化策略日报(2026年05月22日)
android·开发语言·python·kotlin
测试员周周2 小时前
【Appium 系列】第14节-断言与验证 — Validator 的设计
android·人工智能·python·功能测试·ios·单元测试·appium
赏金术士3 小时前
Android 动画对比指南:View 系统 vs Jetpack Compose
android·kotlin·compose
我命由我123453 小时前
C++ - 面向对象 - 析构函数
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
失眠的咕噜4 小时前
PDA 安卓设备上传多张图片
android·前端·javascript
zb200641204 小时前
Laravel6.x新特性全解析
android
plainGeekDev4 小时前
Kotlin核心:空安全都搞不明白,还敢说熟练Kotlin?
android·面试·kotlin
huaCodeA5 小时前
Android面试-Flow相关
android·面试·职场和发展
繁星星繁5 小时前
Python基础语法(二)
android·服务器·python