原创 Android 2025-02-24 17:31 北京
阅读了解 Transformer 优化、Media3 Muxer、简化 DefaultPreloadManager 和 ExoPlayer 的设置以及新 IAMF 解码器和 Kotlin 监听器扩展程序等详细更新。
Media3 1.5.0 已推出
https://github.com/androidx/media/releases/tag/1.5.0
Transformer 优化
动态照片支持
Transformer 现在支持导出动态照片。如果设置了相应的 MediaItem 图像持续时间,则会导出动态照片的图像 (请参阅 MediaItem.Builder().setImageDurationMs()),否则,将导出动态照片的视频。请注意,无论哪种情况下,都不应设置 EditedMediaItem 的持续时间,因为系统会自动调整为相应的 MediaItem 的图像持续时间。
更快的图像编码
AudioEncoderSettings
编辑列表支持
Transformer 现在会将第一个视频帧转换为从 0 开始。这修复了在某些包含编辑列表的文件中出现的音视频同步问题。
不支持的轨道类型日志记录
此版本包括改进了不支持的轨道类型的日志记录,可为问题排查和调试提供更详细的信息。
Media3 Muxer
在之前的某个版本中,我们添加了一个新的 Muxer 库,可用于创建 MP4 容器文件。Media3 Muxer 支持多种音频和视频编解码器,可顺畅处理各种媒体格式。此外,这个新库还具备一些高级功能,包括:
implementation ("androidx.media3:media3-muxer:1.5.0")
Media3 Muxer 与 Transformer
如要将 Media3 Muxer 与 Transformer 一起使用,请在创建 Transformer 时将 InAppMuxer.Factory (其内部封装了 Media3 Muxer) 设置为 Muxer factory:
val transformer = Transformer.Builder(context)
.setMuxerFactory(InAppMuxer.Factory.Builder().build())
.build()
简化 DefaultPreloadManager 和 ExoPlayer 的设置
val preloadManagerBuilder = DefaultPreloadManager.Builder()
val preloadManager = preloadManagerBuilder.build()
val player = preloadManagerBuilder.buildExoPlayer()
val preloadManagerBuilder = DefaultPreloadManager.Builder().setRenderersFactory(customRenderersFactory)
// The resulting preloadManager uses customRenderersFactory
val preloadManager = preloadManagerBuilder.build()
// The resulting player uses customRenderersFactory
val player = preloadManagerBuilder.buildExoPlayer()
val preloadManagerBuilder = DefaultPreloadManager.Builder()
val preloadManager = preloadManagerBuilder.build()
// Tune the playback-only configurations
val playerBuilder = ExoPlayer.Builder().setFooEnabled()
// The resulting player will have playback feature "Foo" enabled
val player = preloadManagerBuilder.buildExoPlayer(playerBuilder)
预加载下个播放列表项目
player.preloadConfiguration =
PreloadConfiguration(/* targetPreloadDurationUs= */ 5_000_000L)
player.preloadConfiguration = PreloadConfiguration.DEFAULT
新 IAMF 解码器和
Kotlin 监听器扩展程序
implementation ("androidx.media3:media3-decoder-iamf:1.5.0")
implementation ("androidx.media3:media3-common-ktx:1.5.0")
通过委托轻松定制播放器
class PlayerWithoutSeekToNext(player: Player) : ForwardingSimpleBasePlayer(player) {
override fun getState(): State {
val state = super.getState()
return state
.buildUpon()
.setAvailableCommands(
state.availableCommands.buildUpon().remove(COMMAND_SEEK_TO_NEXT).build()
)
.build()
}
// We don't need to override handleSeek, because it is guaranteed not to be called for
// COMMAND_SEEK_TO_NEXT since we've marked that command unavailable.
}
MediaSession:
媒体项目的命令按钮
媒体项目的命令按钮允许会话应用声明某些媒体项目支持的命令,这些命令可以通过 MediaController 或 MediaBrowser 方便地显示和执行:
这篇文章是我们 "相机与媒体 Spotlight Week" 系列的内容之一。在此系列中,我们会提供包括文章、视频、示例代码等资源,以帮助您提升应用中的媒体体验。