Media3
最新更新 | 稳定版 | 发布候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2025 年 5 月 15 日 | 1.7.1 | - | - | 1.8.0-alpha01 |
声明依赖项
要添加 Media3 的依赖项,您必须将 Google Maven 仓库添加到您的项目中。阅读Google 的 Maven 仓库以获取更多信息。
在您的应用或模块的 build.gradle
文件中添加您所需构件的依赖项
Groovy
dependencies { def media3_version = "1.6.1" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs using Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs using Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.6.1" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs using Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs using Views implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs using Jetpack Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
有关依赖项的更多信息,请参阅添加构建依赖项。
反馈
您的反馈有助于改进 Jetpack。您可以使用 Media3 问题跟踪器查找问题的答案、已知问题和功能请求,并提交新问题。
版本 1.8.0
版本 1.8.0-alpha01
2025 年 5 月 19 日
androidx.media3:media3-*:1.8.0-alpha01
已发布。版本 1.8.0-alpha01 包含这些提交。
- ExoPlayer
- 添加
ExoPlayer.setScrubbingModeEnabled(boolean)
方法。这优化了播放器以适应频繁的跳播(例如,用户拖动进度条)。跳播模式的行为可以通过ExoPlayer
和ExoPlayer.Builder
上的setScrubbingModeParameters(..)
进行自定义。 - 允许在跳播模式下自定义小数跳播容差。
- 在跳播模式下提高编解码器操作速率。
- 修复了
AdsMediaSource
内容中的准备错误可能从未报告的 bug (#2337)。 - 修复了
MergingMediaSource
中的内存泄漏问题,例如在旁加载字幕时使用 (#2338)。 - 允许
CmcdConfiguration.Factory
返回null
以禁用特定媒体项的 CMCD 日志记录 (#2386)。 - 将默认图像缓冲区大小从 128KB(文本轨道复制粘贴错误)增加到 26MB,这足以容纳 50MP 超高清 HDR 图像 (#2417)。
- 添加
PreCacheHelper
,允许应用预缓存具有指定起始位置和持续时间的单个媒体。
- 添加
- Transformer
- 现在,通过
addGap()
添加的初始间隙填充静音音频,需要在EditedMediaItemSequence.Builder
中显式设置experimentalSetForceAudioTrack(true)
。如果间隙在序列中间,则不需要此标志。 - 将
Muxer
接口从media3-transformer
移至media3-muxer
。 - 将
MediaItem.Builder().setImageDuration(long)
设置为强制项,以便将媒体项作为图像导入。 - 添加
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean)
,在修剪时包含 MP4 编辑列表,以指示播放器忽略修剪起始点之前的关键帧和修剪起始点之间的样本。 - 更新 Composition 演示应用以使用 Kotlin 和 Jetpack Compose,并添加自定义
VideoCompositorSettings
以将序列排列为 2x2 或画中画布局。
- 现在,通过
- 提取器
- MP3:当因
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)
而回退到恒定比特率寻址时,使用不可寻址的 Xing、VBRI 和类似可变比特率元数据中的持续时间和数据大小 (#2194)。
- MP3:当因
- 音频
- 允许 DefaultAudioMixer 中的恒定功率上混/下混。
- 将
ChannelMappingAudioProcessor
、TrimmingAudioProcessor
和ToFloatPcmAudioProcessor
公开 (#2339)。 - 在
AudioTrackPositionTracker
中使用AudioTrack#getUnderrunCount()
来检测DefaultAudioSink
中的欠载,而不是尽力估算。 - 改进音频时间戳平滑处理,以应对音频输出设备意外的位置漂移。
- 修复了连接到蓝牙设备时,从暂停恢复后的前 10 秒内音视频同步中断的 bug。
- 修复了
AnalyticsListener.onAudioPositionAdvancing
未报告音频开始前进的时间,而是报告第一次测量时间的 bug。
- 视频
- 添加实验性
ExoPlayer
API,在排队仅解码输入缓冲区时包含MediaCodec.BUFFER_FLAG_DECODE_ONLY
标志。此标志将指示解码器跳过仅解码缓冲区,从而加快寻址速度。通过DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag
启用此功能。 - 改进软件视频编解码器的编解码器性能检查。这可能导致一些额外的轨道被标记为
EXCEEDS_CAPABILITIES
。 - 修复了某些设备上 VP9 Widevine 播放错误 (#2408)。
- 添加实验性
- 文本
- 修复了 SSA 和 SubRip 在启用字幕时显示进行中提示的 bug (#2309)。
- 修复了从具有字幕错误的流切换到具有空字幕轨道的直播流时播放卡顿的 bug (#2328)。
- 修复了播放包含 B 帧的 H.262 流时 CEA-608 字幕乱码的 bug (#2372)。
- 在 Matroska 文件中添加对
CodecId = S_TEXT/SSA
的 SSA 字幕的支持。以前MatroskaExtractor
只支持CodecId = S_TEXT/ASS
,它旨在表示 SubStation Alpha 字幕的“高级”(v4+)变体(但 ExoPlayer 的解析逻辑对于两种变体都相同) (#2384)。 - 添加对 SubStation Alpha (SSA) 字幕文件中
layer
属性的支持,该属性用于定义同时显示多个提示时的 z 轴顺序 (#2124)。
- 效果
- 添加
Presentation.createForShortSide(int)
,它创建一个Presentation
,无论输入方向如何,都能确保最短边始终与给定值匹配。
- 添加
- 多路复用器
writeSampleData()
API 现在使用多路复用器特定的BufferInfo
类,而不是MediaCodec.BufferInfo
。- 添加
Muxer.Factory#supportsWritingNegativeTimestampsInEditList
,默认为 false。
- IMA 扩展
- 修复了在一个广告中加载错误可能意外使另一个广告组失效的 bug。
- 修复了 VOD 窗口结束后的广告组导致播放停滞的 bug。起始时间在窗口之后的广告组不再排队进入
MediaPeriodQueue
(#2215)。
- 会话
- 修复了将 null 传递给连接到旧版
MediaBrowserServiceCompat
的MediaBrowser
的getLibraryRoot
时会产生NullPointerException
的 bug。 - 修复了发送自定义操作、搜索结果或 getItem 请求时,旧版会话应用因
ClassNotFoundException
而崩溃的 bug。 - 修复了
MediaItem.LocalConfiguration.uri
被共享到平台会话的MediaMetadata
的 bug。要有意地共享 URI 以允许控制器重新请求媒体,请改为设置MediaItem.RequestMetadata.mediaUri
。
- 修复了将 null 传递给连接到旧版
- UI
- 修复了 Compose 中的一个 bug,该 bug 导致在设置初始按钮状态和观察状态变化(例如图标形状或启用状态)之间存在间隙。现在,在观察期之外对播放器所做的任何更改都会被拾取 (#2313)。
- 在
media3-ui-compose
模块中为SeekBackButtonState
和SeekForwardButtonState
添加状态持有者和可组合项。 - 为
PlayerControlView
添加对 ExoPlayer 跳播模式的支持。启用后,当用户开始拖动进度条时,此模式会将播放器置于跳播模式,每次移动都会发出player.seekTo
调用,然后在手指离开屏幕时退出跳播模式。此集成可以通过 XML 中的time_bar_scrubbing_enabled = true
或 Java/Kotlin 中的setTimeBarScrubbingEnabled(boolean)
方法启用。 - 使
PlayerSurface
接受可为空的Player
参数。
- 下载
- 添加对渐进流的部分下载支持。应用可以使用
DownloadHelper
准备渐进流,并从帮助器请求一个DownloadRequest
,指定下载应涵盖的基于时间的媒体起始和结束位置。返回的DownloadRequest
携带解析的字节范围,可以使用它创建ProgressiveDownloader
并相应地下载内容。 - 添加
DownloadHelper.Factory
,它替换了静态DownloadHelper.forMediaItem()
方法。 - 为
SegmentDownloader
实现添加Factory
。 - 添加对自适应流的部分下载支持。应用可以使用
DownloadHelper
准备自适应流,并从帮助器请求一个DownloadRequest
,指定下载应涵盖的基于时间的媒体起始和结束位置。返回的DownloadRequest
携带解析的时间范围,可以使用它创建具体的SegmentDownloader
并相应地下载内容。
- 添加对渐进流的部分下载支持。应用可以使用
- HLS 扩展
- 支持
HlsInterstitialsAdsLoader
的 X-ASSET-LIST 和直播流。
- 支持
- RTSP 扩展
- 添加对包含尾随空格字符的 SessionDescriptions 行的解析支持 (#2357)。
- Cast 扩展
- 添加对
getDeviceVolume()
、setDeviceVolume()
、getDeviceMuted()
和setDeviceMuted()
的支持 (#2089)。
- 添加对
- 测试实用程序
- 移除了
transformer.TestUtil.addAudioDecoders(String...)
、transformer.TestUtil.addAudioEncoders(String...)
和transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)
。请改用ShadowMediaCodecConfig
配置影子编码器和解码器。 - 将
ShadowMediaCodecConfig
报告的编解码器名称中的“exotest”前缀替换为“media3”。
- 移除了
- 删除已弃用符号
- 移除了已弃用的
SegmentDownloader
构造函数SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)
及其子类DashDownloader
、HlsDownloader
和SsDownloader
中的相应构造函数。 - 移除了已弃用的
Player.hasNext()
、Player.hasNextWindow()
。请改用Player.hasNextMediaItem()
。 - 移除了已弃用的
Player.next()
。请改用Player.seekToNextMediaItem()
。 - 移除了已弃用的
Player.seekToPreviousWindow()
。请改用Player.seekToPreviousMediaItem()
。 - 移除了已弃用的
Player.seekToNextWindow()
。请改用Player.seekToNextMediaItem()
。 - 移除了
exoplayer
模块中已弃用的BaseAudioProcessor
。请改用common
模块下的BaseAudioProcessor
。 - 移除已弃用的
MediaCodecVideoRenderer
构造函数MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)
。
- 移除了已弃用的
版本 1.7.0
版本 1.7.1
2025 年 5 月 16 日
此版本与 1.6.1 的代码相同,发布是为了确保它看起来比 1.7.0 更“新”,1.7.0 是一个不小心被标记为稳定版的 alpha 版本(见下文)。
版本 1.7.0
2025 年 5 月 16 日
此版本本应是 1.7.0-alpha01
,但意外地在 maven.google.com 上被标记为 1.7.0
(即稳定版)。请勿使用此版本。请继续使用 1.6.1 或升级到 1.7.1(其代码与 1.6.1 相同)。
版本 1.6.0
1.6.1
2025 年 4 月 14 日
androidx.media3:media3-*:1.6.1
已发布。版本 1.6.1 包含这些提交。
- 通用库
- 添加
PlaybackParameters.withPitch(float)
方法,以便轻松复制具有新pitch
值的PlaybackParameters
(#2257)。
- 添加
- ExoPlayer
- 修复了在初始化下一个媒体项期间,由于可恢复的渲染器错误导致媒体项转换失败的问题 (#2229)。
- 修复了
ProgressiveMediaPeriod
抛出IllegalStateException
的问题,因为PreloadMediaSource
在准备好之前尝试调用其getBufferedDurationUs()
(#2315)。 - 修复了在 DASH、HLS 和 SmoothStreaming 的清单请求中发送
CmcdData
的问题 (#2253)。 - 确保
AdPlaybackState.withAdDurationsUs(long[][])
可以在广告组被移除后使用。用户仍然需要为已移除的广告组传入一个时长数组,该数组可以为空或 null (#2267)。
- 提取器
- MP4:从
tkhd
box 解析alternate_group
并将其作为Mp4AlternateGroupData
条目公开在每个轨道的Format.metadata
中 (#2242)。
- MP4:从
- 音频
- 修复了播放短内容播放列表时位置可能卡住的卸载问题 (#1920)。
- 会话
- 将平台
MediaSession
回调的聚合超时从 500 毫秒降低到 100 毫秒,并添加一个实验性 setter 以允许应用配置此值。 - 修复了用户关闭通知后重新出现的问题 (#2302)。
- 修复了一个 bug,即当包装的播放器实际为空时,会话返回一个单项时间线。这发生在包装的播放器没有
COMMAND_GET_TIMELINE
可用,而COMMAND_GET_CURRENT_MEDIA_ITEM
可用且包装的播放器为空时 (#2320)。 - 修复了在与服务进行其他交互(例如
setForegroundServiceTimeoutMs
)之后,调用MediaSessionService.setMediaNotificationProvider
被静默忽略的 bug (#2305)。
- 将平台
- UI
- 启用
PlayerSurface
以与ExoPlayer.setVideoEffects
和CompositionPlayer
配合使用。 - 修复了
PlayerSurface
无法用新的Player
重新组合的 bug。
- 启用
- HLS 扩展
- 修复了 HLS 媒体的
CmcdData
中未设置块持续时间的问题,导致在处理加密媒体片段时断言失败 (#2312)。
- 修复了 HLS 媒体的
- RTSP 扩展
- 添加对带有 RTSPT 方案的 URI 的支持,作为配置 RTSP 会话以使用 TCP 的方式 (#1484)。
- Cast 扩展
- 添加对播放列表元数据的支持 (#2235)。
1.6.0
2025 年 3 月 26 日
androidx.media3:media3-*:1.6.0
已发布。版本 1.6.0 包含这些提交。
- 通用库
- 添加
AudioManagerCompat
和AudioFocusRequestCompat
以替换androidx.media
中的等效类。 - 将 Kotlin 从 1.9.20 升级到 2.0.20 并使用 Compose 编译器 Gradle 插件。将 KotlinX Coroutines 库从 1.8.1 升级到 1.9.0。
- 移除
Format.toBundle(boolean excludeMetadata)
方法,请改用Format.toBundle()
。 - 修复了
SimpleBasePlayer
中的 bug,即在setPlaylist
后将State
中的新currentMediaItemIndex
设置为null
MediaMetadata
时,不会重新评估元数据 (#1940)。 - 将
SimpleBasePlayer.State
的访问权限从 protected 更改为 public,以便于在其他类中处理更新 (#2128)。
- 添加
- ExoPlayer
- 添加
MediaExtractorCompat
,这是一个新类,提供与平台MediaExtractor
等效的功能。 - 添加实验性的 ExoPlayer 预热支持,用于使用
MediaCodecVideoRenderer
进行播放。您可以通过experimentalSetEnableMediaCodecVideoRendererPrewarming
配置DefaultRenderersFactory
,为ExoPlayer
提供辅助MediaCodecVideoRenderer
。如果启用,ExoPlayer
会在播放期间预处理连续媒体项的视频,以减少媒体项转换延迟。 - 将
DefaultLoadControl
中bufferForPlaybackMs
和bufferForPlaybackAfterRebufferMs
的默认值分别减少到 1000 毫秒和 2000 毫秒。 - 异步初始化
DeviceInfo
和设备音量(如果使用setDeviceVolumeControlEnabled
启用)。这些值在ExoPlayer.Builder.build()
之后不会立即可用,Player.Listener
会通过onDeviceInfoChanged
和onDeviceVolumeChanged
通知更改。 - 创建播放器后,初始音频会话 ID 不再立即可用。如果需要,您可以使用
AnalyticsListener.onAudioSessionIdChanged
监听初始更新。 - 在选择视频轨道时考虑语言。默认情况下,如果可用,选择与所选音频轨道的语言匹配的“主”视频轨道。可以通过
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
表达明确的视频语言偏好。 - 向
DefaultTrackSelector.selectVideoTrack()
方法添加selectedAudioLanguage
参数。 - 向
MediaSourceEventListener.onLoadStarted
和相应的MediaSourceEventListener.EventDispatcher
方法添加retryCount
参数。 - 修复了多周期 DASH 流中,播放列表项或周期持续时间与实际内容不匹配可能导致项目末尾画面冻结的 bug (#1698)。
- 将
BasePreloadManager.Listener
移至顶级PreloadManagerListener
。 - 可以实现
RenderersFactory.createSecondaryRenderer
以提供用于预热的辅助渲染器。预热可在播放期间实现更快的媒体项转换。 - 启用在自适应流媒体格式 DASH、HLS 和 SmoothStreaming 中为清单请求发送
CmcdData
(#1951)。 - 在
MediaCodecRenderer.onReadyToInitializeCodec
中提供将要初始化的编解码器的MediaCodecInfo
(#1963)。 - 更改
AdsMediaSource
以允许AdPlaybackStates
通过附加广告组而增长。检测到无效修改时会抛出异常。 - 修复了在插播广告后过渡到内容媒体时,可能快速连续显示额外仅解码帧的问题。
- 使
DefaultRenderersFactory
默认添加两个MetadataRenderer
实例,以便应用能够接收两种不同的元数据方案。 - 重新评估在播放暂停时是否应取消正在进行的块加载 (#1785)。
- 向
ClippingMediaSource
添加选项,允许在不可寻址媒体中进行剪辑。 - 修复了预热寻址可能阻塞后续媒体项转换的 bug。
- 修复了当
ExoPlayer.isLoading()
过渡到STATE_IDLE
或STATE_ENDED
后仍保持true
的 bug (#2133)。 - 向
LoadControl.Parameter
添加lastRebufferRealtimeMs
(#2113)。
- 添加
- Transformer
- 添加对转换为兼容旧版本的备用格式的支持。
- 添加对转码和转封装杜比视界 (profile 8) 格式的支持。
- 更新
VideoFrameProcessor.registerInputStream
和VideoFrameProcessor.Listener.onInputStreamRegistered
的参数以使用Format
。 - 使用
DefaultEncoderFactory
时生成 HDR 静态元数据。 - 启用对使用
MediaMetricsManager
的 Android 平台诊断的支持。Transformer 将编辑事件和性能数据转发到平台,这有助于提供设备上的系统性能和调试信息。如果设备用户启用了共享使用情况和诊断数据,Google 也可能收集此数据。应用可以使用Transformer.Builder.setUsePlatformDiagnostics(false)
选择退出向 Transformer 贡献平台诊断数据。 - 将
InAppMuxer
拆分为InAppMp4Muxer
和InAppFragmentedMp4Muxer
。您使用InAppMp4Muxer
生成非分段 MP4 文件,而InAppFragmentedMp4Muxer
用于生成分段 MP4 文件。 - 将
Muxer
接口从media3-muxer
移至media3-transformer
。 - 添加
MediaProjectionAssetLoader
,它从MediaProjection
提供媒体用于屏幕录制,并为 Transformer 演示应用添加屏幕录制支持。 - 向
Codec
接口添加#getInputFormat()
。 - 在
DefaultVideoFrameProcessor
和DefaultVideoCompositor
中,尽可能将释放GlObjectsProvider
的责任转移到调用者身上。
- 提取器
- AVI:修复了恒定比特率压缩音频文件处理中的问题,其中流头存储的是字节数而不是块数。
- 修复了长度以 1 或 2 字节(而不是 4 字节)表示的 NAL 单元处理问题。
- 修复了 MP4 编辑列表中
ArrayIndexOutOfBoundsException
的问题,当编辑列表从非同步帧开始且没有前置同步帧时 (#2062)。 - 修复了 TS 流在某些设备上可能卡住的问题 (#2069)。
- FLAC:添加对 32 位 FLAC 文件的支持。此前,这些文件会因
IllegalStateException: Playback stuck buffering and not loading
而无法播放 (#2197)。
- 音频
- 修复了
onAudioPositionAdvancing
在播放恢复时调用(此前在播放暂停时调用)的 bug。 - 当
SpeedChangingAudioProcessor
配置了默认参数时,不要绕过SonicAudioProcessor
。 - 修复了
Sonic#getOutputSize()
中的下溢问题,该问题可能导致DefaultAudioSink
停滞。 - 修复了
MediaCodecAudioRenderer.getDurationToProgressUs()
和DecoderAudioRenderer.getDurationToProgressUs()
,以便寻址正确地重置提供的持续时间。 - 将
androidx.media3.common.audio.SonicAudioProcessor
设置为 final。 - 向
ChannelMappingAudioProcessor
和TrimmingAudioProcessor
添加对浮点 PCM 的支持。
- 修复了
- 视频
- 将
MediaCodecVideoRenderer.shouldUsePlaceholderSurface
更改为 protected,以便应用程序可以覆盖以阻止使用占位符表面 (#1905)。 - 添加实验性
ExoPlayer
AV1 样本依赖解析以加快寻址。通过新的DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies
API 启用它。 - 添加实验性
ExoPlayer
API,用于丢弃不依赖的晚期MediaCodecVideoRenderer
解码器输入缓冲区。通过DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs
启用它。 - 修复了没有表面的播放器立即就绪且解码任何待处理帧非常慢的问题 (#1973)。
- 将小米和 OPPO 设备排除在分离表面模式之外,以避免屏幕闪烁 (#2059)。
- 将
- 文本
- 添加对 VobSub 字幕的支持 (#8260)。
- 停止急切加载所有使用
MediaItem.Builder.setSubtitleConfigurations
配置的字幕文件,而是仅在轨道选择选中一个时才加载它 (#1721)。 - TTML:添加对使用
style
引用tts:origin
和tts:extent
的支持 (#2953)。 - 将 WebVTT 和 SubRip 时间戳限制为精确到 3 位小数。以前,我们错误地解析了任意位数的小数,但总是假设值为毫秒,导致时间戳不正确 (#1997)。
- 修复了播放列表中包含带有 CEA-608 或 CEA-708 字幕的剪辑项时播放卡顿的问题。
- 修复了 SSA 文件包含持续时间为零(开始时间和结束时间相同)的提示时
IllegalStateException
的 bug (#2052)。 - 当字幕与音频和视频一起复用到同一个容器中时,抑制(并记录)字幕解析错误 (#2052)。
- 修复了使用 CR 行结束符的 WebVTT 文件中多字节 UTF-8 字符的处理问题 (#2167)。
- DRM
- 修复了在 API < 27 设备上播放 ClearKey 内容时出现的
MediaCodec$CryptoException: Operation not supported in this configuration
错误 (#1732)。
- 修复了在 API < 27 设备上播放 ClearKey 内容时出现的
- 效果
- 将
OverlaySettings
的功能移至StaticOverlaySettings
。OverlaySettings
可以被子类化以允许动态叠加设置。
- 将
- 多路复用器
- 将
MuxerException
从Muxer
接口移出,以避免过长的完全限定名。 - 将
Mp4Muxer.Builder
和FragmentedMp4Muxer.Builder
中的setSampleCopyEnabled()
方法重命名为setSampleCopyingEnabled()
。 Mp4Muxer.addTrack()
和FragmentedMp4Muxer.addTrack()
现在返回int
轨道 ID,而不是TrackToken
。Mp4Muxer
和FragmentedMp4Muxer
不再实现Muxer
接口。- 默认禁用
Mp4Muxer
样本批处理和复制。 - 修复了
FragmentedMp4Muxer
中的一个 bug,即仅写入音频轨道时会创建大量片段。
- 将
- 会话
- 当播放暂停、停止或失败时,将前台服务状态额外保持 10 分钟。这允许用户在此超时时间内恢复播放,而不会面临各种设备上的前台服务限制。请注意,在覆盖
onTaskRemoved
时,仅调用player.pause()
不再能用于在stopSelf()
之前停止前台服务,请改用MediaSessionService.pauseAllPlayersAndStopSelf()
。 - 当播放进入错误或停止状态时,保持通知可见。通知仅在播放列表被清除或播放器被释放时才会被移除。
- 改进 Android 平台 MediaSession 操作 ACTION_PLAY 和 ACTION_PAUSE 的处理,以便根据可用命令仅设置其中一个,并且即使仅设置其中一个也接受。
- 将
Context
作为参数添加到MediaButtonReceiver.shouldStartForegroundService
(#1887)。 - 修复了在连接到旧版会话的
MediaController
上调用Player
方法时,会丢失待处理更新中的更改的 bug。 - 使
MediaSession.setSessionActivity(PendingIntent)
接受 null (#2109)。 - 修复了播放列表被清除时,陈旧通知仍然可见的 bug (#2211)。
- 当播放暂停、停止或失败时,将前台服务状态额外保持 10 分钟。这允许用户在此超时时间内恢复播放,而不会面临各种设备上的前台服务限制。请注意,在覆盖
- UI
- 在
media3-ui-compose
模块中为PlayerSurface
、PresentationState
、PlayPauseButtonState
、NextButtonState
、PreviousButtonState
、RepeatButtonState
、ShuffleButtonState
和PlaybackSpeedState
添加状态持有者和可组合项。
- 在
- 下载
- 修复了
CacheWriter
中的 bug,该 bug 在数据源抛出除IOException
之外的Exception
时,会使数据源保持打开状态并锁定缓存区域 (#9760)。
- 修复了
- HLS 扩展
- 添加第一个版本的
HlsInterstitialsAdsLoader
。此广告加载器读取 HLS 媒体播放列表的 HLS 插页广告,并将其映射到传递给AdsMediaSource
的AdPlaybackState
。此初始版本仅支持具有X-ASSET-URI
属性的 HLS VOD 流。 - 添加
HlsInterstitialsAdsLoader.AdsMediaSourceFactory
。应用可以使用它以方便安全的方式创建使用HlsInterstitialsAdsLoader
的AdsMediaSource
实例。 - 从 HLS 播放列表解析
SUPPLEMENTAL-CODECS
标签以检测杜比视界格式 (#1785)。 - 放宽在 HLS 流中寻址同步位置的条件 (#2209)。
- 添加第一个版本的
- DASH 扩展
- 解码器扩展(FFmpeg、VP9、AV1 等)
- 添加 MPEG-H 解码器模块,该模块使用内置 MPEG-H 解码器解码 MPEG-H 音频 (#1826)。
- MIDI 扩展
- 将自定义
AudioSink
和AudioRendererEventListener
实例连接到MidiRenderer
。
- 将自定义
- Cast 扩展
- 将
play-services-cast-framework
依赖项更新到 21.5.0,以修复在安装但禁用 Google Play 服务的设备上,针对 API 34+ 的应用中FLAG_MUTABLE
导致的崩溃 (#2178)。
- 将
- 演示应用
- 扩展
demo-compose
,添加额外按钮并增强PlayerSurface
集成,支持缩放和快门。
- 扩展
- 删除已弃用符号
- 移除已弃用的
AudioMixer.create()
方法。请改用DefaultAudioMixer.Factory().create()
。 - 移除以下已弃用的
Transformer.Builder
方法setTransformationRequest()
,请改用setAudioMimeType()
、setVideoMimeType()
和setHdrMode()
。setAudioProcessors()
,请改为在EditedMediaItem.Builder.setEffects()
中设置音频处理器,并将其传递给Transformer.start()
。setVideoEffects()
,请改为在EditedMediaItem.Builder.setEffects()
中设置视频效果,并将其传递给Transformer.start()
。setRemoveAudio()
,请改为使用EditedMediaItem.Builder.setRemoveAudio()
从传递给Transformer.start()
的EditedMediaItem
中移除音频。setRemoveVideo()
,请改为使用EditedMediaItem.Builder.setRemoveVideo()
从传递给Transformer.start()
的EditedMediaItem
中移除视频。setFlattenForSlowMotion()
,请改为使用EditedMediaItem.Builder.setFlattenForSlowMotion()
将传递给Transformer.start()
的EditedMediaItem
展平。setListener()
,请改用addListener()
、removeListener()
或removeAllListeners()
。
- 移除以下已弃用的
Transformer.Listener
方法onTransformationCompleted(MediaItem)
,请改用onCompleted(Composition, ExportResult)
。onTransformationCompleted(MediaItem, TransformationResult)
,请改用onCompleted(Composition, ExportResult)
。onTransformationError(MediaItem, Exception)
,请改用onError(Composition, ExportResult, ExportException)
。onTransformationError(MediaItem, TransformationException)
,请改用onError(Composition, ExportResult, ExportException)
。onTransformationError(MediaItem, TransformationResult, TransformationException)
,请改用onError(Composition, ExportResult, ExportException)
。onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)
,请改用onFallbackApplied(Composition, TransformationRequest, TransformationRequest)
。
- 移除已弃用的
TransformationResult
类。请改用ExportResult
。 - 移除已弃用的
TransformationException
类。请改用ExportException
。 - 移除已弃用的
Transformer.PROGRESS_STATE_NO_TRANSFORMATION
。请改用Transformer.PROGRESS_STATE_NOT_STARTED
。 - 移除已弃用的
Transformer.setListener()
。请改用Transformer.addListener()
、Transformer.removeListener()
或Transformer.removeAllListeners()
。 - 移除已弃用的
Transformer.startTransformation()
。请改用Transformer.start(MediaItem, String)
。 - 移除已弃用的
SingleFrameGlShaderProgram
。请改用BaseGlShaderProgram
。 - 移除
Transformer.flattenForSlowMotion
。请改用EditedMediaItem.flattenForSlowMotion
。 - 移除了
ExoPlayer.VideoComponent
、ExoPlayer.AudioComponent
、ExoPlayer.TextComponent
和ExoPlayer.DeviceComponent
。 - 移除了
androidx.media3.exoplayer.audio.SonicAudioProcessor
。 - 移除了以下已弃用的
DownloadHelper
方法- 构造函数
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[])
,请改用DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)
。 getRendererCapabilities(RenderersFactory)
,可以通过使用RenderersFactory
创建DefaultRendererCapabilitiesList
并调用DefaultRendererCapabilitiesList.getRendererCapabilities()
来实现等效功能。
- 构造函数
- 移除了
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)
方法。请改用PlayerNotificationManager.setMediaSessionToken(MediaSession.Token)
并传入(MediaSession.Token) compatToken.getToken()
。
- 移除已弃用的
1.6.0-rc02
2025 年 3 月 19 日
使用 1.6.0 稳定版本。
1.6.0-rc01
2025 年 3 月 12 日
使用 1.6.0 稳定版本。
1.6.0-beta01
2025 年 2 月 26 日
使用 1.6.0 稳定版本。
版本 1.6.0-alpha03
2025 年 2 月 06 日
使用 1.6.0 稳定版本。
版本 1.6.0-alpha02
2025 年 1 月 30 日
使用 1.6.0 稳定版本。
版本 1.6.0-alpha01
2024 年 12 月 20 日
使用 1.6.0 稳定版本。
版本 1.5
版本 1.5.1
2024 年 12 月 19 日
androidx.media3:media3-*:1.5.1
已发布。版本 1.5.1 包含这些提交。
- ExoPlayer
- 禁用 MediaCodec 中的异步解密,以避免报告的此平台 API 编解码器超时问题 (#1641)。
- 提取器
- MP3:当
VBRI
帧的内容表未覆盖文件中所有 MP3 数据时,不要过早停止播放 (#1904)。
- MP3:当
- 视频
- 回滚在使用
MediaCodecAdapter
提供的像素宽高比值时,在处理onOutputFormatChanged
时使用这些值的情况 (#1371)。
- 回滚在使用
- 文本
- 修复了
ReplacingCuesResolver.discardCuesBeforeTimeUs
中的 bug,即在timeUs
处活动的提示(之前已开始但尚未结束)被错误丢弃 (#1939)。
- 修复了
- 元数据
- 从 Vorbis 注释中提取光盘/轨道编号和流派到
MediaMetadata
(#1958)。
- 从 Vorbis 注释中提取光盘/轨道编号和流派到
版本 1.5.0
2024 年 11 月 27 日
androidx.media3:media3-*:1.5.0
已发布。版本 1.5.0 包含这些提交。
- 通用库
- 添加
ForwardingSimpleBasePlayer
,它允许在进行少量调整的同时转发到另一个播放器,同时确保完全一致性和监听器处理 (#1183)。 - 用
getPlaylist()
方法替换SimpleBasePlayer.State.playlist
。 - 为
SimpleBasePlayer.State.Builder.setPlaylist()
添加重写,以直接指定Timeline
和当前Tracks
和Metadata
,而不是构建播放列表结构。 - 将
minSdk
提高到 21 (Android Lollipop)。这与所有其他 AndroidX 库保持一致。 - 添加
androidx.media3:media3-common-ktx
构件,它提供基于通用库构建的 Kotlin 特定功能 - 为
media3-common-ktx
库添加Player.listen
挂起扩展函数,用于启动协程监听Player.Events
。 - 从手动外联的内部类中移除
@DoNotInline
注解,这些内部类旨在避免运行时类验证失败。最近版本的 R8 现在会自动外联此类调用以避免运行时失败(因此不再需要手动外联)。该库的所有 Gradle 用户必须已经使用 Android Gradle 插件的一个版本,该版本使用了执行此操作的 R8 版本,由于compileSdk = 35
。使用非 Gradle 构建系统的库用户需要确保其等效于 R8 的代码缩减/混淆步骤执行类似的自动外联过程,以避免运行时类验证失败。此更改已在其他 AndroidX 库中完成。
- 添加
- ExoPlayer
- 现在可以为每个媒体项调用
MediaCodecRenderer.onProcessedStreamChange()
。以前,第一个媒体项不会调用此方法。使用MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
启用此功能。 - 添加
PreloadMediaSource.PreloadControl.onPreloadError
,以允许PreloadMediaSource.PreloadControl
实现器在发生错误时采取行动。 - 添加
BasePreloadManager.Listener
以将预加载事件传播到应用。 - 允许更改 SNTP 客户端超时并在超时时重试备用地址 (#1540)。
- 移除
MediaCodecAdapter.Configuration.flags
,因为该字段始终为零。 - 允许用户在 Wear OS API 35+ 上选择内置扬声器进行播放(如果设备宣传支持此功能)。
- 推迟对
Context.getSystemService(Context.AUDIO_SERVICE)
的阻塞调用,直到启用音频焦点处理。这确保了如果未启用音频焦点处理,则不会进行阻塞调用 (#1616)。 - 当加载失败时,允许播放而不受缓冲持续时间的影响 (#1571)。
- 添加
AnalyticsListener.onRendererReadyChanged()
以指示单个渲染器何时允许播放就绪。 - 修复了当
MediaCodec
在异步模式下操作时(API 31+ 上的默认行为),MediaCodec.CryptoException
有时被报告为“意外运行时错误”的 bug。 - 在
PreloadMediaSource.PreloadControl.onContinueLoadingRequested()
中传递bufferedDurationUs
而不是bufferedPositionUs
。还将DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
更改为DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
,然后应用需要传入一个值,该值表示从默认起始位置开始的特定持续时间,对应的媒体源必须使用此 IntDef 进行预加载,而不是位置。 - 添加
ForwardingRenderer
实现,将所有方法调用转发到另一个渲染器 (1703)。 - 添加播放列表中下一个项目的播放列表预加载。应用可以通过相应地调用
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
来启用预加载。默认情况下,预加载是禁用的。当选择加入且不干扰播放时,DefaultLoadControl
将预加载限制为仅当播放器未加载播放内容时才开始和继续。应用可以通过相应地实现LoadControl.shouldContinuePreloading()
来更改此行为(例如在DefaultLoadControl
中重写此方法时)。如果应用使用自定义实现的LoadControl
,则LoadControl
的默认实现会禁用预加载。 - 添加方法
MediaSourceEventListener.EventDispatcher.dispatchEvent()
以允许调用子类监听器的事件 (1736)。 - 添加
DefaultPreloadManager.Builder
,它以一致共享的配置构建DefaultPreloadManager
和ExoPlayer
实例。 - 从
LoadControl.onTracksSelected()
中移除Renderer[]
参数,因为DefaultLoadControl
实现可以从ExoTrackSelection[]
中检索流类型。 - 弃用了
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
并将方法标记为 final 以防止重写。应改用新的DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
。 - 报告
MergingMediaSource
中辅助源的MediaSourceEventListener
事件。这将导致旁加载字幕(使用MediaItem.LocalConfiguration.subtitleConfigurations
添加的字幕)报告加载开始/错误/取消/完成事件,这些事件可能显示为从AnalyticsListener
发出的重复加载事件。 - 防止字幕和元数据错误完全停止播放。相反,有问题的轨道被禁用,其余轨道的播放继续 (#1722)。
- 在新的字幕处理(提取期间)中,相关的解析错误(例如无效字幕数据)和加载错误(例如 HTTP 404)通过
onLoadError
回调发出。 - 在旧版字幕处理(渲染期间)中,只有相关的加载错误通过
onLoadError
回调发出,而解析错误被静默忽略(这是预先存在的行为)。
- 在新的字幕处理(提取期间)中,相关的解析错误(例如无效字幕数据)和加载错误(例如 HTTP 404)通过
- 修复了多周期 DASH 流中,播放列表项或周期持续时间与实际内容不匹配可能导致项目末尾画面冻结的 bug (#1698)。
- 向
SntpClient
添加一个 setter,用于设置自上次更新以来的最大经过时间,之后客户端将重新初始化 (#1794)。
- 现在可以为每个媒体项调用
- Transformer
- 添加
SurfaceAssetLoader
,它支持通过Surface
将视频数据排队到 Transformer。 ImageAssetLoader
通过AssetLoader.onError
报告不支持的输入,而不是抛出IllegalStateException
。- 将使用
MediaItem.Builder.setImageDurationMs
设置图像持续时间设为图像导出的强制项。 - 添加对音频 EditedMediaItems 序列中间隙的导出支持。
- 添加
- 轨道选择
DefaultTrackSelector
:在其他因素相同的情况下,优先选择基于对象的音频而非基于声道的音频。
- 提取器
- 允许
Mp4Extractor
和FragmentedMp4Extractor
识别未被后续样本用作参考的 H264 样本。 - 添加在
AmrExtractor
中启用基于索引的寻址的选项。 - 将有效帧之间超过 128KB 的 MP3 文件视为已截断(而不是无效)。这意味着末尾包含非 MP3 数据,且没有其他元数据指示 MP3 字节长度的文件,现在会在 MP3 数据末尾停止播放,而不是因
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
而失败 (#1563)。 - 修复了在处理 MP4 文件中的编辑列表时,非关键帧媒体起始位置的预卷样本处理问题 (#1659)。
- 通过使用
Mp4Extractor
和FragmentedMp4Extractor
中mdhd
box 的媒体持续时间,改进了帧率计算 (#1531)。 - 修复了 MP4 编辑列表中
media_time
缩放不正确的问题。虽然segment_duration
已经使用电影时间刻度正确缩放,但现在media_time
根据 MP4 格式标准,使用轨道时间刻度正确缩放 (#1792)。 - 处理带编辑列表的 MP4 中
endIndices
计算的乱序帧 (#1797)。 - 修复了 MP4 文件
mdhd
box 中媒体持续时间解析以处理-1
值的问题 (#1819)。 - 添加对 MP4 文件中
h263
box 的识别支持,用于 H.263 视频 (#1821)。 - 添加 AC-4 Level-4 ISO 基本媒体文件格式支持 (#1265)。
- 允许
- 数据源
- 更新
HttpEngineDataSource
以允许从 S 扩展版本 7 而不是 API 级别 34 开始使用 (#1262)。 DataSourceContractTest
:断言DataSource.getUri()
返回已解析的 URI(如文档所述)。如果这与请求的 URI 不同,测试可以使用新的DataSourceContractTest.TestResource.Builder.setResolvedUri()
方法指示。DataSourceContractTest
:断言DataSource.getUri()
和getResponseHeaders()
在open()
调用失败(由于“未找到”资源)之后以及后续close()
调用之前返回其“打开”值。- 覆盖
DataSourceContractTest.getNotFoundResources()
允许测试子类提供多个“未找到”资源,并提供任何预期的头部。这允许区分 HTTP 404(带头部)和“服务器未找到”(无头部)。
- 覆盖
- 更新
- 音频
- 如果媒体中存在 CTA-2075 响度元数据,则自动在编解码器上配置。
- 确保寻址时音量平稳降低。
- 修复了寻址过程中可能出现的爆音。
- 修复了 Sonic 的时间拉伸/音高变换算法的截断误差累积问题。
- 修复了
SpeedChangingAudioProcessor
中导致输出帧丢失的 bug。
- 视频
MediaCodecVideoRenderer
避免解码既未渲染也未被其他样本用作参考的样本。- 在 API 35 及更高版本上,
MediaCodecAdapter
现在可以在configure
中接收null
Surface
,并调用新方法detachOutputSurface
以移除先前设置的Surface
,如果编解码器支持此功能 (MediaCodecInfo.detachedSurfaceSupported
)。 - 在处理
onOutputFormatChanged
时,如果提供了MediaCodecAdapter
提供的像素宽高比值,则使用这些值 (#1371)。 - 添加了一个针对 Galaxy Tab S7 FE 设备问题的解决方法,该问题导致 60fps 安全 H264 流被标记为不支持 (#1619)。
- 添加一个针对编解码器在最后一个样本后卡住而不返回流结束信号的解决方法。
- 文本
- 添加自定义
VoiceSpan
并为 WebVTT 语音跨度填充它 (#1632)。 - 确保显示 HLS 中 WebVTT 具有非常大的字幕时间戳(当表示为微秒并乘以
90,000
MPEG 时间基准时,会溢出 64 位long
) (#1763)。 - 支持杜比视界内容中的 CEA-608 字幕 (#1820)。
- 修复了当启用 CEA-608 字幕时,DASH 多周期流播放卡顿的问题 (#1863)。
- 添加自定义
- 元数据
- 将
C.TRACK_TYPE_METADATA
类型分配给包含 icy 或 vnd.dvb.ait 内容的轨道。
- 将
- 图像
- 添加
ExternallyLoadedImageDecoder
,以便更轻松地与 Glide 或 Coil 等外部图像加载库集成。
- 添加
- 数据源
- 添加
FileDescriptorDataSource
,一个可用于从FileDescriptor
读取数据的新DataSource
(#3757)。
- 添加
- 效果
- 为微小的
SurfaceTexture
缩放添加DefaultVideoFrameProcessor
解决方法。SurfaceTexture
可能会包含一个小缩放,该缩放会剪裁掉裁剪缓冲区边缘周围的 1 纹素边界。现在已对此进行处理,使输出更接近预期。 - 加快
DefaultVideoFrameProcessor.queueInputBitmap()
的速度。因此,使用Transformer
将图像导出为视频会更快。
- 为微小的
- IMA 扩展
- 修复了清除播放列表可能导致
ImaServerSideAdInsertionMediaSource
中出现ArrayIndexOutOfBoundsException
的错误。 - 修复了服务器端插入的 DAI 流(没有 preroll)在播放到最后一个 midroll 之后可能导致
ArrayIndexOutOfBoundsException
的错误(#1741)。
- 修复了清除播放列表可能导致
- 会话
- 添加
MediaButtonReceiver.shouldStartForegroundService(Intent)
以允许应用通过重写此方法来抑制用于播放恢复的播放命令。默认情况下,服务始终启动,并且在不导致系统因ForegroundServiceDidNotStartInTimeException
而崩溃服务的情况下无法抑制播放(#1528)。 - 修复了连接到旧版服务时,从
MediaBrowser
发送的自定义命令被分派到MediaSessionCompat.Callback
而不是MediaBrowserServiceCompat
变体方法中的错误。这阻止了MediaBrowser
接收旧版服务返回的实际返回值(#1474)。 - 处理某些制造商的设备在设置媒体按钮意图的广播接收器时抛出的
IllegalArgumentException
(#1730)。 - 为媒体项添加命令按钮。这为旧版库中通过
MediaBrowserCompat
所知的Custom browse actions
添加了 Media3 API。请注意,使用 Media3,媒体项的命令按钮同时适用于MediaBrowser
和MediaController
。请参阅 AAOS 的自定义浏览操作。 - 修复了 Media3 控制器在请求
play()
后有时无法让会话应用启动前台服务的错误。 - 将
CommandButton.Builder.setIconUri
限制为仅接受内容 URI。 - 将 Media3 浏览器的连接提示传递给初始的
MediaBrowserCompat
,以便连接到旧版MediaBrowserCompat
。服务可以通过对onGetRoot()
的首次调用,以根提示的形式接收传递的连接提示。 - 修复了连接到旧版浏览器服务的
MediaBrowser
在订阅parentid
后没有收到服务发送的错误的错误。 - 改进互操作性行为,使连接到旧版
MediaBrowserService
的 Media3 浏览器在订阅父级时不会两次请求parentId
的子级。
- 添加
- UI
- 由于基于 XML 的共享过渡存在问题,
PlayerView
在 ComposeAndroidView
中拉伸/裁剪视频的解决方法现在需要选择启用。在AndroidView
中使用PlayerView
的应用需要调用PlayerView.setEnableComposeSurfaceSyncWorkaround
才能选择启用(#1237, #1594)。 - 向
PlayerView
添加setFullscreenButtonState
,以允许按需更新全屏按钮的图标,即带外更新而非响应点击交互(#1590, #184)。 - 修复了当存在应用定义的文本轨道选择偏好设置时,文本选择中的“无”选项不起作用的错误。
- 由于基于 XML 的共享过渡存在问题,
- DASH 扩展
- 添加对分段中间开始的时段的支持(#1440)。
- 平滑流式传输扩展
- 修复了播放带文本轨道的 SmoothStreaming 流时出现的
Bad magic number for Bundle
错误(#1779)。
- 修复了播放带文本轨道的 SmoothStreaming 流时出现的
- RTSP 扩展
- 解码器扩展(FFmpeg、VP9、AV1 等)
- 添加 IAMF 解码器模块,该模块提供对包含 IAMF 轨道的 MP4 文件播放的支持,使用 libiamf 本机库合成音频。
- 支持立体声布局和 5.1 空间化播放,并可选择启用头部追踪,但目前不支持双耳播放。
- 添加 Android 15 上解码器扩展的 16 KB 页面支持(#1685)。
- 添加 IAMF 解码器模块,该模块提供对包含 IAMF 轨道的 MP4 文件播放的支持,使用 libiamf 本机库合成音频。
- Cast 扩展
- 停止在 CastSession 断开连接后清理时间线,这使得发送方应用在断开连接后可以本地恢复播放。
- 在提供
Context
时填充 CastPlayer 的DeviceInfo
。这使得MediaSession
能够链接到RoutingSession
,这对于集成输出切换器是必需的(#1056)。
- 测试实用程序
DataSourceContractTest
现在包含用于验证的测试:- 输入流
read position
已更新。 - 输出缓冲区
offset
应用正确。
- 输入流
- 演示应用
- 解决演示短格式应用中的内存泄漏问题(#1839)。
- 删除已弃用符号
- 移除已弃用的
Player.hasPrevious
、Player.hasPreviousWindow()
。请改用Player.hasPreviousMediaItem()
。 - 移除已弃用的
Player.previous()
方法。请改用Player.seekToPreviousMediaItem()
。 - 移除已弃用的
DrmSessionEventListener.onDrmSessionAcquired
方法。 - 移除已弃用的
DefaultEncoderFactory
构造函数。请改用DefaultEncoderFactory.Builder
。
- 移除已弃用的
版本 1.5.0-rc02
2024 年 11 月 19 日
使用 1.5.0 稳定版。
版本 1.5.0-rc01
2024 年 11 月 13 日
使用 1.5.0 稳定版。
版本 1.5.0-beta01
2024 年 10 月 30 日
使用 1.5.0 稳定版。
版本 1.5.0-alpha01
2024 年 9 月 10 日
使用 1.5.0 稳定版。
版本 1.4.0
版本 1.4.1
2024 年 8 月 27 日
androidx.media3:media3-*:1.4.1
已发布。版本 1.4.1 包含这些提交。
- ExoPlayer
- 提取器
- MP3:通过根据
Info
帧中的长度字段正确忽略尾部非 MP3 数据来修复Searched too many bytes
错误(#1480)。
- MP3:通过根据
- 文本
- TTML:修复百分比
tts:fontSize
值的处理,以确保它们从具有百分比tts:fontSize
值的父节点正确继承。 - 修复了
LegacySubtitleUtil
中由于未正确处理请求的输出开始时间大于或等于Subtitle
中最终事件时间的情况而导致的IndexOutOfBoundsException
(#1516)。
- TTML:修复百分比
- DRM
- 修复了在 API 31+ 设备上播放 L1 Widevine 内容时出现的
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
错误。此错误是由框架MediaDrm.requiresSecureDecoder
方法的不完整实现引起的(#1603)。
- 修复了在 API 31+ 设备上播放 L1 Widevine 内容时出现的
- 效果
- 向
GlObjectsProvider
添加release()
方法。
- 向
- 会话
- RTSP 扩展
- 跳过 SDP 解析中的无效媒体描述(#1087)。
版本 1.4.0
2024 年 7 月 25 日
androidx.media3:media3-*:1.4.0
已发布。版本 1.4.0 包含这些提交。
- 通用库
- 将推定的空操作查找调用转发给受保护的
BasePlayer.seekTo()
和SimpleBasePlayer.handleSeek()
方法,而不是忽略它们。如果您在自定义播放器中实现这些方法,您可能需要处理这些附加调用,其中mediaItemIndex == C.INDEX_UNSET
。 - 移除对增强型 Java 8 desugaring 的编译依赖(#1312)。
- 确保传递给
MediaItem.Builder.setImageDurationMs()
的时长对于非图像MediaItem
会被忽略(如文档所述)。 - 添加
Format.customData
以存储应用提供的关于Format
实例的自定义信息。
- 将推定的空操作查找调用转发给受保护的
- ExoPlayer
- 添加
BasePreloadManager
,它根据其rankingData
定义的优先级协调多个源的预加载。通过扩展此类别可以进行自定义。添加DefaultPreloadManager
,它使用PreloadMediaSource
将源的媒体样本预加载到内存中,并使用一个整数rankingData
来指示 UI 上项目的索引。 - 向
LoadControl
的大多数方法添加PlayerId
,以使LoadControl
实现能够支持多个播放器。 - 移除
Buffer.isDecodeOnly()
和C.BUFFER_FLAG_DECODE_ONLY
。无需设置此标志,因为渲染器和解码器将根据时间戳决定是否跳过缓冲区。自定义Renderer
实现应检查缓冲区时间是否至少为BaseRenderer.getLastResetPositionUs()
以决定是否应显示样本。自定义SimpleDecoder
实现可以根据需要检查isAtLeastOutputStartTimeUs()
或用DecoderOutputBuffer.shouldBeSkipped
标记其他缓冲区以跳过它们。 - 允许
TargetPreloadStatusControl.getTargetPreloadStatus(T)
返回 null 值,以指示不预加载具有给定rankingData
的MediaSource
。 - 向
BasePreloadManager
添加remove(MediaSource)
。 - 向
BasePreloadManager
添加reset()
,以释放所有持有的源,同时保留预加载管理器实例。 - 添加
ExoPlayer.setPriority()
(和Builder.setPriority()
)以定义在PriorityTaskManager
中使用的优先级值以及从 API 35 开始的 MediaCodec 重要性。 - 修复了更新上次重新缓冲时间导致 CMCD 中
bs
(缓冲区饥饿)键不正确的问题(#1124)。 - 添加
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
以指示源已加载到末尾。这允许DefaultPreloadManager
和自定义PreloadMediaSource.PreloadControl
实现预加载下一个源或执行其他操作。 - 修复了在项目末尾跳过静音可能触发播放异常的错误。
- 向
PreloadMediaSource
添加clear
以丢弃预加载时段。 - 添加新的错误代码
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
,该代码在编解码器资源被回收用于更高优先级任务时使用。 - 允许
AdsMediaSource
在初始内容媒体准备完成之前加载 preroll 广告(#1358)。 - 修复了在原始时段已从清单中移除后,重新准备多时段 DASH 直播流时播放移动到
STATE_ENDED
的错误。 - 在
PreloadMediaSource.PreloadControl
中,将onTimelineRefreshed()
重命名为onSourcePrepared()
,将onPrepared()
重命名为onTracksSelected()
。同时,在DefaultPreloadManager.Stage
中相应地重命名 IntDefs。 - 添加对动态调度的实验性支持,以更好地使工作与 CPU 唤醒周期对齐,并延迟唤醒直到渲染器可以进行。您可以在设置 ExoPlayer 实例时使用
experimentalSetDynamicSchedulingEnabled()
启用此功能。 - 添加
Renderer.getDurationToProgressUs()
。一个Renderer
可以实现此方法以向 ExoPlayer 返回播放必须前进的时长,以便渲染器可以进行。如果ExoPlayer
设置了experimentalSetDynamicSchedulingEnabled()
,则ExoPlayer
将在计算调度其工作任务的时间时调用此方法。 - 添加
MediaCodecAdapter#OnBufferAvailableListener
,以便在输入和输出缓冲区可供MediaCodecRenderer
使用时发出警报。MediaCodecRenderer
在收到这些回调时会向ExoPlayer
发出信号,如果ExoPlayer
设置了experimentalSetDynamicSchedulingEnabled()
,则ExoPlayer
将在渲染器可以进行时调度其工作循环。 - 对
LoadControl
方法使用数据类,而不是单独的参数。 - 添加
ExoPlayer.isReleased()
以检查是否已调用Exoplayer.release()
。 - 添加
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
以配置seekToPrevious()
查找上一项的最大位置(#1425)。 - 修复了一些音频焦点不一致问题,例如播放器暂停时未报告完全或暂时性焦点丢失(#1436)。
- 修复了提取器在初始准备步骤后报告额外轨道可能导致
IndexOutOfBoundsException
的问题(#1476)。 ExoPlayer.setVideoEffect()
中的Effects
将接收已移除渲染器偏移量的时间戳(#1098)。- 修复了在读取到另一个播放列表项时发生播放器错误时处理
IllegalArgumentException
的潜在问题(#1483)。
- 添加
- Transformer
- 将
audioConversionProcess
和videoConversionProcess
添加到ExportResult
,指示输出文件中相应轨道的生成方式。 - 放宽裁剪优化 H.264 级别检查。
- 添加对序列中 SDR 和 HDR 输入媒体之间切换的支持。
- 添加对合成级音频效果的支持。
- 添加将超 HDR 图像转码为 HDR 视频的支持。
- 修复
DefaultAudioMixer
在重置和重用后未输出正确字节数的问题。 - 解决解码器处理 PCM 输入时音频通道数上限为立体声的错误。
- 在
ExoPlayerAssetLoader
中选择轨道时,忽略音频通道计数限制,因为它们仅适用于播放。 - 将
androidx.media3.transformer.Muxer
接口替换为androidx.media3.muxer.Muxer
并移除androidx.media3.transformer.Muxer
。 - 修复从内容 URI 方案加载 HEIC 图像的问题。(#1373)。
- 调整
AudioGraphInput
中的音频轨道持续时间以改善 AV 同步。 - 移除
ExportResult.processedInputs
字段。如果您将此字段用于编解码器详细信息,请改用DefaultDecoderFactory.listener
。如果发生编解码器异常,编解码器详细信息将在ExportException.codecInfo
中可用。
- 将
- 提取器
- MPEG-TS:回滚更改,确保通过将流的最后一个访问单元传递到样本队列来渲染最后一帧(#7909)。包含了解决 I 帧 HLS 流(#1150)和 H.262 HLS 流(#1126)中出现的问题的修复。
- MP3:优先使用
Info
帧中的数据大小,而不是底层流报告的大小(例如文件大小或 HTTPContent-Length
标头)。这有助于从恒定比特率查找计算中排除不可播放的尾部数据(例如专辑封面),使查找更精确(#1376)。 - MP3:使用
Info
帧(如果存在)中的帧计数和其他数据来计算恒定比特率查找的平均比特率,而不是从Info
帧之后的帧(可能人为地小,例如PCUT
帧)的比特率推断(#1376)。 - 修复 AVI 容器中的 PCM 音频格式提取。
- 音频
- 修复 DTS:X Profile 2 编码属性以进行直通播放(#1299)。
- 对于卸载播放,在调用
AudioTrack.stop()
之前,重置DefaultAudioSink
中流完成的跟踪字段,以便AudioTrack.StreamEventCallback#onPresentationEnded
正确识别所有待处理数据何时已播放。 - 修复
SilenceSkippingAudioProcessor
中的错误,即不同音频格式(例如立体声到单声道)之间的转换可能导致处理器抛出异常(#1352)。 - 实现
MediaCodecAudioRenderer.getDurationToProgressUs()
,以便 ExoPlayer 将其主工作循环动态调度到 MediaCodecAudioRenderer 可以进行时。
- 视频
- 修复了在播放过程中切换表面时
Listener.onRenderedFirstFrame()
过早到达的问题。 - 修复了杜比视界的解码器回退逻辑,使其在需要时使用兼容的 AV1 解码器(#1389)。
- 修复了可能因在播放中途启用视频渲染器而导致的编解码器异常。
- 修复了在播放过程中切换表面时
- 文本
- 修复了字幕在查找位置之前开始时被跳过的错误。此问题仅在 Media3 1.4.0-alpha01 中引入。
- 更改默认字幕解析行为,使其在提取过程中发生,而不是在渲染过程中发生(有关提取和渲染之间差异的更多信息,请参阅ExoPlayer 架构图)。
- 此更改可以通过同时调用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
和TextRenderer.experimentalSetLegacyDecodingEnabled(true)
来覆盖。有关如何将这些组件插入ExoPlayer
实例的详细信息,请参阅自定义文档。这些方法(以及对旧版字幕解码的所有支持)将在未来的版本中移除。 - 具有自定义
SubtitleDecoder
实现的应用需要更新它们以实现SubtitleParser
(以及SubtitleParser.Factory
而不是SubtitleDecoderFactory
)。
- 此更改可以通过同时调用
- PGS:修复行程长度解码以将
0
解析为颜色索引,而不是字面颜色值(#1367)。 - CEA-708:忽略
rowLock
值。CEA-708-E S-2023 规范指出,无论流中存在的值如何,rowLock
和columnLock
都应假定为 true(columnLock
支持未实现,因此实际上总是假定为 false)。- 这最初包含在
1.3.0-alpha01
发布说明中,但在1.3.0-rc01
发布之前意外回滚了此更改。现在已修复,因此此更改再次存在。
- 这最初包含在
- CEA-708:避免 ExoPlayer 对“设置笔位置”命令的简单处理添加重复的换行符(#1315)。
- 修复
LegacySubtitleUtil
在 WebVTT 字幕样本不包含任何提示时(例如作为 DASH 流的一部分)抛出的IllegalArgumentException
(#1516)。
- 元数据
- 图像
- 添加对非方形 DASH 缩略图网格的支持(#1300)。
- 为 API 34+ 添加 AVIF 支持。
- 允许
ExoPlayer.setImageOutput()
的参数为null
,以清除之前设置的ImageOutput
。
- 数据源
- 实现对
android.resource://package/id
原始资源 URI 的支持,其中package
与当前应用程序的包不同。此前未记录此功能,但它是比按名称访问另一个包中的资源更有效的方式。 - 在
DataSpec
构造函数中提前检查url
是否为非空。此参数已标记为非空。 - 允许
ByteArrayDataSource
在open()
期间将 URI 解析为字节数组,而不是在构造时硬编码(#1405)。
- 实现对
- DRM
- 允许在
DefaultDrmSessionManagerProvider
上设置LoadErrorHandlingPolicy
(#1271)。
- 允许在
- 效果
- 支持在
SpeedChangeEffect
中,同一EditedMediaItem
或Composition
内的多次速度更改。 - 支持从超 HDR 位图输入输出 HLG 和 PQ。
- 添加对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,这改善了 ExoPlayer.setVideoEffect 和 Transformer 的 Debug SurfaceView 中的 HLG 表面输出。
- 更新叠加矩阵实现,使其与文档一致,通过翻转
setOverlayFrameAnchor()
中应用的 x 和 y 值。如果使用OverlaySettings.Builder.setOverlayFrameAnchor()
,请将它们的 x 和 y 值乘以-1
来翻转。 - 修复了
TimestampWrapper
与ExoPlayer#setVideoEffects
一起使用时崩溃的错误(#821)。 - 将默认 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。还提供第三个选项以保留原始颜色空间。
- 允许定义 EditedMediaItemSequences 的不确定 z 顺序(#1055)。
- 在不同的 HDR 内容之间保持一致的亮度范围(使用 HLG 范围)。
- 添加对 HDR 内容上的超 HDR(位图)叠加层的支持。
- 允许在 API 26 之前使用
SeparableConvolution
效果。 - 移除未使用的
OverlaySettings.useHdr
,因为叠加层和帧的动态范围必须匹配。 - 为
TextOverlay
添加 HDR 支持。文本叠加层的亮度可以通过OverlaySettings.Builder.setHdrLuminanceMultiplier()
进行调整。
- 支持在
- IMA 扩展
- 会话
- 将
CommandButton.enabled
的默认值更改为true
,并确保即使关联命令可用,控制器的值也可以保持 false。 - 添加应替代自定义图标资源的
CommandButton
图标常量。 - 添加
MediaSessionService.isPlaybackOngoing()
以允许应用查询服务是否需要在onTaskRemoved()
中停止(#1219)。 - 添加
MediaSessionService.pauseAllPlayersAndStopSelf()
,它方便地允许暂停所有会话的播放并调用stopSelf()
以终止MediaSessionService
的生命周期。 - 覆盖
MediaSessionService.onTaskRemoved(Intent)
以提供安全的默认实现,即在播放进行中时保持服务在前台运行,否则停止服务。 - 通过不将持续时间设置到平台会话元数据中,隐藏直播流媒体通知中的进度条(#1256)。
- 对齐
MediaMetadata
到MediaDescriptionCompat
的转换,以便在选择元数据属性时使用与 media1 相同的首选顺序和逻辑。 - 添加
MediaSession.sendError()
,允许向 Media3 控制器发送非致命错误。当使用通知控制器(参见MediaSession.getMediaNotificationControllerInfo()
)时,自定义错误用于将平台会话的PlaybackState
更新为带有给定错误信息的错误状态(#543)。 - 添加
MediaSession.Callback.onPlayerInteractionFinished()
以通知会话何时完成来自特定控制器的一系列播放器交互。 - 添加
SessionError
,并在SessionResult
和LibraryResult
中使用它代替错误代码,以提供更多关于错误的信息以及如何(如果可能)解决错误。 - 发布 media3 控制器测试应用的代码,该应用可用于测试与发布媒体会话的应用的交互。
- 将传递给 media3 的
MediaSession[Builder].setSessionExtras()
的附加信息传播到 media1 控制器的PlaybackStateCompat.getExtras()
。 - 将致命和非致命错误映射到平台会话,并从中映射。一个
PlaybackException
被映射到PlaybackStateCompat
的致命错误状态。发送到媒体通知控制器(通过MediaSession.sendError(ControllerInfo, SessionError)
)的SessionError
被映射到PlaybackStateCompat
中的非致命错误,这意味着错误代码和消息已设置,但平台会话的状态与STATE_ERROR
不同。 - 允许按控制器设置会话活动,以覆盖全局会话活动。会话活动可以在连接时通过创建带有
AcceptedResultBuilder.setSessionActivivty(PendingIntent)
的ConnectionResult
来为控制器定义。连接后,会话活动可以通过MediaSession.setSessionActivity(ControllerInfo, PendingIntent)
进行更新。 - 改进对
MediaLibrarySession.Callback
调用的错误复制。现在可以通过使用MediaLibrarySession.Builder.setLibraryErrorReplicationMode()
来配置错误复制,以选择错误类型或选择退出错误复制(默认启用)。
- 将
- UI
- 下载
- 确保
DownloadHelper
不会泄漏未释放的Renderer
实例,这最终可能导致应用因IllegalStateException: Too many receivers, total of 1000, registered for pid
而崩溃(#1224)。
- 确保
- Cronet 扩展
- 修复
CronetDataSource
中的SocketTimeoutException
。在某些版本的 Cronet 中,回调提供的请求并不总是相同的。这导致回调未完成且请求超时(https://issuetracker.google.com/328442628)。
- 修复
- HLS 扩展
- 修复了
HlsSampleStreamWrapper
中,等待不连续性挂起的 EMSG 样本以不正确的偏移量委托,导致IndexOutOfBoundsException
或IllegalArgumentException
的错误(#1002)。 - 修复了非主播放列表在 LL-HLS 流中持续重新加载的错误(#1240)。
- 修复了为带有初始化段的 HLS 启用 CMCD 导致
Source Error
和IllegalArgumentException
的错误。 - 修复了在直播播放期间非主要播放列表未刷新的错误(#1240)。
- 修复了为 HLS 直播流启用 CMCD 导致
ArrayIndexOutOfBoundsException
的错误(#1395)。
- 修复了
- DASH 扩展
- Cast 扩展
- 修复了将
MediaQueueItem
的专辑标题转换为 Media3 媒体项中艺术家的问题(#1255)。
- 修复了将
- 测试实用程序
- 在
FakeRenderer
中实现onInit()
和onRelease()
。 - 更改
TestPlayerRunHelper.runUntil()/playUntil()
方法,使其在非致命错误(例如报告给AnalyticsListener.onVideoCodecError()
的错误)上失败。使用新的TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
方法链来禁用此行为。
- 在
- 演示应用
- 在短格式演示应用中使用
DefaultPreloadManager
。 - 允许通过命令行
Intent
参数设置重复模式(#1266)。 - 如果设备支持,则使用
HttpEngineDataSource
作为HttpDataSource
。
- 在短格式演示应用中使用
- 删除已弃用符号
- 移除
CronetDataSourceFactory
。请改用CronetDataSource.Factory
。 - 移除部分
DataSpec
构造函数。请改用DataSpec.Builder
。 - 从
DefaultHttpDataSource
、OkHttpDataSource
和CronetDataSource
中移除setContentTypePredicate(Predicate)
方法。请改用每个XXXDataSource.Factory
上的等效方法。 - 移除
OkHttpDataSource
构造函数和OkHttpDataSourceFactory
。请改用OkHttpDataSource.Factory
。 - 移除
PlayerMessage.setHandler(Handler)
。请改用setLooper(Looper)
。 - 移除
Timeline.Window.isLive
字段。请改用isLive()
方法。 - 移除
DefaultHttpDataSource
构造函数。请改用DefaultHttpDataSource.Factory
。 - 移除
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
。请改用DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
。 - 移除
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
。请改用MediaCodecInfo.canReuseCodec(Format, Format)
。 - 移除
DrmSessionManager.DUMMY
和getDummyDrmSessionManager()
方法。请改用DrmSessionManager.DRM_UNSUPPORTED
。 - 移除
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
、AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
、AudioRendererEventListener.onAudioInputFormatChanged(Format)
、VideoRendererEventListener.onVideoInputFormatChanged(Format)
。请改用接受DecoderReuseEvaluation
的重载。 - 移除
RendererSupport.FormatSupport
IntDef 以及FORMAT_HANDLED
、FORMAT_EXCEEDS_CAPABILITIES
、FORMAT_UNSUPPORTED_DRM
、FORMAT_UNSUPPORTED_SUBTYPE
、FORMAT_UNSUPPORTED_TYPE
常量。请改用androidx.media3.common.C
中等效的 IntDef 和常量(例如C.FORMAT_HANDLED
)。 - 移除
Bundleable
接口。这包括移除所有Bundleable.Creator<Foo> CREATOR
常量字段。调用者应改用每种类型上的Bundle toBundle()
和static Foo fromBundle(Bundle)
方法。
- 移除
版本 1.4.0-rc01
2024 年 7 月 10 日
使用 1.4.0 稳定版。
版本 1.4.0-beta01
2024 年 6 月 26 日
使用 1.4.0 稳定版。
版本 1.4.0-alpha02
2024 年 6 月 7 日
使用 1.4.0 稳定版。
版本 1.4.0-alpha01
2024 年 4 月 17 日
使用 1.4.0 稳定版。
版本 1.3.0
版本 1.3.1
2024 年 4 月 11 日
androidx.media3:media3-*:1.3.1
已发布。版本 1.3.1 包含这些提交。
- 通用库
- 添加
Format.labels
以允许本地化或其他替代标签。
- 添加
- ExoPlayer
- Transformer
- 添加对因
MediaMuxer
不支持 API 30 之前的负呈现时间戳而抛出异常的解决方法。
- 添加对因
- 轨道选择
DefaultTrackSelector
:优先选择帧率“合理”(>=10fps)的视频轨道,而不是帧率较低或未设置的视频轨道。这确保了播放器在从运动照片中提取的 MP4 中选择“真实”视频轨道,这些 MP4 可能包含两个 HEVC 轨道,其中一个分辨率更高但帧数非常少(#1051)。
- 提取器
- 音频
- 允许渲染器恢复,如果音频轨道在卸载模式下初始化失败,则禁用卸载。
- 视频
- 文本
- WebVTT:防止直接连续的提示从
WebvttParser.parse
创建虚假的附加CuesWithTiming
实例(#1177)。
- WebVTT:防止直接连续的提示从
- DRM
- 解决了
MediaDrm
框架可能抛出NoSuchMethodError
而不是ResourceBusyException
或NotProvisionedException
的问题,该问题发生在某些 Android 14 设备上(#1145)。
- 解决了
- 效果
- 通过转换颜色空间改进 PQ 到 SDR 色调映射。
- 会话
- UI
- 如果
Locale
无法识别显示名称,则回退到包含音频轨道语言名称(#988)。
- 如果
- DASH 扩展
- 将清单中的所有
Label
元素填充到Format.labels
中(#1054)。
- 将清单中的所有
- RTSP 扩展
- 跳过 SDP 解析中的空会话信息值(i 标签)(#1087)。
- 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
- 默认情况下禁用 MIDI 扩展作为本地依赖项,因为它需要配置额外的 Maven 存储库。需要从本地依赖项获取此模块的用户可以重新启用它。
版本 1.3.0
2024 年 3 月 6 日
androidx.media3:media3-*:1.3.0
已发布。版本 1.3.0 包含这些提交。
- 通用库
- 实现对
android.resource://package/[type/]name
原始资源 URI 的支持,其中package
与当前应用程序的包不同。这在文档中一直被视为可行,但直到现在才正确实现。 - 规范化由应用代码设置或从媒体读取的 MIME 类型,使其完全小写。
- 在
AdPlaybackState
中使用完整的MediaItem
而不是单个Uri
来定义广告。 - 将
minSdk
增加到 19 (Android KitKat)。这与所有其他 AndroidX 库保持一致,并且是我们将升级到最新版本 AndroidX 依赖项所必需的。 - 当
artworkUri
和artworkData
中至少有一个非空时,将两者都填充到MediaMetadata.Builder.populate(MediaMetadata)
中(#964)。
- 实现对
- ExoPlayer
- 添加
PreloadMediaSource
和PreloadMediaPeriod
,允许应用程序在播放前预加载特定起始位置的内容媒体源。PreloadMediaSource
负责准备内容媒体源以接收Timeline
,在给定起始位置准备和缓存时段,选择轨道并加载时段的媒体数据。应用程序通过实现PreloadMediaSource.PreloadControl
并将预加载的源设置为播放器进行播放来控制预加载进度。 - 添加
ExoPlayer.setImageOutput
,允许应用设置ImageRenderer.ImageOutput
。 DefaultRenderersFactory
现在默认向播放器提供一个ImageRenderer
,其ImageOutput
为 null,ImageDecoder.Factory.DEFAULT
。- 在跳过静音时发出
Player.Listener.onPositionDiscontinuity
事件(#765)。 - 添加对提取过程中解析字幕的实验性支持。您可以使用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
启用此功能。 - 支持
PreloadMediaSource
的自适应媒体源。 - 实现
HttpEngineDataSource
,这是一个使用 HttpEngine API 的HttpDataSource
。 - 阻止
CompositeSequenceableLoader
的子类化。此组件以前是可扩展的,但在库中从未被子类化。可以通过使用装饰器模式包装实例并实现自定义CompositeSequenceableLoaderFactory
来进行自定义。 - 修复了重复相同时间导致此项目的元数据被清除的错误(#1007)。
- 将
BundledChunkExtractor.Factory
和DefaultHlsExtractorFactory
上的experimentalSetSubtitleParserFactory
方法重命名为setSubtitleParserFactory
,并禁止传递null
。使用新的experimentalParseSubtitlesDuringExtraction(boolean)
方法来控制解析行为。 - 添加对自定义提取期间使用的
SubtitleParser.Factory
的支持。这可以通过MediaSource.Factory.setSubtitleParserFactory()
实现。 - 将源前缀添加到从
MergingMediaSource
生成的所有Format.id
字段。这有助于识别哪个源产生了Format
(#883)。 - 通过修改用于验证自定义通用媒体客户端数据 (CMCD) 键名的正则表达式,使其仅检查连字符,从而修复了该正则表达式(#1028)。
- 停止双重编码 CMCD 查询参数(#1075)。
- 添加
- Transformer
- 轨道选择
- 添加
DefaultTrackSelector.selectImageTrack
以启用图像轨道选择。 - 添加
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
,用于确定当图像轨道和视频轨道都可用时是否选择图像轨道。默认值为false
,这意味着优先选择视频轨道。
- 添加
- 提取器
- 向 MP4 提取器添加额外的 AV1C 解析,以检索
ColorInfo.colorSpace
、ColorInfo.colorTransfer
和ColorInfo.colorRange
值(#692)。 - MP3:对于带有
Info
头部(与Xing
头部等效的 CBR)的文件,使用恒定比特率 (CBR) 查找。以前我们使用Info
头部中的查找表,但这会导致查找精度低于忽略它并假设文件是 CBR 的情况。 - MPEG2-TS:添加 DTS、DTS-LBR 和 DTS:X Profile2 支持(#275)。
- 从 TS 描述符中提取音频类型并将其映射到角色标志,允许用户做出更明智的音频轨道选择(#973)。
- 向 MP4 提取器添加额外的 AV1C 解析,以检索
- 音频
- 视频
- 更改
MediaCodecVideoRenderer
的构造函数,该构造函数接受VideoFrameProcessor.Factory
参数,并将其替换为接受VideoSinkProvider
参数的构造函数。希望注入自定义VideoFrameProcessor.Factory
的应用可以实例化一个使用自定义VideoFrameProcessor.Factory
的CompositingVideoSinkProvider
,并将视频接收器提供者传递给MediaCodecVideoRenderer
。
- 更改
- 文本
- 修复位图提示的序列化,以解决使用
DefaultExtractorsFactory.setTextTrackTranscodingEnabled
时出现的Tried to marshall a Parcel that contained Binder objects
错误(#836)。 - CEA-708:忽略
rowLock
值。CEA-708-E S-2023 规范指出,无论流中存在的值如何,rowLock
和columnLock
都应假定为 true(columnLock
支持未实现,因此实际上总是假定为 false)。
- 修复位图提示的序列化,以解决使用
- 图像
- 添加对 DASH 缩略图的支持。网格图像被裁剪,并以接近其呈现时间的方式向
ImageOutput
提供单个缩略图。
- 添加对 DASH 缩略图的支持。网格图像被裁剪,并以接近其呈现时间的方式向
- DRM
- 默认情况下,即使稍后加密样本的密钥尚未准备就绪,也立即播放 DRM 内容中的“清除前导”未加密样本。这可能导致在播放位置到达加密样本时,如果密钥仍未准备就绪,则出现播放中途停顿(但以前在此点播放根本不会开始)。此行为可以通过
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
或DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
禁用。
- 默认情况下,即使稍后加密样本的密钥尚未准备就绪,也立即播放 DRM 内容中的“清除前导”未加密样本。这可能导致在播放位置到达加密样本时,如果密钥仍未准备就绪,则出现播放中途停顿(但以前在此点播放根本不会开始)。此行为可以通过
- IMA 扩展
- 修复了没有相应文件扩展名的 DASH 和 HLS 广告无法播放的错误。
- 会话
- 为电视应用禁用双击检测(#962)。
- 修复了仅包含非空 extras 的
MediaItem.RequestMetadata
未在媒体控制器和会话之间传输的问题。 - 向
MediaLibrarySession.Builder
添加构造函数,该构造函数仅接受Context
而不是MediaLibraryService
。
- HLS 扩展
- 将
HlsMediaPeriod
的可见性限制为包私有。此类型不应直接依赖于 HLS 包之外。 - 更有效地解决查找段开始的问题(#1031)。
- 将
- 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
- MIDI 解码器:忽略 SysEx 事件消息(#710)。
- 测试实用程序
- 在
TestPlayerRunHelper.playUntilPosition
中不暂停播放。测试使播放保持播放状态,但暂停进度,直到测试能够添加断言和进一步操作。
- 在
- 演示应用
- 添加一个短格式演示模块,以演示
PreloadMediaSource
在短格式内容用例中的使用。
- 添加一个短格式演示模块,以演示
版本 1.3.0-rc01
2024 年 2 月 22 日
使用 1.3.0 稳定版。
版本 1.3.0-beta01
2024 年 2 月 7 日
使用 1.3.0 稳定版。
版本 1.3.0-alpha01
2024 年 1 月 15 日
使用 1.3.0 稳定版。
版本 1.2.0
版本 1.2.1
2024 年 1 月 9 日
- ExoPlayer
- Transformer
- 解决了编码器在配置时因设置高操作速率而抛出异常的问题。
- 提取器
- 音频
- 修复了多次调用
SilenceSkippingAudioProcessor
时 EOS 处理的问题(#712)。
- 修复了多次调用
- 视频
- 添加针对 Galaxy Tab S7 FE、Chromecast with Google TV 和 Lenovo M10 FHD Plus 设备问题的解决方法,该问题导致 60fps AVC 流被标记为不受支持(#693)。
- 元数据
- 修复了
MediaMetadata
仅从大写键的 Vorbis 注释中填充的错误(#876)。 - 捕获解析超大 ID3 帧时出现的
OutOfMemoryError
,这意味着播放可以在没有标签信息的情况下继续,而不是完全失败。
- 修复了
- DRM
- 将针对虚假 ClearKey
https://default.url
许可证 URL 的解决方法扩展到 API 33+(此前该解决方法仅适用于 API 33)(#837)。 - 修复了在播放器未附加表面时从加密内容切换到明文内容时出现的
ERROR_DRM_SESSION_NOT_OPENED
错误。该错误是由于错误地使用安全解码器播放明文内容造成的。
- 将针对虚假 ClearKey
- 会话
- UI
- DASH 扩展
- 在 DASH 清单中将“f800”解析为杜比的 5 个声道(#688)。
- 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
- Cast 扩展
- 清理
Timeline
的创建,以防止在投射设备上加载媒体失败时应用崩溃(#708)。
- 清理
版本 1.2.0
2023 年 11 月 15 日
- 通用库
- 向
Log.Logger
接口中的方法添加一个@Nullable Throwable
参数。这些方法的message
参数不再包含传递给Log.{d,i,w,e}()
方法的Throwable
的任何信息,因此如果需要,实现将需要手动附加此信息(可能使用Logger.appendThrowableString(String, Throwable)
)。 - 修复 Kotlin 兼容性问题,即不可空泛型类型参数和不可空数组元素类型未被检测为不可空。示例包括
TrackSelectorResult
和SimpleDecoder
方法参数(#6792)。 - 更改
Util.shouldShowPlayButton
中的默认 UI 和通知行为,以便在播放暂时被抑制(例如,由于暂时性音频焦点丢失)时显示“播放”按钮。旧版行为可以通过使用PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
或MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
来保持(#11213)。 - 将
androidx.annotation:annotation-experimental
升级到1.3.1
以修复 https://issuetracker.google.com/251172715。 - 将
ExoPlayer.setAudioAttributes
移动到Player
接口。
- 向
- ExoPlayer
- 修复由于未能正确识别仅解码样本而导致的 AC4 流中的查找问题(#11000)。
- 添加对在不合适的音频输出设备(例如 Wear OS 设备上的内置扬声器)上抑制播放的支持,当此功能通过
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
启用时。如果播放时没有合适的音频输出设备,或者所有合适的输出设备在播放期间断开连接,则播放抑制原因将更新为Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
。当连接合适的输出设备时,抑制原因将被移除。 - 添加
MediaSource.canUpdateMediaItem
和MediaSource.updateMediaItem
,以接受在创建后通过Player.replaceMediaItem(s)
进行的MediaItem
更新。 - 允许通过
Player.replaceMediaItem(s)
更新库提供的所有MediaSource
类中的MediaItem
(#33, #9978)。 - 将
MimeTypes.TEXT_EXOPLAYER_CUES
重命名为MimeTypes.APPLICATION_MEDIA3_CUES
。 - 添加
PngExtractor
,它将整个 PNG 文件发送并读取到TrackOutput
中,作为一个样本。 - 增强
SequenceableLoader
接口中的SequenceableLoader.continueLoading(long)
方法,使其变为SequenceableLoader.continueLoading(LoadingInfo loadingInfo)
。LoadingInfo
包含附加参数,包括playbackSpeed
和lastRebufferRealtimeMs
,以及现有的playbackPositionUs
。 - 增强
ChunkSource
接口中的ChunkSource.getNextChunk(long, long, List, ChunkHolder)
方法,使其变为ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
。 - 在通用媒体客户端数据 (CMCD) 日志中添加附加字段:缓冲区饥饿 (
bs
)、截止时间 (dl
)、播放速率 (pr
) 和启动 (su
)(#8699)。 - 向
ColorInfo
添加亮度和色度位深度(#491)。 - 向通用媒体客户端数据 (CMCD) 日志中添加附加字段:下一个对象请求 (
nor
) 和下一个范围请求 (nrr
)(#8699)。 - 添加使用查询参数传输通用媒体客户端数据 (CMCD) 数据的功能(#553)。
- 修复
ExperimentalBandwidthMeter
中的ConcurrentModificationException
(#612)。 - 向
CompositeMediaSource.getMediaTimeForChildMediaTime
添加MediaPeriodId
参数。 - 在
ConcatenatingMediaSource2
中支持ClippingMediaSource
(以及其他带有周期/窗口时间偏移的源)(#11226)。 - 将
BaseRenderer.onStreamChanged()
更改为也接收MediaPeriodId
参数。
- Transformer
- 解析图像输入的 EXIF 旋转数据。
- 移除
TransformationRequest.HdrMode
注解类型及其相关常量。请改用Composition.HdrMode
及其相关常量。 - 简化
OverlaySettings
以修复旋转问题。 - 将
SampleConsumer.queueInputBitmap
的frameRate
和durationUs
参数更改为TimestampIterator
。
- 轨道选择
- 添加
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
以明确允许或禁止非无缝自适应。默认行为保持不变,即true
。
- 添加
- 提取器
- MPEG-TS:确保通过将流的最后一个访问单元传递到样本队列来渲染最后一帧(#7909)。
- 修复确定
rotationDegrees
时的拼写错误。将projectionPosePitch
更改为projectionPoseRoll
(#461)。 - 移除
Extractor
实例可以直接使用instanceof
检查的假设。如果您想在运行时访问Extractor
的实现细节,您必须首先调用Extractor.getUnderlyingInstance
。 - 添加
BmpExtractor
。 - 添加
WebpExtractor
。 - 添加
HeifExtractor
。 - 在
Mp4Extractor
中添加对 QuickTime classic 的支持。
- 音频
- 添加对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析 MP4 中
lpcm
的 PCM 编码。 - 添加对在 MP4 中提取 Vorbis 音频的支持。
- 添加
AudioSink.getFormatOffloadSupport(Format)
,它通过DefaultAudioOffloadSupportProvider
检索接收器可以为格式提供的卸载支持级别。它返回新的AudioOffloadSupport
,其中包含isFormatSupported
、isGaplessSupported
和isSpeedChangeSupported
。 - 添加
AudioSink.setOffloadMode()
,通过它配置音频接收器上的卸载配置。默认值为AudioSink.OFFLOAD_MODE_DISABLED
。 - 卸载可以通过
TrackSelectionParameters
中的setAudioOffloadPreference
启用。如果设置的偏好是启用,设备支持该格式的卸载,并且轨道选择是单个音频轨道,那么音频卸载将被启用。 - 如果
audioOffloadModePreference
设置为AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
,则DefaultTrackSelector
将仅选择音频轨道,并且仅当该轨道的格式在卸载中受支持时。如果卸载中不支持任何音频轨道,则不会选择任何轨道。 - 由于轨道转换后的播放位置问题,在 API 级别 33 之前禁用卸载的无缝支持。
- 移除
DefaultRenderersFactory.buildAudioSink
方法签名中的参数enableOffload
。 - 移除方法
DefaultAudioSink.Builder.setOffloadMode
。 - 移除 intdef 值
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
。 - 添加对卸载播放期间 Opus 无缝元数据的支持。
- 允许渲染器恢复,如果在首次写入时失败,则禁用卸载(#627)。
- 默认情况下,为仅音频卸载播放启用卸载调度。
- 删除
ExoPlayer.experimentalSetOffloadSchedulingEnabled
和AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
。 - 将
onExperimentalSleepingForOffloadChanged
重命名为onSleepingForOffloadChanged
,将onExperimentalOffloadedPlayback
重命名为onOffloadedPlayback
。 - 将与音频卸载模式相关的
TrackSelectionParameters
接口和定义移动到内部AudioOffloadPreferences
类。 - 向
AnalyticsListener
、AudioRendererEventListener
和AudioSink.Listener
添加onAudioTrackInitialized
和onAudioTrackReleased
回调。 - 修复 DTS Express 音频缓冲区下溢问题(#650)。
- 修复了 E-AC3-JOC 的功能检查抛出
IllegalArgumentException
的错误(#677)。
- 添加对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析 MP4 中
- 视频
- 允许
MediaCodecVideoRenderer
使用自定义的VideoFrameProcessor.Factory
。 - 修复了如果音频流以负时间戳开始,则无法渲染第一帧的错误(#291)。
- 允许
- 文本
- 移除
ExoplayerCuesDecoder
。现在,带有sampleMimeType = application/x-media3-cues
的文本轨道由TextRenderer
直接处理,无需SubtitleDecoder
实例。
- 移除
- 元数据
- 将不再为“仅解码”样本调用
MetadataDecoder.decode
,因为实现无论如何都必须返回 null。
- 将不再为“仅解码”样本调用
- 效果
- 添加
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
,按时间戳排队位图输入。 - 将
VideoFrameProcessor.registerInputStream()
更改为非阻塞。应用必须实现VideoFrameProcessor.Listener#onInputStreamRegistered()
。 - 将
VideoFrameProcessor.queueInputBitmap
的frameRate
和durationUs
参数更改为TimestampIterator
。
- 添加
- IMA 扩展
- 修复了播放列表中不是第一个项目的多时段 DASH 直播流可能抛出异常的错误(#571)。
- 在调用
AdsLoader.destroy()
之前释放 StreamManager - IMA SDK 版本更新至 3.31.0。
- 会话
- 在
DefaultMediaNotificationProvider
中将通知前台服务行为设置为FOREGROUND_SERVICE_IMMEDIATE
(#167)。 - 在 API 31 以上版本中,仅使用
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
以避免在三星设备上出现已弃用 API 的问题 (#167)。 - 使用媒体通知控制器作为代理来设置可用命令和用于填充通知和平台会话的自定义布局。
- 将通过
MediaSessionService.onStartCommand()
在 Media3 中收到的媒体按钮事件进行转换,而不是将它们路由到平台会话再路由回 Media3。这样,调用方控制器始终是媒体通知控制器,并且应用程序可以在所有支持的 API 级别上轻松识别来自通知的调用。 - 修复连接到旧版
MediaSessionCompat
时MediaController.getCurrentPosition()
不前进的错误。 - 添加
MediaLibrarySession.getSubscribedControllers(mediaId)
以提供便利。 - 覆盖
MediaLibrarySession.Callback.onSubscribe()
以断言控制器订阅的父 ID 的可用性。如果成功,则接受订阅并立即调用notifyChildrenChanged()
以通知浏览器 (#561)。 - 为 Automotive OS 添加会话演示模块,并为 Android Auto 启用会话演示。
- 当媒体通知控制器不支持
COMMAND_GET_TIMELINE
时,不设置框架会话的队列。由于 Android Auto 作为从框架会话读取的客户端控制器,这将导致 Android Auto UI 中的queue
按钮不显示 (#339)。 - 默认使用
DataSourceBitmapLoader
而不是SimpleBitmapLoader
(#271, #327)。 - 添加
MediaSession.Callback.onMediaButtonEvent(Intent)
,允许应用程序覆盖默认的媒体按钮事件处理。
- 在
- UI
- 为 Wear OS 设备添加了
Player.Listener
实现,该实现通过启动系统对话框处理由于Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
导致的播放抑制,以允许用户连接合适的音频输出(例如蓝牙耳机)。如果在可配置的超时(默认为 5 分钟)内连接了合适的设备,则侦听器将自动恢复播放。
- 为 Wear OS 设备添加了
- 下载
- 为
DownloadService
声明“数据同步”前台服务类型,以兼容 Android 14。使用此服务时,应用程序还需要在清单中将dataSync
添加为foregroundServiceType
并添加FOREGROUND_SERVICE_DATA_SYNC
权限 (#11239)。
- 为
- HLS 扩展
- 以从上次加载开始时间而不是上次加载完成时间计算的间隔刷新 HLS 直播播放列表 (#663)。
- DASH 扩展
- 允许段模板 URL 中存在多个相同的 DASH 标识符。
- 添加在提取过程中解析字幕的实验性支持。这更好地支持合并重叠字幕,包括解决字幕段之间切换时的闪烁问题。您可以使用
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
启用此功能 (#288)。
- RTSP 扩展
- 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
- 发布 MIDI 解码器模块,该模块支持使用 Jsyn 库合成音频来播放标准 MIDI 文件。
- 添加
DecoderOutputBuffer.shouldBeSkipped
以直接标记不需要呈现的输出缓冲区。这比将被弃用的C.BUFFER_FLAG_DECODE_ONLY
更受推荐。 - 添加
Decoder.setOutputStartTimeUs
和SimpleDecoder.isAtLeastOutputStartTimeUs
以允许解码器在开始时间之前丢弃仅解码样本。这应该优先于将被弃用的Buffer.isDecodeOnly
。 - 修复将 MIDI 解码器工件发布到 Maven 仓库的错误。该工件已重命名为
media3-exoplayer-midi
(#734)。
- Leanback 扩展
- 修复在 Leanback 代码中禁用 surface 可能导致
ArithmeticException
的错误 (#617)。
- 修复在 Leanback 代码中禁用 surface 可能导致
- 测试实用程序
- 使
TestExoPlayerBuilder
和FakeClock
兼容 Espresso UI 测试和 Compose UI 测试。这修复了在 Espresso 或 Compose 视图交互期间播放非确定性推进的错误。
- 使
- 删除已弃用符号
- 移除
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
和TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
。改用Composition.Builder.setHdrMode(int)
并将Composition
传递给Transformer.start(Composition, String)
。 - 移除已弃用的
DownloadNotificationHelper.buildProgressNotification
方法,请改用接受notMetRequirements
参数的非弃用方法。
- 移除
版本 1.2.0-rc01
2023 年 11 月 1 日
使用 1.2.0 稳定版本。
版本 1.2.0-beta01
2023 年 10 月 19 日
使用 1.2.0 稳定版本。
版本 1.2.0-alpha02
2023 年 9 月 29 日
使用 1.2.0 稳定版本。
版本 1.2.0-alpha01
2023 年 8 月 17 日
使用 1.2.0 稳定版本。
版本 1.1.0
版本 1.1.1
2023 年 8 月 16 日
- 通用库
- 从所有模块中移除意外添加的
multidex
依赖项 (#499)。
- 从所有模块中移除意外添加的
- ExoPlayer
- 修复
PlaybackStatsListener
中在播放列表清除后创建虚假PlaybackStats
的问题。 - 为通用媒体客户端数据 (CMCD) 日志记录添加更多字段:流格式 (sf)、流类型 (st)、版本 (v)、最高比特率 (tb)、对象持续时间 (d)、测量吞吐量 (mtp) 和对象类型 (ot) (#8699)。
- 修复
- 音频
- 修复播放非常短的文件时
Player.getState()
从未转换为STATE_ENDED
的错误 (#538)。
- 修复播放非常短的文件时
- 音频卸载
- 根据 RFC 7845,在卸载 Opus 播放的比特流前添加 Ogg ID Header 和 Comment Header Pages。
- 视频
- H.265/HEVC:修复 SPS 短期和长期参考图片信息解析。
- 文本
- CEA-608:更改字幕截断逻辑,仅考虑可见文本。以前,在将字幕长度限制为 32 个字符时(按规范技术上是正确的)会包含缩进和制表符偏移 (#11019)。
- IMA 扩展
- IMA SDK 版本更新至 3.30.3。
- 会话
- 将自定义布局添加到控制器的状态并提供 getter 以访问它。当自定义布局更改时,将调用
MediaController.Listener.onCustomLayoutChanged
。希望向不同 Media3 控制器发送不同自定义布局的应用程序可以在MediaSession.Callback.onConnect
中通过使用AcceptedResultBuilder
来确保自定义布局在连接完成时对控制器可用。 - 修复
MediaLibraryServiceLegacyStub
向不支持此功能的Result
发送错误,从而产生UnsupportedOperationException
的情况 (#78)。 - 修复
PlayerWrapper
通过传统命令 (COMMAND_ADJUST_DEVICE_VOLUME
和COMMAND_SET_DEVICE_VOLUME
) 和新命令 (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
和COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) 确定volumeControlType
来创建VolumeProviderCompat
的方式 (#554)。
- 将自定义布局添加到控制器的状态并提供 getter 以访问它。当自定义布局更改时,将调用
版本 1.1.0
2023 年 7 月 5 日
- 通用库
- 添加不合适音频路由的抑制原因和抑制时间过长的播放准备就绪更改原因。(#15)。
- 向 Player 添加命令
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- 向 Player 添加重载方法,允许用户指定音量标志
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- 为
DeviceInfo
添加Builder
并弃用现有构造函数。 - 添加
DeviceInfo.routingControllerId
以指定远程播放的路由控制器 ID。 - 添加
Player.replaceMediaItem(s)
作为在相同位置添加和移除项目的快捷方式 (#8046)。
- ExoPlayer
- 仅当明确选择时,才允许 ExoPlayer 控制设备音量方法。使用
ExoPlayer.Builder.setDeviceVolumeControlEnabled
来访问getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
和setDeviceVolume(int, int)
increaseDeviceVolume(int)
和increaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
和decreaseDeviceVolume(int, int)
- 添加
FilteringMediaSource
,允许从MediaSource
过滤可用轨道类型。 - 添加对在 DASH、HLS 和 SmoothStreaming 等自适应流格式的传出请求中包含通用媒体客户端数据 (CMCD) 的支持。已包含以下字段:
br
、bl
、cid
、rtp
和sid
(#8699)。API 结构和 API 方法- CMCD 日志记录默认禁用,使用
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
启用它。 - 默认情况下,所有密钥都启用,覆盖
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
以过滤掉要记录的密钥。 - 覆盖
CmcdConfiguration.RequestConfig.getCustomData()
以启用自定义密钥日志记录。
- CMCD 日志记录默认禁用,使用
- 在主演示的清单中添加额外的操作,以便更轻松地使用自定义
*.exolist.json
文件启动演示应用程序 (#439)。 - 添加
ExoPlayer.setVideoEffects()
用于视频播放期间使用Effect
。 - 更新
SampleQueue
以将sourceId
存储为long
而不是int
。这会更改公共方法SampleQueue.sourceId
和SampleQueue.peekSourceId
的签名。 - 向
LoadControl
方法shouldStartPlayback
和onTracksSelected
添加参数,允许将这些方法与相关的MediaPeriod
关联。 - 更改
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
的签名,通过添加一个时间线参数,该参数包含以映射中用作键的 UID 的周期。这对于避免多周期直播流的并发问题是必需的。 - 弃用
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
和BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
。可以改为调用不带mediaTimeOffsetUs
的方法变体。请注意,即使对于已弃用的变体,偏移量也不再添加到调度程序调度的MediaLoadData
对象的startTimeUs
和endTimeUs
中。 - 将
ExoTrackSelection.blacklist
重命名为excludeTrack
,将isBlacklisted
重命名为isTrackExcluded
。 - 修复在空播放列表上调用
ExoPlayer.setMediaItem(s)
和addMediaItem(s)
时行为不一致的错误。
- 仅当明确选择时,才允许 ExoPlayer 控制设备音量方法。使用
- Transformer
- 移除
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
。改用ExoPlayerAssetLoader.Factory(MediaSource.Factory)
和Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
。 - 移除
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
。 - 修复了一个错误,即如果视频流的末尾在输入帧等待处理时发出信号,则转换可能会卡住(导致混音器超时)。
- 通过
MediaCodecList
查询编解码器,而不是使用findDecoder/EncoderForFormat
实用程序,以扩展支持。 - 移除
DefaultEncoderFactory
中的 B 帧配置,因为它在某些设备上不起作用。
- 移除
- 轨道选择
- 添加
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
,默认禁用。启用后,当渲染器功能更改时,DefaultTrackSelector
将触发新的轨道选择。
- 添加
- 提取器
- 音频
- 修复启用隧道且
AudioProcessors
处于活动状态时(例如用于无间隙修剪)某些播放失败的错误 (#10847)。 - 在直接播放 (offload) 中将 Opus 帧封装在 Ogg 数据包中。
- 通过卸载调度在睡眠期间推断当前位置。
- 添加
Renderer.release()
和AudioSink.release()
以在播放器生命周期结束时释放资源。 - 监听
DefaultAudioSink
中的音频功能更改。在DefaultAudioSink
的构造函数中添加了一个必需参数context
,DefaultAudioSink
将使用它注册为AudioCapabilitiesReceiver
的侦听器,并在收到功能更改通知时更新其audioCapabilities
属性。 - 通过
AudioSink.Listener
接口中的新事件onAudioCapabilitiesChanged
和触发onRendererCapabilitiesChanged
事件的新接口RendererCapabilities.Listener
传播音频功能更改。 - 添加
ChannelMixingAudioProcessor
以将缩放/混合应用于音频通道。 - 向
DecoderDiscardReasons
添加新的 int 值DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
,以便在音频功能更改后可能进入旁路模式时丢弃音频解码器。 - 添加对 DTS Express 和 DTS:X 的直接播放支持 (#335)。
- 修复启用隧道且
- 视频
- 当渲染器禁用时,使
MediaCodecVideoRenderer
报告宽度和高度为 0 的VideoSize
。当Player.getVideoSize()
更改时,Player.Listener.onVideoSizeChanged
会相应地被调用。通过此更改,当Player.getCurrentTracks
不支持视频,或支持的视频轨道的大小尚未确定时,ExoPlayer 使用MediaCodecVideoRenderer
时的视频大小的宽度和高度为 0。
- 当渲染器禁用时,使
- DRM
- 降低
DefaultDrmSession
上几个仅供内部使用的方法的可见性,这些方法不应从 DRM 包外部调用。void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- 降低
- 混音器
- 添加一个新的混音器库,可用于创建 MP4 容器文件。
- IMA 扩展
- 为 DAI 启用多周期直播 DASH 流。请注意,当前实现尚不支持直播流中的查找 (#10912)。
- 修复了由于连续时间线中计算出的内容位置略有不同,导致在直播流中插入新广告组的错误。
- 会话
- 添加辅助方法
MediaSession.getControllerForCurrentRequest
以获取有关当前调用Player
方法的控制器的信息。 - 添加
androidx.media3.session.MediaButtonReceiver
,使应用程序能够通过蓝牙耳机等发送的媒体按钮事件实现播放恢复 (#167)。 - 向
MediaSession.Callback.onAddMediaItems
添加默认实现,以允许将请求的MediaItems
传递给Player
,如果它们具有LocalConfiguration
(例如 URI)(#282)。 - 默认情况下,在 Android 12 及以下版本的紧凑媒体通知视图上添加“快进”和“快退”命令按钮 (#410)。
- 向
MediaSession.Callback.onAddMediaItems
添加默认实现,以允许将请求的MediaItems
传递给Player
,如果它们具有LocalConfiguration
(例如 URI)(#282)。 - 默认情况下,在 Android 12 及以下版本的紧凑媒体通知视图上添加“快进”和“快退”命令按钮 (#410)。
- 添加辅助方法
- UI
- 添加 Util 方法
shouldShowPlayButton
和handlePlayPauseButtonAction
以使用播放/暂停按钮编写自定义 UI 元素。
- 添加 Util 方法
- RTSP 扩展
- DASH 扩展
- 从多周期 DASH 流的
MediaLoadData.startTimeMs
和MediaLoadData.endTimeMs
中移除媒体时间偏移。 - 修复重新准备多周期直播 Dash 媒体源时产生
IndexOutOfBoundsException
的错误 (#10838)。
- 从多周期 DASH 流的
- HLS 扩展
- 添加
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
以设置加载线程等待TimestampAdjuster
初始化的超时。如果初始化在超时前未完成,则会抛出PlaybackException
以避免播放无限期停滞。默认情况下,超时设置为零 (#323)。
- 添加
- 测试实用程序
- 在
DataSourceContractTest
中检查 URI 方案大小写不敏感性。
- 在
- 删除已弃用符号
- 移除
DefaultAudioSink
构造函数,改用DefaultAudioSink.Builder
。 - 移除
HlsMasterPlaylist
,改用HlsMultivariantPlaylist
。 - 移除
Player.stop(boolean)
。改用Player.stop()
和Player.clearMediaItems()
(如果reset
为true
)。 - 移除两个已弃用的
SimpleCache
构造函数,改用接受DatabaseProvider
的非弃用构造函数以获得更好的性能。 - 移除
DefaultBandwidthMeter
构造函数,改用DefaultBandwidthMeter.Builder
。 - 移除
DefaultDrmSessionManager
构造函数,改用DefaultDrmSessionManager.Builder
。 - 移除两个已弃用的
HttpDataSource.InvalidResponseCodeException
构造函数,改用接受附加字段(cause
、responseBody
)的非弃用构造函数以增强错误日志记录。 - 移除
DownloadHelper.forProgressive
、DownloadHelper.forHls
、DownloadHelper.forDash
和DownloadHelper.forSmoothStreaming
,改用DownloadHelper.forMediaItem
。 - 移除已弃用的
DownloadService
构造函数,改用包含提供channelDescriptionResourceId
参数选项的非弃用构造函数。 - 移除已弃用的 Charsets 字符串常量(
ASCII_NAME
、UTF8_NAME
、ISO88591_NAME
、UTF16_NAME
和UTF16LE_NAME
),改用kotlin.text
包中的 Kotlin Charsets、java.nio.charset.StandardCharsets
或com.google.common.base.Charsets
。 - 移除已弃用的
WorkManagerScheduler
构造函数,改用包含提供Context
参数选项的非弃用构造函数。 - 移除已弃用的方法
createVideoSampleFormat
、createAudioSampleFormat
、createContainerFormat
和createSampleFormat
,这些方法用于实例化Format
类。改用Format.Builder
创建Format
实例。 - 移除已弃用的方法
copyWithMaxInputSize
、copyWithSubsampleOffsetUs
、copyWithLabel
、copyWithManifestFormatInfo
、copyWithGaplessInfo
、copyWithFrameRate
、copyWithDrmInitData
、copyWithMetadata
、copyWithBitrate
和copyWithVideoSize
,改用Format.buildUpon()
和 setter 方法。 - 移除已弃用的
ExoPlayer.retry()
,改用prepare()
。 - 移除已弃用的零参数
DefaultTrackSelector
构造函数,改用DefaultTrackSelector(Context)
。 - 移除已弃用的
OfflineLicenseHelper
构造函数,改用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
。 - 移除已弃用的
DownloadManager
构造函数,改用接受Executor
的构造函数。 - 移除已弃用的
Cue
构造函数,改用Cue.Builder
。 - 移除已弃用的
OfflineLicenseHelper
构造函数,改用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
。 - 移除四个已弃用的
AnalyticsListener
方法onDecoderEnabled
,改用onAudioEnabled
和/或onVideoEnabled
。onDecoderInitialized
,改用onAudioDecoderInitialized
和/或onVideoDecoderInitialized
。onDecoderInputFormatChanged
,改用onAudioInputFormatChanged
和/或onVideoInputFormatChanged
。onDecoderDisabled
,改用onAudioDisabled
和/或onVideoDisabled
。
- 移除已弃用的
Player.Listener.onSeekProcessed
和AnalyticsListener.onSeekProcessed
,改用onPositionDiscontinuity
配合DISCONTINUITY_REASON_SEEK
。 - 移除
ExoPlayer.setHandleWakeLock(boolean)
,改用setWakeMode(int)
。 - 移除已弃用的
DefaultLoadControl.Builder.createDefaultLoadControl()
,改用build()
。 - 移除已弃用的
MediaItem.PlaybackProperties
,改用MediaItem.LocalConfiguration
。已弃用的字段MediaItem.playbackProperties
现在是MediaItem.LocalConfiguration
类型。
- 移除
版本 1.1.0-rc01
2023 年 6 月 21 日
使用 1.1.0 稳定版本。
版本 1.1.0-beta01
2023 年 6 月 7 日
使用 1.1.0 稳定版本。
版本 1.1.0-alpha01
2023 年 5 月 10 日
使用 1.1.0 稳定版本。
版本 1.0.0
版本 1.0.2
2023 年 5 月 18 日
androidx.media3:media3-*:1.0.2
已发布。版本 1.0.2 包含这些提交。
此版本对应于 ExoPlayer 2.18.7 版本。
此版本包含自 1.0.1 版本以来的以下更改
- 核心库
- 添加
Buffer.isLastSample()
,表示Buffer
是否包含标志C.BUFFER_FLAG_LAST_SAMPLE
。 - 修复了如果最后一个包含帧的样本在未读取“流结束”样本的情况下出队,则最后一个帧可能无法呈现的问题。(#11079)。
- 添加
- 提取器
- 通过重用 RTSP 和 MP4 提取器已使用的解析逻辑来修复 MPEG-TS 文件中 H.265 SPS 的解析 (#303)。
- 文本
- SSA:如果 UTF-16 文件以字节顺序标记开头,则添加对其的支持 (#319)。
- 会话
- 修复了
MediaController
在连接到更新其动作的旧版MediaSessionCompat
时不更新其可用命令的问题。 - 修复了在 API 30 上,当系统 UI 调用
Callback.onGetLibraryRoot
且params.isRecent == true
时,MediaLibraryService
无法返回 null 的错误 (#355)。 - 修复
MediaSessionService
或MediaLibraryService
的内存泄漏 (#346)。 - 修复了
MediaSession
中合并的Timeline
和位置更新可能导致MediaController
抛出IllegalStateException
的错误。
- 修复了
版本 1.0.1
2023 年 4 月 18 日
androidx.media3:media3-*:1.0.1
已发布。版本 1.0.1 包含这些提交。
此版本对应于 ExoPlayer 2.18.6 版本。
- 核心库
- 在跳转到默认位置时重置目标直播流覆盖 (#11051)。
- 修复了媒体中空样本流可能导致播放卡住的错误。
- 会话
- 修复了旧版
MediaSessionCompat
发布多个相同队列项导致MediaController
中出现异常的错误 (#290)。 - 添加了缺少将
MediaSession.broadcastCustomCommand
转发到旧版MediaControllerCompat.Callback.onSessionEvent
的功能 (#293)。 - 修复了调用
MediaSession.setPlayer
不会更新可用命令的错误。 - 修复了如果
MediaController
发送的TrackSelectionOverride
实例引用具有Format.metadata
的组,则会被忽略的问题 (#296)。 - 修复了需要
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
才能通过旧版MediaSessionCompat
访问元数据的问题。 - 修复了在后台线程上使用
MediaSession
实例在MediaSessionService
中导致崩溃的问题 (#318)。 - 修复了库在应用程序未意图的情况下声明媒体按钮接收器的问题 (#314)。
- 修复了旧版
- DASH
- 修复空段时间线的处理 (#11014)。
- RTSP
- 如果 RTSP Setup 与 UDP 失败并出现 RTSP 错误 461 UnsupportedTransport,则使用 TCP 重试 (#11069)。
版本 1.0.0
2023 年 3 月 22 日
androidx.media3:media3-*:1.0.0
已发布。版本 1.0.0 包含这些提交。
此版本对应于 ExoPlayer 2.18.5 版本。
自 1.0.0-rc02 以来没有变化。
版本 1.0.0-rc02
2023 年 3 月 2 日
androidx.media3:media3-*:1.0.0-rc02
已发布。版本 1.0.0-rc02 包含这些提交。
此版本对应于 ExoPlayer 2.18.4 版本。
- 核心库
- 下载
- 使
SegmentDownloader
及其子类中两个段的开始时间的最大差异可配置 (#248)。
- 使
- 音频
- 视频
- 将 HEVC HDR10 格式映射到
HEVCProfileMain10HDR10
而不是HEVCProfileMain10
。 - 添加了针对 Chromecast with Google TV 和 Lenovo M10 FHD Plus 设备问题的临时修复,该问题导致 60fps AVC 流被标记为不支持 (#10898)。
- 修复播放帧率远高于屏幕刷新率的媒体时帧释放性能问题。
- 将 HEVC HDR10 格式映射到
- 投射
- 修复媒体项目之间转换时的瞬时
STATE_IDLE
(#245)。
- 修复媒体项目之间转换时的瞬时
- RTSP
- 捕获在解析无效 RTSP Describe 响应消息时抛出的 IllegalArgumentException (#10971)。
- 会话
- 修复通知播放/暂停按钮未随播放器状态更新的错误 (#192)。
- IMA 扩展
- 修复了 DAI 流未包含任何广告时无法启动的错误,因为第一个(在没有广告的情况下是唯一的)
LOADED
事件未收到。
- 修复了 DAI 流未包含任何广告时无法启动的错误,因为第一个(在没有广告的情况下是唯一的)
版本 1.0.0-rc01
2023 年 2 月 16 日
androidx.media3:media3-*:1.0.0-rc01
已发布。版本 1.0.0-rc01 包含这些提交。
此版本对应于 ExoPlayer 2.18.3 版本。
- 核心库
- 调整渲染器的解码器排序逻辑,以支持
MediaCodecSelector
的偏好,即使解码器报告可能无法高效播放媒体。例如,在默认选择器中,具有功能支持的硬件解码器将优先于完全支持该格式的软件解码器 (#10604)。 - 添加
ExoPlayer.Builder.setPlaybackLooper
,用于为新的 ExoPlayer 实例设置现有的播放线程。 - 允许清除下载管理器辅助程序 (#10776)。
- 向
BasePlayer.seekTo
添加参数,以指示用于查找的命令。 - 在 API 21+ 上加载可绘制对象时使用主题 (#220)。
- 添加
ConcatenatingMediaSource2
,允许将多个媒体项目组合到一个窗口中 (#247)。
- 调整渲染器的解码器排序逻辑,以支持
- 提取器
- 如果样本表 (stbl) 在解析 trak atom 时缺少所需的样本描述 (stsd),则抛出
ParserException
而不是NullPointerException
。 - 在 fMP4 中直接查找同步帧时正确跳过样本 (#10941)。
- 如果样本表 (stbl) 在解析 trak atom 时缺少所需的样本描述 (stsd),则抛出
- 音频
- 在直接播放 (passthrough) 中使用压缩音频格式比特率计算
AudioTrack
的最小缓冲区大小。
- 在直接播放 (passthrough) 中使用压缩音频格式比特率计算
- 文本
- 修复
TextRenderer
在字幕文件中不包含提示时将无效(负)索引传递给Subtitle.getEventTime
的问题。 - SubRip:如果 UTF-16 文件以字节顺序标记开头,则添加对其的支持。
- 修复
- 元数据
- 解析 ID3 帧中多个以 null 分隔的值,ID3 v2.4 允许这样做。
- 添加
MediaMetadata.mediaType
以表示内容类型或元数据描述的文件夹类型。 - 添加
MediaMetadata.isBrowsable
作为MediaMetadata.folderType
的替代。文件夹类型将在下一版本中弃用。
- DASH
- 添加图像适应集的完整解析,包括瓦片计数 (#3752)。
- UI
- 会话
- 添加抽象
SimpleBasePlayer
以帮助实现自定义播放器的Player
接口。 - 添加辅助方法以将平台会话令牌转换为 Media3
SessionToken
(#171)。 - 使用
onMediaMetadataChanged
触发平台媒体会话的更新 (#219)。 - 将媒体会话添加为
DefaultMediaNotificationProvider
的getMediaButtons()
的参数,并使用不可变列表以增加清晰度 (#216)。 - 添加
onSetMediaItems
回调侦听器,以提供在设置到 Player 之前修改/设置MediaItem
列表、起始索引和位置的方法 (#156)。 - 避免对非蓝牙媒体按钮事件进行双击检测 (#233)。
- 使
QueueTimeline
在阴暗的旧版会话状态下更健壮 (#241)。
- 添加抽象
- 元数据
- 解析 ID3 帧中多个以 null 分隔的值,ID3 v2.4 允许这样做。
- 添加
MediaMetadata.mediaType
以表示内容类型或元数据描述的文件夹类型。 - 添加
MediaMetadata.isBrowsable
作为MediaMetadata.folderType
的替代。文件夹类型将在下一版本中弃用。
- Cast 扩展
- 将 Cast SDK 版本更新至 21.2.0。
- IMA 扩展
- 移除应用程序线程上
ImaServerSideAdInsertionMediaSource
的播放器侦听器,以避免线程问题。 - 向
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder
添加属性focusSkipButtonWhenAvailable
,以请求在电视设备上聚焦跳过按钮并将其默认设置为 true。 - 向
ImaServerSideAdInsertionMediaSource.AdsLoader
添加方法focusSkipButton()
,以编程方式请求聚焦跳过按钮。 - IMA SDK 版本更新至 3.29.0。
- 移除应用程序线程上
- 演示应用
- 在运行时请求下载通知的通知权限 (#10884)。
版本 1.0.0-beta03
2022 年 11 月 22 日
androidx.media3:media3-*:1.0.0-beta03
已发布。版本 1.0.0-beta03 包含这些提交。
此版本对应于 ExoPlayer 2.18.2 版本。
- 核心库
- 添加
ExoPlayer.isTunnelingEnabled
以检查当前选定轨道是否启用了隧道传输 (#2518)。 - 添加
WrappingMediaSource
以简化包装单个MediaSource
(#7279)。 - 在播放因可用内存不足而卡住之前丢弃后备缓冲区。
- 启用卸载时关闭 Tracing“doSomeWork”块。
- 修复
PlaybackStatsListener
中快速查找导致的会话跟踪问题 (#180)。 - 在单项播放列表中调用
seekToNext
或seekToPrevious
时发送缺少的onMediaItemTransition
回调 (#10667)。 - 添加
Player.getSurfaceSize
,返回渲染视频的 surface 大小。 - 修复在播放器释放期间移除侦听器可能导致
IllegalStateException
的错误 (#10758)。
- 添加
- 构建
- 强制执行最低
compileSdkVersion
以避免编译错误 (#10684)。 - 避免在包含在另一个 gradle 构建中时发布块。
- 强制执行最低
- 轨道选择
- 如果显示器不支持,则优先选择其他轨道而不是杜比视界。(#8944)。
- 下载
- 视频
- 如果显示器不支持,则尝试使用杜比视界的替代解码器。(#9794)。
- 音频
- 使用
SingleThreadExecutor
释放AudioTrack
实例,以避免同时释放多个播放器时出现内存不足错误 (#10057)。 - 为 AudioTrack 卸载状态添加
AudioOffloadListener.onExperimentalOffloadedPlayback
。(#134)。 - 将
AudioTrackBufferSizeProvider
设为公共接口。 - 添加
ExoPlayer.setPreferredAudioDevice
以设置首选音频输出设备 (#135)。 - 将
androidx.media3.exoplayer.audio.AudioProcessor
重命名为androidx.media3.common.audio.AudioProcessor
。 - 在所有 Android 版本上,将 8 声道和 12 声道音频分别映射到 7.1 和 7.1.4 声道掩码 (#10701)。
- 使用
- 元数据
MetadataRenderer
现在可以配置为在元数据可用后立即渲染。使用MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
创建实例,以指定渲染器是提前输出元数据还是与播放器位置同步输出。
- DRM
- 解决 Android 13 ClearKey 实现中的一个错误,该错误返回一个非空但无效的许可证 URL。
- 修复在播放列表中切换 DRM 方案(例如 Widevine 到 ClearKey)时
setMediaDrmSession failed: session not opened
错误。
- 文本
- CEA-608:确保正确处理字段 2 上的服务切换命令 (#10666)。
- DASH
- 从清单中解析
EventStream.presentationTimeOffset
(#10460)。
- 从清单中解析
- UI
- 使用播放器的当前覆盖作为
TrackSelectionDialogBuilder
中的预设 (#10429)。
- 使用播放器的当前覆盖作为
- 会话
- 确保命令始终按正确顺序执行,即使某些命令需要异步解析 (#85)。
- 添加
DefaultMediaNotificationProvider.Builder
以构建DefaultMediaNotificationProvider
实例。构建器可以配置提供程序使用的通知 ID、通知通道 ID 和通知通道名称。此外,添加方法DefaultMediaNotificationProvider.setSmallIcon(int)
以设置通知的小图标。(#104)。 - 确保在
MediaController.release()
之前发送的命令不会被丢弃 (#99)。 SimpleBitmapLoader
可以从file://
URI 加载位图 (#108)。- 修复阻止
MediaController
在一个周期内跳过广告的断言 (#122)。 - 播放结束后,
MediaSessionService
从前台停止,并显示通知以重新开始播放上次播放的媒体项目 (#112)。 - 不要使用暂停的 pending intent 启动前台服务 (#167)。
- 在 API 26 和 API 27 上手动隐藏与
DefaultNotificationProvider
创建的通知关联的“徽章”(徽章在 API 28+ 上自动隐藏)(#131)。 - 修复了旧版 MediaSession 到 Media3 MediaController 的第二次 binder 连接导致 IllegalStateExceptions 的错误 (#49)。
- RTSP
- IMA
- FFmpeg 扩展
- 添加新必需的标志,以将 FFmpeg 库与 NDK 23.1.7779620 及更高版本链接 (#9933)。
- AV1 扩展
- 更新 CMake 版本以避免与最新 Android Studio 版本不兼容 (#9933)。
- Cast 扩展
- 实现
getDeviceInfo()
,以便在使用MediaController
控制播放时能够识别CastPlayer
(#142)。
- 实现
- Transformer
- 添加 muxer 看门狗计时器,以检测生成输出样本是否过慢。
- 删除已弃用符号
- 移除
Transformer.Builder.setOutputMimeType(String)
。此功能已移除。当使用默认 muxer 时,MIME 类型将始终为 MP4。
- 移除
版本 1.0.0-beta02
2022 年 7 月 21 日
androidx.media3:media3-*:1.0.0-beta02
已发布。版本 1.0.0-beta02 包含这些提交。
此版本对应于 ExoPlayer 2.18.1 版本。
- 核心库
- 提取器
- DASH
- 从清单中解析 ClearKey 许可证 URL (#10246)。
- UI
- 确保 TalkBack 宣布播放控件菜单中当前活动的播放速度选项 (#10298)。
- RTSP
- 添加 VP8 分片数据包处理 (#110)。
- Leanback 扩展
- 监听
LeanbackAdapter
中的playWhenReady
更改 (10420)。
- 监听
- 投射
版本 1.0.0-beta01
2022 年 6 月 16 日
androidx.media3:media3-*:1.0.0-beta01
已发布。版本 1.0.0-beta01 包含这些提交。
这对应于 ExoPlayer 2.18.0 版本。
- 核心库
- 通过
MediaMetricsManager
启用对 Android 平台诊断的支持。ExoPlayer 会将播放事件和性能数据转发到平台,这有助于在设备上提供系统性能和调试信息。如果设备用户启用了共享使用情况和诊断数据,Google 也可能会收集这些数据。应用程序可以使用ExoPlayer.Builder.setUsePlatformDiagnostics(false)
选择不为 ExoPlayer 贡献平台诊断数据。 - 修复使用
MergingMediaSource
时轨道重置过于频繁的错误,例如在侧载字幕并中途更改选定字幕时 (#10248)。 - 停止在 API 29 和 30 上检测 5G-NSA 网络类型。这些播放将假定为 4G 网络。
- 不允许向
MediaSource.Factory.setDrmSessionManagerProvider
和MediaSource.Factory.setLoadErrorHandlingPolicy
传递null
。如果需要,可以显式传递DefaultDrmSessionManagerProvider
和DefaultLoadErrorHandlingPolicy
的实例。 - 添加
MediaItem.RequestMetadata
以表示当确切的LocalConfiguration
未知时播放媒体所需的元数据。还移除了MediaMetadata.mediaUrl
,因为它现在包含在RequestMetadata
中。 - 添加
Player.Command.COMMAND_SET_MEDIA_ITEM
以允许播放器设置单个项目。
- 通过
- 轨道选择
- 将
TrackSelectionOverrides
类扁平化为TrackSelectionParameters
,并将TrackSelectionOverride
提升为顶级类。 - 将
TracksInfo
重命名为Tracks
,将TracksInfo.TrackGroupInfo
重命名为Tracks.Group
。Player.getCurrentTracksInfo
和Player.Listener.onTracksInfoChanged
也已重命名为Player.getCurrentTracks
和Player.Listener.onTracksChanged
。这包括“取消弃用”Player.Listener.onTracksChanged
方法名,但参数类型不同。 - 将
DefaultTrackSelector.buildUponParameters
和DefaultTrackSelector.Parameters.buildUpon
的返回类型更改为DefaultTrackSelector.Parameters.Builder
,而不是已弃用的DefaultTrackSelector.ParametersBuilder
。 - 添加
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
,默认启用。启用后,DefaultTrackSelector
将优先选择声道数不超过设备输出功能的音频轨道。在手持设备上,DefaultTrackSelector
将优先选择立体声/单声道而不是多声道音频格式,除非多声道格式可以空间化(Android 12L+)或为杜比环绕声格式。此外,在支持音频空间化的设备上,DefaultTrackSelector
将监视 Spatializer 属性的更改并触发新的轨道选择。具有television
UI 模式的设备不受这些限制,并且将优先选择声道数最高的格式。要启用此功能,必须使用Context
构造DefaultTrackSelector
实例。
- 将
- 视频
- 将
DummySurface
重命名为PlaceholderSurface
。 - 将 AV1 支持添加到
MediaCodecVideoRenderer.getCodecMaxInputSize
。
- 将
- 音频
- 使用 LG AC3 音频解码器,该解码器宣传非标准 MIME 类型。
- 将
AudioAttributes.getAudioAttributesV21()
的返回类型从android.media.AudioAttributes
更改为新的AudioAttributesV21
包装类,以防止 API < 21 上的 ART 验证速度缓慢。 - 当格式音频声道数未设置时(HLS 无块准备时发生),查询平台 (API 29+) 或假定音频直通的音频编码声道数 (10204)。
- 如果解码器输出 12 声道 PCM 音频,则使用声道掩码
AudioFormat.CHANNEL_OUT_7POINT1POINT4
配置AudioTrack
(#10322)。
- DRM
- 确保在格式更改后立即查找时,DRM 会话始终正确更新 (10274)。
- 文本
- 将
Player.getCurrentCues()
更改为返回CueGroup
而不是List<Cue>
。 - SSA:支持
OutlineColour
样式设置,当BorderStyle == 3
时(即OutlineColour
设置提示的背景)(#8435)。 - CEA-708:将数据解析为多个服务块,并忽略与当前选定服务号无关的块。
- 移除
RawCcExtractor
,该提取器仅用于处理 Google 内部字幕格式。
- 将
- 提取器
- UI
- 修复了在
useController=false
的情况下,PlayerView
上设置的OnClickListener
的事件传递问题 (#9605)。还修复了所有视图配置的OnLongClickListener
的事件传递问题。 - 修复了将一系列触摸事件在
ACTION_UP
之前超出PlayerView
边界错误地视为点击的问题 (#9861)。 - 修复了
PlayerView
辅助功能问题,即点击可能切换播放而不是隐藏控件 (#8627)。 - 重写
TrackSelectionView
和TrackSelectionDialogBuilder
,使其使用Player
接口而不是ExoPlayer
。这允许视图与其他Player
实现一起使用,并移除了 UI 模块对 ExoPlayer 模块的依赖。这是一个破坏性更改。 - 不在
PlayerView
轨道选择器中显示强制文本轨道,如果选择了“无”,则保持选中合适的强制文本轨道 (#9432)。
- 修复了在
- DASH
- 从 DTS
AudioChannelConfiguration
元素中解析声道计数。这重新启用了 DTS 流的音频直通 (#10159)。 - 不允许向
DashMediaSource.Factory.setCompositeSequenceableLoaderFactory
传递null
。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory
的实例。
- 从 DTS
- HLS
- 如果播放列表 CODECS 属性不包含音频编解码器,则回退到无块准备 (#10065)。
- 不允许向
HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
、HlsMediaSource.Factory.setPlaylistParserFactory
和HlsMediaSource.Factory.setPlaylistTrackerFactory
传递null
。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory
、DefaultHlsPlaylistParserFactory
的实例或DefaultHlsPlaylistTracker.FACTORY
的引用。
- 平滑流式传输
- 不允许向
SsMediaSource.Factory.setCompositeSequenceableLoaderFactory
传递null
。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory
的实例。
- 不允许向
- RTSP
- 为 H263 添加 RTP 阅读器 (#63)。
- 为 MPEG4 添加 RTP 阅读器 (#35)。
- 为 HEVC 添加 RTP 阅读器 (#36)。
- 为 AMR 添加 RTP 阅读器。目前仅支持单声道、非交错 AMR 流。不支持复合 AMR RTP 有效负载。(#46)
- 为 VP8 添加 RTP 阅读器 (#47)。
- 为 WAV 添加 RTP 阅读器 (#56)。
- 修复 RTSP 基本授权头。(#9544)。
- 停止检查强制 SDP 字段,因为 ExoPlayer 不需要它们 (#10049)。
- 解析 RTSP 计时时抛出受检异常 (#10165)。
- 为 VP9 添加 RTP 阅读器 (#47)。
- 为 OPUS 添加 RTP 阅读器 (#53)。
- 数据源
- 将
DummyDataSource
重命名为PlaceholderDataSource
。 - 解决 OkHttp 中断处理。
- 将
- 会话
- 用
MediaSession.Callback.onAddMediaItems
替换MediaSession.MediaItemFiller
,以允许异步解析请求。 - 当
MediaController
连接到旧版媒体会话时,支持setMediaItems(s)
方法。 - 移除
MediaController.setMediaUri
和MediaSession.Callback.onSetMediaUri
。同样的功能可以通过使用MediaController.setMediaItem
和MediaSession.Callback.onAddMediaItems
来实现。 - 将旧版
MediaController
播放媒体的调用转发到MediaSession.Callback.onAddMediaItems
而不是onSetMediaUri
。 - 添加
MediaNotification.Provider
和DefaultMediaNotificationProvider
以提供通知的自定义。 - 添加
BitmapLoader
和SimpleBitmapLoader
用于下载艺术品图像。 - 添加
MediaSession.setCustomLayout()
以提供与旧版会话的向后兼容性。 - 添加
MediaSession.setSessionExtras()
以提供与旧版会话的功能对等性。 - 将
MediaSession.MediaSessionCallback
重命名为MediaSession.Callback
,将MediaLibrarySession.MediaLibrarySessionCallback
重命名为MediaLibrarySession.Callback
,并将MediaSession.Builder.setSessionCallback
重命名为setCallback
。 - 修复
MediaControllerImplLegacy
中的 NPE (#59)。 - 在时间线更改时更新会话位置信息 (#51)。
- 修复释放控制器后
MediaControllerImplBase
中的 NPE (#74)。
- 用
- 广告播放/IMA
- 将广告轮询频率从每 100ms 降低到每 200ms,以符合媒体评级委员会 (MRC) 的建议。
- FFmpeg 扩展
- 更新 CMake 版本到
3.21.0+
,以避免导致 AndroidStudio 的 gradle 同步失败的 CMake 错误 (#9933)。
- 更新 CMake 版本到
- 删除已弃用符号
- 移除
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
。改用Player.Listener.onTracksChanged(Tracks)
。 - 移除
Player.getCurrentTrackGroups
和Player.getCurrentTrackSelections
。改用Player.getCurrentTracks
。您也可以继续使用ExoPlayer.getCurrentTrackGroups
和ExoPlayer.getCurrentTrackSelections
,尽管这些方法仍然被弃用。 - 移除
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
和DEFAULT_TRACK_SELECTOR_PARAMETERS
常量。如果可能,改用getDefaultTrackSelectorParameters(Context)
,否则使用DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
。 - 移除构造函数
DefaultTrackSelector(ExoTrackSelection.Factory)
。改用DefaultTrackSelector(Context, ExoTrackSelection.Factory)
。 - 移除
Transformer.Builder.setContext
。Context
应传递给Transformer.Builder
构造函数。
- 移除
版本 1.0.0-alpha03
2022 年 3 月 14 日
androidx.media3:media3-*:1.0.0-alpha03
已发布。版本 1.0.0-alpha03 包含这些提交。
这对应于 ExoPlayer 2.17.1 版本。
- 音频
- 修复 HLS 中 Dolby Atmos (E-AC3-JOC) 的音频能力检查错误。
- 提取器
- FMP4:修复了对于包含 v0 和 v1 emsg atom 的流,emsg 样本元数据可能输出顺序错误的问题 (#9996)。
- 文本
- 修复
SingleSampleMediaSource.Factory.setTrackId
和MediaItem.SubtitleConfiguration.Builder.setId
的交互,以优先使用SubtitleConfiguration
字段,如果未设置,则回退到Factory
值 (#10016)。
- 修复
- 广告播放
- 修复直播 HLS SSAI 流中广告期间的音频欠载。
版本 1.0.0-alpha02
2022 年 3 月 2 日
androidx.media3:media3-*:1.0.0-alpha02
已发布。版本 1.0.0-alpha02 包含这些提交。
这对应于 ExoPlayer 2.17.0 版本。
- 核心库
- 添加受保护方法
DefaultRenderersFactory.getCodecAdapterFactory()
,以便覆盖buildVideoRenderers()
或buildAudioRenderers()
的DefaultRenderersFactory
子类可以访问编解码器适配器工厂并将其传递给它们创建的MediaCodecRenderer
实例。 - 将 ICY 头字段
name
和genre
传播到MediaMetadata.station
和MediaMetadata.genre
,以便它们通过Player.Listener.onMediaMetadataChanged()
到达应用程序 (#9677)。 - 从
DefaultHttpDataSource#getResponseHeaders
中移除 null 键。 - 当创建
MediaCodec
实例失败时,暂停并重试。这解决了某些设备在将 surface 从安全编解码器切换到另一个编解码器时出现的问题 (#8696)。 - 添加
MediaCodecAdapter.getMetrics()
以允许用户从MediaCodec
获取指标数据。(#9766)。 - 修复 Maven 依赖解析 (#8353)。
- 禁用直播流的自动速度调整,如果它们既没有低延迟功能,也没有用户请求设置速度 (#9329)。
- 将
DecoderCounters#inputBufferCount
重命名为queuedInputBufferCount
。 - 将
SimpleExoPlayer.renderers
设置为私有。渲染器可以通过ExoPlayer.getRenderer
访问。 - 更新了一些
AnalyticsListener.EventFlags
常量值以匹配Player.EventFlags
中的值。 - 将
AnalyticsCollector
拆分为接口和默认实现,以便应用程序不需要时 R8 可以将其剥离。
- 添加受保护方法
- 轨道选择
- 支持轨道选择中的首选视频角色标志 (#9402)。
- 更新视频轨道选择逻辑,以在选择多个视频轨道进行适配时考虑首选 MIME 类型和角色标志 (#9519)。
- 更新视频和音频轨道选择逻辑,以仅选择具有相同解码器和硬件支持级别的自适应选择格式 (#9565)。
- 更新视频轨道选择逻辑,以优先选择更高效的编解码器,如果多个编解码器受主要硬件加速解码器支持 (#4835)。
- 音频内容偏好(例如,“默认”音频轨道或与系统区域设置语言匹配的轨道)优先于技术轨道选择约束(例如,首选 MIME 类型或最大声道数)。
- 修复轨道选择问题,即覆盖一个轨道组不会禁用同一类型的其他轨道组 (#9675)。
- 修复了非空和空轨道覆盖混合未正确应用的问题 (#9649)。
- 禁止
TrackGroupArray
中存在重复的TrackGroup
。通过在TrackGroup
构造函数中设置id
,TrackGroup
始终可以区分。这修复了在后台应用程序并带有活动轨道覆盖后恢复播放时的崩溃问题 (#9718)。 - 修改
AdaptiveTrackSelection
中的逻辑,即使播放非常接近直播边缘,在网络带宽充足的情况下也允许提高质量 (#9784)。
- 视频
- 修复杜比视界的解码器回退逻辑,以便在需要时使用兼容的 H264/H265 解码器。
- 音频
- 提取器
- 文本
- DRM
- 从
DrmSessionManager.(pre)acquireSession
中移除playbackLooper
。当应用程序在自定义MediaSource
中使用DrmSessionManager
时,playbackLooper
需要传递给DrmSessionManager.setPlayer
。
- 从
- 广告播放/IMA
- 添加对 IMA 动态广告插入 (DAI) 的支持 (#8213)。
- 向
AdPlaybackState
添加一个方法,允许重置广告组,以便再次播放 (#9615)。 - 在广告播放期间强制播放速度为 1.0 (#9018)。
- 修复了加载失败的广告组导致立即播放重置的问题 (#9929)。
- UI
- DASH
- HLS
- RTSP
- Transformer
- 将所需最低 API 版本提高到 21。
TransformationException
现在用于描述转换过程中发生的错误。- 添加
TransformationRequest
用于指定转换选项。 - 允许多个监听器注册。
- 修复当编解码器输出被部分读取时转换器卡住的问题。
- 修复当释放合成器时抛出异常导致
Transformer.getProgress
中潜在的 NPE 问题。 - 添加一个用于应用转换的演示应用。
- MediaSession 扩展
- 默认情况下,
MediaSessionConnector
现在会在停止时清除播放列表。如果应用希望保留播放列表,可以在连接器上调用setClearMediaItemsOnStop(false)
。
- 默认情况下,
- Cast 扩展
- FFmpeg 扩展
- 使
build_ffmpeg.sh
依赖 LLVM 的 bin utils 而非 GNU 的 (#9933)。
- 使
- Android 12 兼容性
- 将 Cast 扩展升级至依赖
com.google.android.gms:play-services-cast-framework:20.1.0
。早期版本的play-services-cast-framework
与目标 Android 12 的应用不兼容,在创建PendingIntent
时会因IllegalArgumentException
而崩溃 (#9528)。
- 将 Cast 扩展升级至依赖
- 删除已弃用符号
- 移除
Player.EventListener
。请改用Player.Listener
。 - 移除
MediaSourceFactory#setDrmSessionManager
、MediaSourceFactory#setDrmHttpDataSourceFactory
和MediaSourceFactory#setDrmUserAgent
。请改用MediaSourceFactory#setDrmSessionManagerProvider
。 - 移除
MediaSourceFactory#setStreamKeys
。请改用MediaItem.Builder#setStreamKeys
。 - 移除
MediaSourceFactory#createMediaSource(Uri)
。请改用MediaSourceFactory#createMediaSource(MediaItem)
。 - 移除
DashMediaSource
、HlsMediaSource
和SsMediaSource
中的setTag
。请改用MediaItem.Builder#setTag
。 - 移除
DashMediaSource#setLivePresentationDelayMs(long, boolean)
。请改用MediaItem.Builder#setLiveConfiguration
和MediaItem.LiveConfiguration.Builder#setTargetOffsetMs
来覆盖清单,或使用DashMediaSource#setFallbackTargetLiveOffsetMs
提供备用值。 - 移除
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
。不再可能选择退出线程强制执行。 - 移除
ActionFile
和ActionFileUpgradeUtil
。请使用 ExoPlayer 2.16.1 或更早版本,以利用ActionFileUpgradeUtil
将旧版操作文件合并到DefaultDownloadIndex
中。 - 移除
ProgressiveMediaSource#setExtractorsFactory
。请改用ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
构造函数。 - 移除
ProgressiveMediaSource.Factory#setTag
和ProgressiveMediaSource.Factory#setCustomCacheKey
。请改用MediaItem.Builder#setTag
和MediaItem.Builder#setCustomCacheKey
。 - 移除
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
和DefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
构造函数。请改用DefaultRenderersFactory(Context)
构造函数、DefaultRenderersFactory#setExtensionRendererMode
和DefaultRenderersFactory#setAllowedVideoJoiningTimeMs
。 - 移除所有公共
CronetDataSource
构造函数。请改用CronetDataSource.Factory
。
- 移除
- 将以下
IntDefs
仅更改为@Target(TYPE_USE)
。这可能会导致 Kotlin 中用法的编译中断,可以通过将注解移动到注解类型 (Int
) 来修复。@AacAudioObjectType
@Ac3Util.SyncFrameInfo.StreamType
@AdLoadException.Type
@AdtsExtractor.Flags
@AmrExtractor.Flags
@AspectRatioFrameLayout.ResizeMode
@AudioFocusManager.PlayerCommand
@AudioSink.SinkFormatSupport
@BinarySearchSeeker.TimestampSearchResult.Type
@BufferReplacementMode
@C.BufferFlags
@C.ColorRange
@C.ColorSpace
@C.ColorTransfer
@C.CryptoMode
@C.Encoding
@C.PcmEncoding
@C.Projection
@C.SelectionReason
@C.StereoMode
@C.VideoOutputMode
@CacheDataSource.Flags
@CaptionStyleCompat.EdgeType
@DataSpec.Flags
@DataSpec.HttpMethods
@DecoderDiscardReasons
@DecoderReuseResult
@DefaultAudioSink.OutputMode
@DefaultDrmSessionManager.Mode
@DefaultTrackSelector.SelectionEligibility
@DefaultTsPayloadReaderFactory.Flags
@EGLSurfaceTexture.SecureMode
@EbmlProcessor.ElementType
@ExoMediaDrm.KeyRequest.RequestType
@ExtensionRendererMode
@Extractor.ReadResult
@FileTypes.Type
@FlacExtractor.Flags
(在com.google.android.exoplayer2.ext.flac
包中)@FlacExtractor.Flags
(在com.google.android.exoplayer2.extractor.flac
包中)@FragmentedMp4Extractor.Flags
@HlsMediaPlaylist.PlaylistType
@HttpDataSourceException.Type
@IllegalClippingException.Reason
@IllegalMergeException.Reason
@LoadErrorHandlingPolicy.FallbackType
@MatroskaExtractor.Flags
@Mp3Extractor.Flags
@Mp4Extractor.Flags
@NotificationUtil.Importance
@PlaybackException.FieldNumber
@PlayerNotificationManager.Priority
@PlayerNotificationManager.Visibility
@PlayerView.ShowBuffering
@Renderer.State
@RendererCapabilities.AdaptiveSupport
@RendererCapabilities.Capabilities
@RendererCapabilities.DecoderSupport
@RendererCapabilities.FormatSupport
@RendererCapabilities.HardwareAccelerationSupport
@RendererCapabilities.TunnelingSupport
@SampleStream.ReadDataResult
@SampleStream.ReadFlags
@StyledPlayerView.ShowBuffering
@SubtitleView.ViewType
@TextAnnotation.Position
@TextEmphasisSpan.MarkFill
@TextEmphasisSpan.MarkShape
@Track.Transformation
@TrackOutput.SampleDataPart
@Transformer.ProgressState
@TsExtractor.Mode
@TsPayloadReader.Flags
@WebvttCssStyle.FontSizeUnit
版本 1.0.0-alpha01
2021 年 10 月 27 日
androidx.media3:media3-*:1.0.0-alpha01
已发布。版本 1.0.0-alpha01 包含这些提交。
新功能
Media3 是媒体支持库的新家,其中包括 ExoPlayer。第一个 alpha 版本包含用于实现媒体用例的库的早期功能实现,包括
- ExoPlayer,一个易于自定义和扩展的 Android 应用级媒体播放器。
- 媒体会话功能,用于公开和控制播放。这个新的会话模块使用与 ExoPlayer 相同的
Player
接口。 - 用于构建媒体播放用户界面的 UI 组件。
- 封装其他库功能的模块,可与 ExoPlayer 配合使用,例如通过 IMA SDK 插入广告。
有关更多信息,请参阅 Media3 GitHub 项目。
ExoPlayer 之前托管在单独的 ExoPlayer GitHub 项目中。在 Media3 中,其包名为 androidx.media3.exoplayer
。我们计划在一段时间内继续维护和发布 ExoPlayer GitHub 项目,以便为应用提供迁移到 Media3 的时间。Media3 提供了所有 ExoPlayer 模块的替代品,除了旧版 media2 和 mediasession 扩展,它们已被新的 media3-session
模块取代。这提供了播放器和媒体会话之间的直接集成,无需使用适配器/连接器类。