Media3
| 最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
|---|---|---|---|---|
| 2025 年 10 月 22 日 | 1.8.0 | - | - | 1.9.0-alpha01 |
声明依赖项
如需添加 Media3 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle 文件中添加所需工件的依赖项:
Groovy
dependencies { def media3_version = "1.8.0" // 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.8.0" // 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") }
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。您可以使用 Media3 问题跟踪器来查找问题的答案、已知问题和功能请求,以及提交新问题。
版本 1.9.0
版本 1.9.0-alpha01
2025 年 10 月 22 日
发布了 androidx.media3:media3-*:1.9.0-alpha01。版本 1.9.0-alpha01 包含这些提交内容。
- 通用库:
- 将
minSdk更新为23,与其他 AndroidX 库保持一致。 - 添加了
PlayerTransferState,可帮助在Player实例之间转移播放状态。 - 向 Player 添加
void mute()和void unmute()方法,以在将 Player 的音量设置为零之前和之后分别保留和恢复 Player 的音量。 - 发布之前由
ExoPlayer在内部使用的实用程序类WakeLockManager、WifiLockManager、AudioFocusManager、AudioBecomingNoisyManager和StuckPlayerDetector,以便其他播放器可以重复使用这些类 (#1893)。 - 修复了当底层委托播放器使用引用相等性来比较监听器实例时,
ForwardingPlayer监听器处理的问题 (#2675)。 - 在
media3-common-ktx库中添加一个Player.listenTo挂起扩展函数,用于指定应处理的特定Player.Events。 - 修复了
BasePlayer.getBufferedPercentage中因整数溢出而导致的崩溃问题,该问题发生在报告的缓冲位置远大于报告的时长时(#2750)。
- 将
- ExoPlayer:
- 添加了卡住的播放器检测功能,如果播放器似乎卡住了,则会触发
StuckPlayerException播放器错误。在以下情况下会发生这种情况,如果需要,可以在ExoPlayer.Builder中配置每种默认超时时间:- 在尝试播放时,
STATE_BUFFERING超过 10 分钟,但没有缓冲进度。 - 尝试播放
STATE_READY10 秒后,没有播放进度。 - 在声明的时长结束后 1 分钟,但尚未到达媒体项的末尾时。
STATE_READY - 在尝试播放时,播放抑制原因持续了 10 分钟。
- 在尝试播放时,
- 默认启用唤醒锁定处理,以解决后台播放期间的缓冲问题。这相当于将
ExoPlayer.Builder.setWakeMode设置为C.WAKE_MODE_LOCAL。 - 添加监听逻辑,以便在向最初传递给
ExoPlayer.Builder的Context报告更改时自动更新虚拟设备 ID。 - 添加
ExoPlayer.setVirtualDeviceId以手动更新从传递给ExoPlayer.Builder的Context获取的虚拟设备 ID。 - 确保渲染器不会在当前项结束前 10 秒以上的时间内使用下一个播放列表项中的数据。
- 向
ExoPlayer添加了setSeekBackIncrementMs、setSeekForwardIncrementMs和setMaxSeekToPreviousPositionMs,以便在构造后更新这些设置 (#2736)。 - 在
DefaultPreloadManager中添加预缓存功能。应用现在可以通过TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)返回DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)或DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs),以指示媒体项需要预缓存。 - 在短视频演示应用中使用
DefaultPreloadManager的预缓存功能。 - 为本地播放添加了
DefaultLoadControl.Builder设置器,并调整了DefaultLoadControl的默认值,以便与各种本地文件搭配使用。 - 修复了设置空播放列表可能会导致播放器处于
STATE_READY或STATE_BUFFERING状态的 bug。 - 增强了预加载管理器 API:
- 添加
addMediaItems(List<MediaItem>, List<T>)和addMediaSources(List<MediaSource>, List<T>),用于批量添加媒体项或媒体来源,并在之后自动调用invalidate()。 - 添加了
removeMediaItems((List<MediaItem>)和removeMediaSources(List<MediaSource>),用于批量移除媒体项或媒体来源,并确保预加载管理器在移除后不会开始预加载或继续预加载任何媒体项或媒体来源。 - 允许
DefaultPreloadManager.setCurrentPlayingIndex(int)自动失效。更新当前播放索引后,应用不再需要显式调用invalidate()。
- 添加
- 在擦洗模式下,添加了在同一组图片中向前搜索时跳过关键帧重置的功能。
- 添加了
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int),以便应用为具有指定playerName的播放器设置目标缓冲区字节数的值。DefaultLoadControl现在可以根据自身分配的字节数和目标缓冲区字节数,单独为每个播放器做出决策。 - 向
AdPlaybackState.AdGroup添加SkipInfo,以携带广告组中每个广告的跳过信息。 - 修复了在播放后贴片广告期间调用
removeMediaItems(List)会导致崩溃的 bug (#2746)。 - 修复了播放列表播放时出现的卡顿问题,该问题是由于帧被错误地始终设置为最后一个样本并进行渲染所致。
- 如果播放器无法生成音频会话 ID,则启用重试路径(#2382、#2678)。
- 添加了对控制
DefaultPreloadManager中来源的总缓冲区字节数的支持,以避免预加载的总缓冲区字节数任意增长。如需使用默认控制逻辑,应用可以针对PlayerId.Preload.name(“预加载”)的playerName通过DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)设置预加载的目标缓冲区字节,并通过DefaultPreloadManager.Builder.setLoadControl(LoadControl)注入创建的DefaultLoadControl。
- 添加了卡住的播放器检测功能,如果播放器似乎卡住了,则会触发
- CompositionPlayer:
- 在新的
@ExperimentalApi注释下发布CompositionPlayer,以表明它可用于实验,但仍处于开发阶段。某些 API 在未来的版本中可能会发生重大变化,并且某些使用情形存在已知问题和限制(有些未记录在案)。 - 在
CompositionPlayer中添加了对COMMAND_SET_AUDIO_ATTRIBUTES和音频焦点处理的支持。 - 在
CompositionPlayer中添加了对更改次要序列速度的支持。
- 在新的
- 转换器:
- 使用
InAppMp4Muxer作为默认混音器。 - 添加了
EditedMediaItem.Builder#setSpeed()并废弃了Effects#createExperimentalSpeedChangingEffects()。 - 将
EditedMediaItemSequence中的forceAudioTrack和forceVideoTrack替换为trackTypes。
- 使用
- 轨道选择:
- 添加
TrackSelectionParameters.selectTextByDefault以优先选择任何文本轨道,而不指定其他更具体的偏好设置。 - 在
TrackSelectionParameters中添加preferredVideoLabels、preferredAudioLabels和preferredTextLabels,以指定具有特定标签的轨道的偏好设置,例如从 HLS NAME 标记读取的轨道 (#1666)。
- 添加
- 提取器:
- FLAC:收紧了文件头检测,以减少在编码的 FLAC 数据中发现虚假文件头的可能性,从而减少解码错误 (#558)。
- MP3:允许 MP3 文件开头处的 ID3 标记之间(以及之前)存在间隙 (#811、#5718)。
- MP4:通过在提取器发出轨道格式之前查看第一个样本的层值,消除
audio/mpeg(MP3)、audio/mpeg-L1和audio/mpeg-L2MIME 类型之间的歧义 (#2683)。 - MP4:假设大于 1MB 的
stblbox 表示文件必须是非分段的,从而提高超大文件的嗅探效率 (#2650)。 - Matroska:添加了对 DTS-HD 检测的支持 (#6225)。
- 修复了
MatroskaExtractor中的一个问题,即对于包含多个轨道的文件的搜索可能不准确。现在,提示点已正确关联到各自的轨道,从而实现更精确的定位。 - MP4:添加了对
©mvn(乐章名称)和©mvi(乐章索引)元数据的支持,这些元数据现在作为Format.metadata中 ID 分别为MVNM和MVIN的TextInformationFrame对象发出 (#2754)。 - MPEG-TS:修复了因没有时间戳的 PES 数据包而导致的
ReorderingBufferQueue中的IllegalArgumentException问题 (#2764)。 - MP4:忽略缺少
stsdbox 的轨道(而不是无法解析整个文件)。 - 添加了对提取 HEIC 动态照片的支持。
HeifExtractor现在可以解析包含嵌入式视频和音轨的 HEIC 文件。 - MP3:更改
FLAG_ENABLE_INDEX_SEEKING以优先从元数据标头(如 Xing 和 VBRI)中查找信息(如果可用),如果没有其他查找信息,则回退到基于索引的查找。这可提高具有搜索元数据的文件的性能 (#2839)。
- 检查员:
- 引入了一个新的
:media3-inspector模块,作为媒体检查实用程序的专用主页。此模块现在包含一个新的androidx.media3.inspector.MetadataRetriever,它将为元数据和帧提取提供统一的 API。现已弃用现有的androidx.media3.exoplayer.MetadataRetriever,改用此新版本。 - 引入了
androidx.media3.inspector.FrameExtractor,这是一个用于提取帧的新公共 API。此AutoCloseable类提供了一种提取帧的方法,支持 HDR 视频、视频效果和自定义解码器选择。应通过其Builder为特定MediaItem创建。 - FrameExtractor:添加了
getThumbnail(),用于从媒体文件中提取代表性的缩略图帧,而无需指定具体的时间戳。
- 引入了一个新的
- 音频:
- 使
AudioProcessor实例能够感知搜索。 - 允许将新的
AudioOutputProvider接口注入到DefaultAudioSink.Builder中,以支持自定义音频输出路径。默认值为AudioTrackAudioOutputProvider。 - 处理
GainProcessor中的搜索。 - 在轨道格式支持评估中利用 AC-4 解码器配置和级别功能 (#2580)。
- 避免因在播放开始时处理路由更改回调而可能造成的延迟 (#2646)。
- 允许对 EAC3、EAC3-JOC 和 AC-4 格式重复使用编解码器 (#1346)。
- 在
Sonic中添加了对浮点 PCM 样本的支持。 - 在
ToFloatPcmAudioProcessor中添加了对 16 位 PCM 样本的支持。
- 使
- 视频:
- 针对具有不同配置文件的 Dolby-Vision 内容停用编解码器重用。
- 文本:
- 修复了杜比视界内容中 CEA-6/708 字幕的解析问题 (#2775)。
- 图片:
- 修复了在擦洗 DASH 缩略图轨道时播放器卡住的 ScrubbingMode 问题 (#2815)。
- DRM:
- 将
MediaDrmCallback方法的返回类型从byte[]更改为新的MediaDrmCallback.Response类型,以允许返回额外的可选信息。这是一项源代码破坏性变更,但只需在返回之前使用new Response封装之前的byte[]返回值,即可轻松解决破坏性问题。 - 向
AnalyticsListener.onDrmKeysLoaded添加了网址和延迟时间等关键请求信息 (#1001)。 - 将配置请求数据从网址参数移至 POST 正文。
- 将
- 多路复用器:
- 添加了
MediaMuxerCompat,可作为框架MediaMuxer的替代品。 - 添加了
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo()以允许创建动态照片。 - 添加
WebmMuxer以允许将OPUS、VORBIS、VP8和VP9媒体流混合到webm文件格式中。
- 添加了
- IMA 扩展程序:
- 移除了自定义 ProGuard 规则,以便应用可以使用 IMA Android 归档中发布的规则。
- 添加了
ImaServerSideAdInsertionUriBuilder.setNetworkCode,这是一个新 API,用于设置 IMA SDK 的 Google Ad Manager 广告资源网代码,以便按照 Google Ad Manager 设置处理广告标识符。网络代码是可选的,但建议在完整服务流请求中提供。如需查找广告资源网代码,请参阅这篇文章。 - 将 IMA 依赖项提升至 3.37.0,这需要启用核心库脱糖。依赖应用也必须启用此功能。请参阅 IMA 的配置备注。
- 在 SSAI URI 构建器中支持 IMA DAI 自定义界面选项。服务器端广告插播的自定义界面选项包括“可跳过”和“关于此广告”呈现支持。此功能目前仅面向许可名单中的部分发布商提供。此更改还将 IMA SDK 版本升级到 3.38.0(版本说明),以访问自定义界面选项 API。
- 会话:
- 向
MediaSession.Callback.onPlaybackResumption添加了新参数,用于指示调用是仅用于收集信息还是用于开始播放 (#1764)。 - 更新了
MediaSession.ControllerInfo.isTrusted,以将自有应用的控制器也声明为可信 (#2542)。 - 添加了
MediaSessionService.triggerNotificationUpdate以手动触发通知更新 (#1833)。 - 向自定义命令方法添加了
ProgressListener。 - 将
MediaLibrarySession.Builder.setLibraryErrorReplicationMode的默认值更改为非致命。 - 向
MediaButtonReceiver.onForegroundServiceStartNotAllowedException添加了Context参数 (#2625)。 - 从平台
PlaybackInfo读取音量控制 ID,而不是通过 binder 获取。这样可确保以原子方式读取播放类型和音量控制 ID,并且两者相互匹配。 - 修复了在将
ACTION_UP按键事件传递给回调以进行自定义处理之前,这些事件会被过滤掉的 bug。这与 media1 的行为和平台行为保持一致 (#2637)。 - 修复了以下 bug:即使命令不可用,
getCurrentTimeline()也会被PlayerWrapper调用 (#2665)。 - 修复了以下 bug:在服务终止后,主 Looper 的消息队列中会遗留一条消息,从而导致内存泄漏 (#2692)。
- 当连接到具有
MediaBrowser的旧版会话应用时,仅当自定义操作在旧版会话的PlaybackStateCompat中作为自定义操作进行通告时,自定义命令才会发送到会话。所有其他自定义操作都会发送到该服务。 - 实现了
onAudioSessionIdChanged,以便在会话设置音频会话 ID 时通知媒体控制器 (#244)。 - 修复了以下 bug:当媒体键事件
Intent到达onStartCommand()时,KEYCODE_HEADSETHOOK未启动播放器。此问题已通过像处理KEYCODE_MEDIA_PLAY_PAUSE一样处理“KEYCODE_HEADSETHOOK”来修复 (#2816)。 - 修复了会话与控制器之间未传递 Surface 大小信息,导致无法在演示会话中应用视频效果的 bug。如果您使用的是控制器,而播放器无法处理
setVideoSurfaceHolder调用,则这可能是一项重大变更。 - 修复了非
StringCharSequence元数据值(例如 span 样式字符串)的传播问题 (#2853)。
- 向
- 界面:
- 向
media3-ui-compose模块添加了ProgressStateWithTickInterval类和相应的rememberProgressStateWithTickInterval可组合项。此状态持有者用于在demo-compose中以文本形式显示当前位置和时长。 - 向
ui-compose添加MuteButtonState,以处理Player音量的静音。此状态持有者用于在demo-compose中显示静音/取消静音切换按钮。 - 向
media3-ui-compose模块添加ProgressStateWithTickCount类和相应的rememberProgressStateWithTickCount可组合项。此状态持有者用于在demo-compose中将进度显示为水平只读进度条。 - 向
media3-ui-compose添加ContentFrame可组合项,该可组合项将PlayerSurface管理与宽高比调整和使用快门覆盖相结合。 - 解决了一个已知 API 34 平台 bug,该 bug 会导致在 Compose
AndroidView中使用SurfaceView时视频拉伸/裁剪,从而影响具有SURFACE_TYPE_SURFACE_VIEW的ContentFrame和PlayerSurface可组合项(#1237、#2811)。 - 创建一个新的
media3-ui-compose-material3模块,并向其中添加 Material3 主题的可组合项(PlayPauseButton、NextButton、PreviousButton、SeekBackButton、SeekForwardButton、RepeatButton、ShuffleButton、MuteButton)。 - 添加了对在
PlayerView中放置媒体路线按钮的支持。
- 向
- HLS 扩展程序:
- DASH 扩展程序:
- RTSP 扩展程序:
- 处理在处理 H264 和 H265 的碎片化 NAL 单元时缺少 RTP 数据包的错误 (#2613)。
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- AV1 扩展程序:AV1 软件解码器现在使用高性能
dav1d库,取代了之前的libgav1实现,从而提高了解码速度。
- AV1 扩展程序:AV1 软件解码器现在使用高性能
- Cast 扩展程序:
- 添加了
CastPlayer.Builder,使CastPlayer能够进行本地播放和 Cast 播放。如需保留仅支持 Cast 播放的旧版CastPlayer行为,您可以使用RemoteCastPlayer。预先存在的CastPlayer构造函数会保留其旧行为,但已被弃用,建议改用CastPlayer或RemoteCastPlayer构建器。 - 停止在
DefaultMediaItemConverter中强制执行非 null MIME 类型。 - 使用
MediaItem.mediaMetadata.mediaType推断要在DefaultCastOptionsProvider#toMediaQueueItem中使用的 Cast MEDIA_TYPE(如果可用)。 - 在
DefaultCastOptionsProvider中启用远程到本地的转移。 - 在会话演示中添加了对 Cast 的支持。
- 添加了对在可组合界面上显示媒体路由按钮的支持。
- 添加了对在操作栏菜单上显示媒体路由按钮的支持。
- 添加了对将媒体路由按钮显示为 View 界面元素的支持。
- 添加了
- 测试实用程序:
- 为
FakeClock的自动前进行为添加了最大时间差。默认值为 1 秒,但可通过FakeClock.Builder进行配置。 - 为
RobolectricUtil.runMainLooperUntil(和runLooperUntil)添加了消息之间的最大时间差。默认值为 1 秒,但可通过这些方法的新重载进行配置。 - 将
CapturingRenderersFactory从test-utils移至test-utils-robolectric。
- 为
- 移除了已废弃的符号:
- 移除了已弃用的
DefaultPreloadManager构造函数。改用DefaultPreloadManager.Builder。 - 移除了已弃用的
EditedMediaItemSequence构造函数。改用EditedMediaItemSequence.Builder。
- 移除了已弃用的
版本 1.8.0
版本 1.8.0
2025 年 7 月 30 日
版本 1.8.0 中包含这些提交内容。
- 通用库:
- 添加了对替换
ForwardingSimpleBasePlayer中播放器的支持。
- 添加了对替换
- ExoPlayer:
- 为
ExoPlayer接口添加了随机播放模式的 getter (#2522)。 - 如果从多个线程访问
DefaultAudioSink,则更清晰地抛出异常。如果这是由于在播放器外部调用RendererCapabilities.getFormatSupport而导致的,请确保在与 ExoPlayer 的播放线程相同的线程上调用此方法,或使用与用于播放的实例不同的实例 (#1191)。 - 修复了
DefaultTrackSelector可能会将电视上的非立体声音频格式标记为不受支持的 bug。 - 确保在使用 MediaCodec 的
DECODE_ONLY标志(在擦洗模式下默认启用)时,正确渲染最后一帧。 - 添加了对使用从传递到
ExoPlayer.Builder的Context中的虚拟设备 ID 的支持。 - 在清理模式下默认启用动态调度。
- 避免在搜索到项末尾时不必要地重新加载来源。
- 在清理模式下默认使用
MediaCodec.BUFFER_FLAG_DECODE_ONLY。 - 当
PreloadMediaSource由ExoPlayer播放时,如果播放线程与预加载线程不同,则抛出IllegalStateException(#2495)。 - 向
ShuffleMode添加了cloneAndMove,并提供默认实现 (#2226)。 - 更改了
Renderer.getMinDurationToProgressUs的默认行为,以便在不需要调用render时返回更大的值。 - 修复了以下 bug:在暂停状态下搜索到末尾时,内部调度会延迟最后一帧。目前,只有在启用
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled的情况下,此 bug 修复才会生效。 - 添加了
ExoPlayer.setScrubbingModeEnabled(boolean)方法。这样可以针对许多频繁的搜索操作(例如,用户拖动进度条)优化播放器。您可以使用ExoPlayer和ExoPlayer.Builder上的setScrubbingModeParameters(..)自定义快进模式的行为。 - 允许在拖动模式下自定义部分搜索容差。
- 在快进/快退模式下提高编解码器运行速率。
- 修复了
AdsMediaSource内容中的准备错误可能永远不会报告的 bug (#2337)。 - 修复了
MergingMediaSource中的内存泄漏问题,例如在侧载字幕时使用该方法时会发生此问题 (#2338)。 - 允许
CmcdConfiguration.Factory返回null,以针对特定媒体项停用 CMCD 日志记录 (#2386)。 - 将默认图片缓冲区大小从 128kB(文本轨道中的复制粘贴错误)增加到 26MB,这足以容纳 50MP Ultra HDR 图片 (#2417)。
- 添加了
PreCacheHelper,允许应用预缓存具有指定开始位置和时长的单个媒体。 - 添加了对从
DefaultPreloadManager中的指定位置进行预加载的支持。
- 为
- 转换器:
- 添加了
CodecDbLite,可针对视频编码设置实现特定于芯片组的优化。 - 向
DefaultEncoderFactory添加setEnableCodecDbLite标志,以启用 CodecDB Lite 设置优化。此标志默认设置为 false。 - 现在,如需使用静音音频填充初始间隙(通过
addGap()添加),必须在EditedMediaItemSequence.Builder中明确设置experimentalSetForceAudioTrack(true)。如果缺口位于序列中间,则不需要此标志。 - 将
Muxer接口从media3-transformer移至media3-muxer。 - 将设置
MediaItem.Builder().setImageDuration(long)设为强制性,以便将媒体内容作为图片导入。 - 添加了
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean),其中包含修剪时的 MP4 编辑列表,用于指示播放器忽略修剪开始点之前的关键帧与修剪开始点之间的样本。 - 更新了 Composition Demo 应用,以使用 Kotlin 和 Jetpack Compose,并添加了自定义
VideoCompositorSettings,用于将序列排列到 2x2 或 PiP 布局中。
- 添加了
- 提取器:
- 解析来自碎片化 MP4 文件的元数据 (#2084)。
- JPEG:支持开头没有 Exif 段的动态照片 (#2552)。
- 添加了对在具有多个
sidxatom 的分段 MP4 中进行搜索的支持。 您可以在FragmentedMp4Extractor上使用FLAG_MERGE_FRAGMENTED_SIDX标志来启用此行为 (#9373)。 - 忽略 FLAC 文件中的空搜索表(包括仅包含占位符搜索点的搜索表),并在已知文件时长的情况下回退到二分搜索(#2327)。
- 修复了 H.265 SEI 单元的解析,以完全跳过无法识别的 SEI 类型 (#2456)。
- 更新了
WavExtractor,以在解析WAVE_FORMAT_EXTENSIBLE类型的文件时使用标头扩展的 SubFormat 数据作为音频格式。 - MP4:添加了对定义原始 PCM 音轨(不支持 64 位浮点 PCM)的
ipcm和fpcmbox 的支持。 - MP4:处理同时旋转和反射视频的
tkhd转换矩阵的旋转部分。这样可确保 iPhone 前置摄像头拍摄的反射视频以正确的方向显示,但在 y 轴上错误地反射 (#2012)。 - MP3:在因
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)而回退到恒定比特率搜索时,使用来自不可搜索的 Xing、VBRI 和类似可变比特率元数据的时长和数据大小 (#2194)。
- 音频:
- 修复了以下 bug:当音频播放开始时间非常接近媒体结束时间时,不会调用
AnalyticsListener.onAudioPositionAdvancing。 - 在
ChannelMappingAudioProcessor和TrimmingAudioProcessor中添加了对所有线性 PCM 采样格式的支持。 - 在
CompositionPlayer中添加了对音频间隙的支持。 - 从
BaseAudioProcessor#reset()中移除了对BaseAudioProcessor#flush()的虚假调用。 - 允许在 DefaultAudioMixer 中进行恒定功率上混/下混。
- 将
ChannelMappingAudioProcessor、TrimmingAudioProcessor和ToFloatPcmAudioProcessor设为公开 (#2339)。 - 在
AudioTrackPositionTracker中使用AudioTrack#getUnderrunCount()来检测DefaultAudioSink中的欠载,而不是尽力估计。 - 改进了音频时间戳平滑处理,以应对音频输出设备意外的位置漂移。
- 修复了以下 bug:当连接到蓝牙设备时,从暂停状态恢复后,前 10 秒的音频/视频同步出现问题。
- 修复了
AnalyticsListener.onAudioPositionAdvancing未报告音频开始前进的时间,而是报告了首次测量的时间的 bug。 - 修复了在某些设备上回退到立体声音频后恢复到多声道音频的问题 (#2258)。
- 修复了以下 bug:当音频播放开始时间非常接近媒体结束时间时,不会调用
- 视频:
- 将分离的 Surface 解决方法扩展到“lenovo”和“motorola”设备 (#2059)。
- 改进了启动时音频样本未在确切的请求位置开始时平滑的视频帧释放。
- 将分离表面解决方法扩展到“realme”设备 (#2059)。
- 添加了实验性
ExoPlayerAPI,以便在将仅解码输入缓冲区排入队列时包含MediaCodec.BUFFER_FLAG_DECODE_ONLY标志。此标志会向解码器发出信号,让其跳过仅解码缓冲区,从而加快搜索速度。使用DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag启用该功能。 - 改进了软件视频编解码器的编解码器性能检查。这可能会导致一些额外的轨道被标记为
EXCEEDS_CAPABILITIES。 - 修复了部分设备上的 VP9 Widevine 播放错误 (#2408)。
- 文本:
- 添加了对 MP4 文件中 VobSub 轨道格式的支持 (#2510)。
- 修复了以下问题:当字幕片段最初未能加载,但后来成功加载,随后出现多个空字幕片段时,播放会停滞 (#2517)。
- 修复了 SSA 和 SubRip,以便在启用字幕时显示正在进行的 cue (#2309)。
- 修复了以下问题:当从存在字幕错误的流切换到具有空字幕轨道的直播时,播放会卡住 (#2328)。
- 修复了播放包含 B 帧的 H.262 流时 CEA-608 字幕乱码的问题 (#2372)。
- 在 Matroska 文件中添加了对使用
CodecId = S_TEXT/SSA的 SSA 字幕的支持。之前,MatroskaExtractor仅支持CodecId = S_TEXT/ASS,后者旨在表示 SubStation Alpha 字幕的“高级”(v4+) 变体(但 ExoPlayer 的解析逻辑对于这两种变体是相同的)(#2384)。 - 在 SubStation Alpha (SSA) 字幕文件中添加对
layer属性的支持,该属性用于定义多个 cue 同时显示在屏幕上时的 z 顺序 (#2124)。
- 元数据:
- 添加了对检索媒体时长和
Timeline的支持,并将其迁移到基于实例的AutoCloseableAPI。MetadataRetriever使用新的Builder为MediaItem创建实例,然后调用retrieveTrackGroups()、retrieveTimeline()和retrieveDurationUs()来获取元数据的ListenableFuture。之前的静态方法现已弃用 (#2462)。
- 添加了对检索媒体时长和
- 图片:
- 将
BitmapFactoryImageDecoder中解码的位图限制为显示大小,以避免应用在尝试显示非常大(例如 50MP)的图片时因PlayerView而发生Canvas: trying to draw too large bitmap.崩溃。 - 更改
DefaultRenderersFactory.getImageDecoderFactory()的签名以接受Context参数。 - 使
CompositionPlayer中使用的最大位图输出大小与Transformer中已使用的最大位图输出大小保持一致(这意味着CompositionPlayer在解码位图时不考虑显示大小,这与ExoPlayer不同)。
- 将
- DRM:
- 添加了
OfflineLicenseHelper.newWidevineInstance的新重载,该重载接受MediaItem.DrmConfiguration,以便正确应用 HTTP 请求标头 (#2169)。
- 添加了
- 效果:
- 添加了
Presentation.createForShortSide(int),用于创建Presentation,以确保最短边始终与给定值匹配,无论输入方向如何。
- 添加了
- 多路复用器:
- 修复了以下 bug:未为分段 MP4 中的音频样本设置正确的样本标志。
writeSampleData()API 现在使用混音器专用BufferInfo类,而不是MediaCodec.BufferInfo。- 添加
Muxer.Factory#supportsWritingNegativeTimestampsInEditList,默认值为 false。
- IMA 扩展程序:
- 修复了以下 bug:一个广告中的加载错误可能会意外导致另一个广告组失效。
- 修复了以下 bug:VOD 窗口结束后,广告组导致播放停滞。
开始时间晚于窗口时间的广告组不再加入
MediaPeriodQueue中(#2215)。
- 会话:
- 修复了忽略来自第三方非特权 Media3 控制器的连接的 bug。
- 在向旧版
MediaBrowserServiceCompat发送自定义命令时,移除对可用命令的检查。这与旧版控制器/浏览器在连接到旧版应用时的行为一致。 - 修复了以下 bug:导致播放器的首次播放错误被错误地视为持久性自定义异常。这会阻止应用恢复。
- 修复了以下 bug:会话未处理的部分控制器更改可能会导致
IllegalStateExceptions。 - 修复了以下 bug:会话未处理的控制器操作可能会使控制器处于无效状态。
- 修复了 StrictMode 不安全启动违规警告 (#2330)。
- 修复了以下 bug:当从不同于主线程的应用线程运行播放器时,从主线程调用
setSessionExtras会导致IllegalStateException(#2265)。 - 如果玩家设置了媒体项,但未准备或播放这些媒体项,则不会自动显示通知 (#2423https://github.com/androidx/media/issues/2423)。此行为可通过
MediaSessionService.setShowNotificationForIdlePlayer进行配置。 - 为所有或所选控制器添加自定义
PlaybackException。 - 修复了在
MediaController上直播中进行搜索可能会导致IllegalArgumentException的 bug。 - 对于直播,停止发布播放位置以及在当前项中搜索的功能,以避免 Android Auto 界面(以及使用平台媒体会话中的此信息的其他控制器)中出现位置伪影 (#1758)。
- 修复了以下 bug:将 null 传递到连接到旧版
MediaBrowserServiceCompat的MediaBrowser的getLibraryRoot中会产生NullPointerException。 - 修复了以下 bug:发送自定义操作、搜索结果或 getItem 请求导致旧版会话应用崩溃并显示
ClassNotFoundException。 - 修复了
MediaItem.LocalConfiguration.uri被共享到平台会话的MediaMetadata的 bug。如需有意共享 URI 以允许控制器重新请求媒体,请改为设置MediaItem.RequestMetadata.mediaUri。
- 界面:
- 修复了可重用组件(如
LazyColumn)内的PlayerSurface无法正常运行的 bug (#2493)。 - 修复了以下 Compose bug:在设置初始按钮状态和观察状态变化(例如图标形状或是否启用)之间存在间隙。现在,系统会采纳在观测期之外对播放器所做的任何更改 (#2313)。
- 向
media3-ui-compose模块添加SeekBackButtonState和SeekForwardButtonState的状态持有者和可组合项。 - 向
PlayerControlView添加了对 ExoPlayer 的快进模式的支持。启用后,当用户开始拖动进度条时,播放器会进入快进/快退模式,每次移动都会发出player.seekTo调用,然后在触摸操作从屏幕上抬起时退出快进/快退模式。您可以通过 XML 中的time_bar_scrubbing_enabled = true或 Java/Kotlin 中的setTimeBarScrubbingEnabled(boolean)方法来启用此集成。 - 使
PlayerSurface接受可为 null 的Player实参。
- 修复了可重用组件(如
- 下载内容:
- 为渐进式流添加了部分下载支持。应用可以使用
DownloadHelper准备渐进式流,并向辅助程序请求DownloadRequest,同时指定下载应涵盖的基于时间的媒体开始和结束位置。返回的DownloadRequest包含已解析的字节范围,可使用该范围创建ProgressiveDownloader并相应地下载内容。 - 添加了
DownloadHelper.Factory,用于替换静态DownloadHelper.forMediaItem()方法。 - 为
SegmentDownloader实现添加了Factory。 - 为自适应流添加了部分下载支持。应用可以使用
DownloadHelper准备自适应媒体流,并指定下载应涵盖的基于时间的媒体开始和结束位置,向辅助程序请求DownloadRequest。返回的DownloadRequest包含已解析的时间范围,可使用该时间范围创建具体的SegmentDownloader并相应地下载内容。
- 为渐进式流添加了部分下载支持。应用可以使用
- Cronet 扩展:
- 添加了自动 Cookie 处理功能 (#5975)。
- HLS 扩展程序:
- 修复了以下 bug:当缓冲区中没有可用的块时,
HlsSampleStreamWrapper尝试在缓冲区内查找 #2598。 - 修复了以下 bug:在加载低延迟部分和预加载提示后,轨道选择发生变化可能会导致播放卡顿或冻结 (#2299)。
- 当服务器不遵守
CAN-BLOCK-RELOAD=YES时,等待目标时长的一半,以防止过度重新加载 (#2317)。 - 修复了以下 bug:在插播广告开始前启动中贴片广告流时,播放会停滞,并且系统会尝试解析错误的广告的素材资源列表 (#2558)。
- 修复了播放列表解析,以接受带引号的字符串属性值中的
\f(换页符)(#2420)。 - 支持更新具有相同 ID 的插页式广告 (#2427)。
- 修复了以下 bug:当直播流没有可加载的片段时,有时不会传播播放列表加载错误 (#2401https://github.com/androidx/media/issues/2401)。
- 按 NAME 标记对字幕转译进行分组,类似于音频转译的现有分组方式 (#1666)。
- 支持 X-ASSET-LIST 和包含
HlsInterstitialsAdsLoader的直播。
- 修复了以下 bug:当缓冲区中没有可用的块时,
- DASH 扩展程序:
- RTSP 扩展程序:
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- 修复了
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange对音频解码器扩展没有效果的 bug (#2258)。
- 修复了
- Cast 扩展程序:
- 测试实用程序:
- 将
advance(player).untilPositionAtLeast和untilMediaItemIndex添加到TestPlayerRunHelper,以便将播放器推进到指定位置。在大多数情况下,这些方法比现有的untilPosition和untilStartOfMediaItem方法更可靠。 - 将
FakeDownloader移至test-utils-robolectric模块,以便在其他测试中重复使用。 - 移除了
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.8.0-rc02
2025 年 7 月 24 日
使用 1.8.0 稳定版。
版本 1.8.0-rc01
2025 年 7 月 16 日
使用 1.8.0 稳定版。
版本 1.8.0-beta01
2025 年 7 月 2 日
使用 1.8.0 稳定版。
版本 1.8.0-alpha01
2025 年 5 月 19 日
使用 1.8.0 稳定版。
版本 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)。
- 修复了以下问题:当
PreloadMediaSource尝试在准备就绪之前调用其getBufferedDurationUs()时,ProgressiveMediaPeriod会抛出IllegalStateException(#2315)。 - 修复了在针对 DASH、HLS 和 SmoothStreaming 的清单请求中发送
CmcdData的问题 (#2253)。 - 确保在移除广告组后仍可使用
AdPlaybackState.withAdDurationsUs(long[][])。用户仍需传入已移除广告组的时长数组,该数组可以为空或为 null (#2267)。
- 提取器:
- MP4:从
tkhd框中解析alternate_group并将其作为每个轨道Format.metadata中的Mp4AlternateGroupData条目公开 (#2242)。
- MP4:从
- 音频:
- 修复了在播放短内容播放列表时位置可能会卡住的分流问题 (#1920)。
- 会话:
- 将平台
MediaSession回调的较低聚合超时时间从 500 毫秒降至 100 毫秒,并添加一个实验性 setter 以允许应用配置此值。 - 修复了通知在被用户关闭后重新出现的问题 (#2302)。
- 修复了以下 bug:当封装的播放器实际上为空时,会话返回单项时间轴。当封装的播放器没有可用的
COMMAND_GET_TIMELINE,但有可用的COMMAND_GET_CURRENT_MEDIA_ITEM且封装的播放器为空时,会发生此问题 (#2320)。 - 修复了以下 bug:在与服务进行其他互动(例如
setForegroundServiceTimeoutMs)后,调用MediaSessionService.setMediaNotificationProvider会被静默忽略 (#2305)。
- 将平台
- 界面:
- 使
PlayerSurface能够与ExoPlayer.setVideoEffects和CompositionPlayer搭配使用。 - 修复了无法使用新的
Player重新组合PlayerSurface的 bug。
- 使
- HLS 扩展程序:
- 修复了以下问题:未在
CmcdData中为 HLS 媒体设置块时长,导致在处理加密的媒体段时出现断言失败 (#2312)。
- 修复了以下问题:未在
- RTSP 扩展程序:
- 添加对采用 RTSPT 方案的 URI 的支持,以配置使用 TCP 的 RTSP 会话 (#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,该 bug 会导致在setPlaylist之后使用nullMediaMetadata在State中设置新的currentMediaItemIndex时,不会重新评估元数据 (#1940)。 - 将
SimpleBasePlayer.State的访问权限从受保护更改为公开,以便更轻松地处理其他类中的更新 (#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参数。 - 修复了以下 bug:在多周期 DASH 流中,如果播放列表项或周期的时长与实际内容不符,可能会导致在项结束时出现帧冻结问题 (#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)。
- 添加
- 转换器:
- 添加了对转封装为其他向后兼容格式的支持。
- 添加对转码和转封装杜比视界(配置文件 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,使其在播放恢复时调用(之前是在播放暂停时调用)。 - 当
SpeedChangingAudioProcessor配置为默认参数时,不绕过SonicAudioProcessor。 - 修复了
Sonic#getOutputSize()中可能导致DefaultAudioSink停滞的下溢问题。 - 修复了
MediaCodecAudioRenderer.getDurationToProgressUs()和DecoderAudioRenderer.getDurationToProgressUs(),以便搜索正确重置提供的时长。 - 将
androidx.media3.common.audio.SonicAudioProcessor设为最终版本。 - 向
ChannelMappingAudioProcessor和TrimmingAudioProcessor添加了对浮点 PCM 的支持。
- 修复了
- 视频:
- 将
MediaCodecVideoRenderer.shouldUsePlaceholderSurface更改为受保护,以便应用可以替换以阻止使用占位符界面 (#1905)。 - 添加了实验性
ExoPlayerAV1 样本依赖项解析,以加快搜索速度。使用新的DefaultRenderersFactory.experimentalSetParseAv1SampleDependenciesAPI 启用该功能。 - 添加了实验性
ExoPlayerAPI,用于舍弃未依赖的后期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 文件包含时长为零(开始时间和结束时间相同)的 cue 时的
IllegalStateException问题 (#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,该 bug 会在仅写入音轨时创建大量 fragment。
- 将
- 会话:
- 在播放暂停、停止或失败时,额外保持 10 分钟的前台服务状态。这样一来,用户可以在此超时时限内恢复播放,而不会面临各种设备上的前台服务限制。请注意,在替换
onTaskRemoved时,仅调用player.pause()已无法用于在stopSelf()之前停止前台服务,请改用MediaSessionService.pauseAllPlayersAndStopSelf()。 - 当播放进入错误或停止状态时,保持通知可见。只有在清空播放列表或释放播放器时,系统才会移除通知。
- 改进了对 Android 平台 MediaSession 操作 ACTION_PLAY 和 ACTION_PAUSE 的处理,以根据可用命令仅设置其中一个,并且还接受仅设置其中一个的情况。
- 将
Context添加为MediaButtonReceiver.shouldStartForegroundService的参数 (#1887)。 - 修复了以下 bug:在连接到旧版会话的
MediaController上调用Player方法时,会舍弃来自待处理更新的更改。 - 使
MediaSession.setSessionActivity(PendingIntent)接受 null (#2109)。 - 修复了在清除播放列表时过时的通知仍保持可见状态的 bug (#2211)。
- 在播放暂停、停止或失败时,额外保持 10 分钟的前台服务状态。这样一来,用户可以在此超时时限内恢复播放,而不会面临各种设备上的前台服务限制。请注意,在替换
- 界面:
- 为
PlayerSurface、PresentationState、PlayPauseButtonState、NextButtonState、PreviousButtonState、RepeatButtonState、ShuffleButtonState和PlaybackSpeedState向media3-ui-compose模块添加了状态持有者和可组合项。
- 为
- 下载内容:
- 修复了
CacheWriter中的 bug,该 bug 会在数据源抛出Exception(而非IOException)时使数据源保持打开状态并锁定缓存区域 (#9760)。
- 修复了
- HLS 扩展程序:
- 添加
HlsInterstitialsAdsLoader的第一个版本。广告加载器会读取 HLS 媒体播放列表的 HLS 插播广告,并将其映射到传递给AdsMediaSource的AdPlaybackState。此初始版本仅支持具有X-ASSET-URI属性的 HLS VOD 流。 - 添加了
HlsInterstitialsAdsLoader.AdsMediaSourceFactory。应用可以使用它以方便安全的方式创建使用HlsInterstitialsAdsLoader的AdsMediaSource实例。 - 解析 HLS 播放列表中的
SUPPLEMENTAL-CODECS标记,以检测 Dolby Vision 格式 (#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 月 6 日
使用 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:当
- 视频:
- 回滚了在处理
onOutputFormatChanged时使用提供的MediaCodecAdapter像素宽高比值的问题 (#1371)。
- 回滚了在处理
- 文本:
- 修复了
ReplacingCuesResolver.discardCuesBeforeTimeUs中的 bug,该 bug 会导致在timeUs处于活动状态(开始时间早于timeUs,但尚未结束)的 cue 被错误地舍弃 (#1939)。
- 修复了
- 元数据:
- 从 Vorbis 注释中提取光盘/轨道编号和流派到
MediaMetadata中 (#1958)。
- 从 Vorbis 注释中提取光盘/轨道编号和流派到
版本 1.5.0
2024 年 11 月 27 日
发布了 androidx.media3:media3-*:1.5.0。版本 1.5.0 中包含这些提交内容。
- 通用库:
- 添加了
ForwardingSimpleBasePlayer,该方法允许在进行小幅调整的同时转发到另一个播放器,从而确保完全一致性和监听器处理 (#1183)。 - 将
SimpleBasePlayer.State.playlist替换为getPlaylist()方法。 - 添加了
SimpleBasePlayer.State.Builder.setPlaylist()的替换项,用于直接指定Timeline和当前Tracks和Metadata,而不是构建播放列表结构。 - 将
minSdk增加到 21(Android Lollipop)。这与所有其他 AndroidX 库保持一致。 - 添加了
androidx.media3:media3-common-ktx制品,该制品在 Common 库的基础上构建了 Kotlin 特有的功能 - 添加
Player.listen挂起扩展函数,以启动协程来监听media3-common-ktx库的Player.Events。 - 从手动实现为外部类的内部类中移除了
@DoNotInline注解,这些内部类旨在避免运行时类验证失败。新版 R8 现在会自动将此类调用移出内联,以避免运行时失败(因此不再需要手动移出内联)。由于compileSdk = 35,该库的所有 Gradle 用户必须已在使用可执行此操作的 R8 版本所对应的 Android Gradle 插件版本。使用非 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有时会被报告为“意外运行时错误”。 - 传递
bufferedDurationUs而不是bufferedPositionUs(使用PreloadMediaSource.PreloadControl.onContinueLoadingRequested())。此外,还将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[])并将方法标记为最终状态,以防止被替换。 应改用新的DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])。 - 在
MergingMediaSource中报告来自次要来源的MediaSourceEventListener事件。这会导致系统针对旁加载字幕(使用MediaItem.LocalConfiguration.subtitleConfigurations添加的字幕)报告加载开始/错误/取消/完成事件,这些事件可能会显示为从AnalyticsListener发出的重复加载事件。 - 防止字幕和元数据错误完全停止播放。
而是停用有问题的轨道,并继续播放其余轨道 (#1722)。
- 在新的字幕处理(提取期间)中,关联的解析错误(例如,无效的字幕数据)和加载错误(例如,HTTP 404)会通过
onLoadError回调发出。 - 在旧版字幕处理(渲染期间)中,仅通过
onLoadError回调发出关联的加载错误,而解析错误会被静默忽略(这是预先存在的行为)。
- 在新的字幕处理(提取期间)中,关联的解析错误(例如,无效的字幕数据)和加载错误(例如,HTTP 404)会通过
- 修复了以下 bug:在多周期 DASH 流中,如果播放列表项或周期的时长与实际内容不符,可能会导致在项结束时出现帧冻结问题 (#1698)。
- 向
SntpClient添加了一个 setter,用于设置自上次更新以来经过的最大时间,超过此时间后,客户端会重新初始化 (#1794)。
- 现在,可以为每个媒体项调用
- 转换器:
- 添加了
SurfaceAssetLoader,该类支持通过Surface将视频数据排队到 Transformer。 ImageAssetLoader通过AssetLoader.onError报告不受支持的输入,而不是抛出IllegalStateException。- 使使用
MediaItem.Builder.setImageDurationMs设置图片时长成为图片导出的强制要求。 - 添加了对音频 EditedMediaItem 序列中缺口的支持。
- 添加了
- 轨道选择:
DefaultTrackSelector:在其他因素相同的情况下,优先选择基于对象的音频,而不是基于声道的音频。
- 提取器:
- 允许
Mp4Extractor和FragmentedMp4Extractor识别未被后续样本用作参考的 H264 样本。 - 在
AmrExtractor中添加了启用基于索引的搜索的选项。 - 将有效帧之间超过 128kB 的 MP3 文件视为截断文件(而非无效文件)。这意味着,如果文件末尾包含非 MP3 数据,且没有其他元数据来指示 MP3 字节的长度,现在会在 MP3 数据结束时停止播放,而不是因
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}而失败 (#1563)。 - 修复了在处理 MP4 文件中的编辑列表时,针对非关键帧媒体起始位置的预播放广告示例处理问题 (#1659)。
- 通过使用
Mp4Extractor和FragmentedMp4Extractor中mdhdbox 的媒体时长,改进了帧速率计算 (#1531)。 - 修复了 MP4 编辑列表中的
media_time缩放比例不正确的问题。虽然segment_duration之前已使用影片时间尺度正确缩放,但现在media_time会使用轨道时间尺度正确缩放,如 MP4 格式标准中所指定 (#1792)。 - 处理具有编辑列表的 MP4 的
endIndices计算中的无序帧 (#1797)。 - 修复了 MP4 文件
mdhd框中的媒体时长解析,以处理-1值 (#1819)。 - 添加了对识别 MP4 文件中 H.263 视频的
h263box 的支持 (#1821)。 - 添加了 AC-4 Level-4 ISO 基本媒体文件格式支持 (#1265)。
- 允许
- DataSource:
- 更新
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中收到nullSurface,并调用新方法detachOutputSurface来移除之前设置的Surface(如果编解码器支持此操作 [MediaCodecInfo.detachedSurfaceSupported])。 - 在处理
onOutputFormatChanged时,如果提供了MediaCodecAdapter提供的像素宽高比值,则使用这些值 (#1371)。 - 针对 Galaxy Tab S7 FE 上导致 60fps 安全 H264 流被标记为不受支持的设备问题添加了解决方法 (#1619)。
- 针对在最后一个样本之后卡住且不返回流结束信号的编解码器添加了解决方法。
- 文本:
- 添加自定义
VoiceSpan并针对 WebVTT 语音跨度填充该自定义VoiceSpan(#1632)。 - 确保显示 HLS 中具有非常大的字幕时间戳(以微秒表示并乘以
90,000MPEG 时基时会溢出 64 位long)的 WebVTT 字幕 (#1763)。 - 支持杜比视界内容中的 CEA-608 字幕 (#1820)。
- 修复了以下问题:在启用 CEA-608 字幕的情况下,播放 DASH 多周期流时会挂起 (#1863)。
- 添加自定义
- 元数据:
- 为包含 icy 或 vnd.dvb.ait 内容的轨道分配
C.TRACK_TYPE_METADATA类型。
- 为包含 icy 或 vnd.dvb.ait 内容的轨道分配
- 图片:
- 添加
ExternallyLoadedImageDecoder以简化与 Glide 或 Coil 等外部图片加载库的集成。
- 添加
- DataSource:
- 添加了
FileDescriptorDataSource,这是一种可用于从FileDescriptor读取的新DataSource(#3757)。
- 添加了
- 效果:
- 针对轻微的
SurfaceTexture缩放添加了DefaultVideoFrameProcessor解决方法。SurfaceTexture可能包含一个小的缩放比例,用于剪切裁剪缓冲边缘周围的 1 个纹素边框。现在,系统会处理这种情况,使输出结果更接近预期。 - 加快
DefaultVideoFrameProcessor.queueInputBitmap()。因此,使用Transformer将图片导出为视频的速度更快。
- 针对轻微的
- IMA 扩展程序:
- 修复了以下 bug:清除播放列表可能会导致
ImaServerSideAdInsertionMediaSource中出现ArrayIndexOutOfBoundsException。 - 修复了以下 bug:如果服务器端插入的 DAI 直播没有前贴片广告,则在播放到最后一个中贴片广告之后可能会导致
ArrayIndexOutOfBoundsException(#1741)。
- 修复了以下 bug:清除播放列表可能会导致
- 会话:
- 添加了
MediaButtonReceiver.shouldStartForegroundService(Intent),以允许应用通过替换此方法来禁止传入的用于恢复播放的播放命令。默认情况下,服务始终处于启动状态,并且在系统因ForegroundServiceDidNotStartInTimeException而使服务崩溃之前,无法抑制播放 (#1528)。 - 修复了以下 bug:当连接到旧版服务时,导致从
MediaBrowser发送的自定义命令被调度到MediaSessionCompat.Callback而不是方法的MediaBrowserServiceCompat变体。这导致MediaBrowser无法接收旧版服务发回的实际返回值 (#1474)。 - 处理了在为媒体按钮 intent 设置广播接收器时,某些制造商的设备抛出的
IllegalArgumentException(#1730)。 - 为媒体内容添加了命令按钮。这会添加 Media3 API,以支持之前称为
Custom browse actions的旧版库(使用MediaBrowserCompat)。请注意,对于MediaBrowser和MediaController,Media3 命令按钮均可用于媒体项。请参阅实现自定义浏览操作。 - 修复了以下 bug:Media3 控制器有时无法在请求
play()后让会话应用启动前台服务。 - 将
CommandButton.Builder.setIconUri限制为仅接受内容 URI。 - 在连接到旧版
MediaBrowserCompat时,将 Media3 浏览器的连接提示传递给初始MediaBrowserCompat。该服务可以通过首次调用onGetRoot()来接收作为根提示传入的连接提示。 - 修复了以下 bug:当
MediaBrowser连接到旧版浏览器服务时,在浏览器订阅parentid后,MediaBrowser未收到服务发送的错误。 - 改进了互操作性行为,以便连接到旧版
MediaBrowserService的 Media3 浏览器在订阅父级时不会两次请求parentId的子级。
- 添加了
- 界面:
- 由于基于 XML 的共享过渡存在问题,因此选择启用
PlayerView-in-Compose-AndroidView解决方法,以处理拉伸/裁剪视频的问题。在AndroidView内使用PlayerView的应用需要调用PlayerView.setEnableComposeSurfaceSyncWorkaround才能选择启用 (#1237、#1594)。 - 向
PlayerView添加了setFullscreenButtonState,以允许按需更新全屏按钮的图标,即带外更新,而不是对点击互动做出反应式更新 (#1590、#184)。 - 修复了以下 bug:如果存在应用定义的文字轨道选择偏好设置,则文字选择中的“无”选项无法正常运行。
- 由于基于 XML 的共享过渡存在问题,因此选择启用
- DASH 扩展程序:
- 添加了对从细分中间开始的周期的支持 (#1440)。
- Smooth Streaming 扩展:
- 修复了播放带有文本轨道的 SmoothStreaming 流时出现的
Bad magic number for Bundle错误 (#1779)。
- 修复了播放带有文本轨道的 SmoothStreaming 流时出现的
- RTSP 扩展程序:
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- 添加 IAMF 解码器模块,该模块支持使用 libiamf 原生库合成音频来播放包含 IAMF 轨道的 MP4 文件。
- 播放功能已启用,支持立体声布局和 5.1 声道空间化,还可选择启用头部追踪功能,但目前不支持双耳播放。
- 为 Android 15 上的解码器扩展程序添加了 16 KB 页面支持 (#1685)。
- 添加 IAMF 解码器模块,该模块支持使用 libiamf 原生库合成音频来播放包含 IAMF 轨道的 MP4 文件。
- 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:
- 修复了在播放 L1 Widevine 内容的 API 31 及更高版本的设备上出现的
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE错误。此错误是由框架MediaDrm.requiresSecureDecoder方法 (#1603) 的实现不完整导致的。
- 修复了在播放 L1 Widevine 内容的 API 31 及更高版本的设备上出现的
- 效果:
- 向
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 脱糖的编译依赖项 (#1312)。
- 确保对于非图片
MediaItem,系统会忽略传递给MediaItem.Builder.setImageDurationMs()的时长(如文档中所述)。 - 添加了
Format.customData以存储应用提供的有关Format实例的自定义信息。
- 将假定为无操作的搜索调用转发到受保护的
- ExoPlayer:
- 添加
BasePreloadManager,用于根据多个来源的rankingData定义的优先级来协调预加载。您可以通过扩展此类进行自定义。添加了DefaultPreloadManager,该方法使用PreloadMediaSource将来源的媒体样本预加载到内存中,并使用一个整数rankingData来指示界面上某个项的索引。 - 向
LoadControl的大多数方法添加了PlayerId,以使LoadControl实现能够支持多名玩家。 - 移除了
Buffer.isDecodeOnly()和C.BUFFER_FLAG_DECODE_ONLY。无需设置此标志,因为渲染器和解码器会根据时间戳决定是否跳过缓冲区。自定义Renderer实现应检查缓冲时间是否至少为BaseRenderer.getLastResetPositionUs(),以决定是否应显示示例。自定义SimpleDecoder实现可以根据需要检查isAtLeastOutputStartTimeUs(),也可以使用DecoderOutputBuffer.shouldBeSkipped标记其他缓冲区以跳过它们。 - 允许
TargetPreloadStatusControl.getTargetPreloadStatus(T)返回 null 值,以指示不使用给定的rankingData预加载MediaSource。 - 将
remove(MediaSource)添加到BasePreloadManager中。 - 向
BasePreloadManager添加reset()以释放所有保留的来源,同时保留预加载管理器实例。 - 添加了
ExoPlayer.setPriority()(和Builder.setPriority()),用于定义PriorityTaskManager中使用的优先级值,以及自 API 35 起的 MediaCodec 重要性。 - 修复了更新上次重新缓冲时间时导致 CMCD 中
bs(缓冲区饥饿)键不正确的问题 (#1124)。 - 添加
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)以指示来源已加载到末尾。这样一来,DefaultPreloadManager和自定义PreloadMediaSource.PreloadControl实现就可以预加载下一个来源或执行其他操作。 - 修复了以下 bug:在项末尾跳过静音时,可能会触发播放异常。
- 向
PreloadMediaSource添加clear以舍弃预加载期。 - 添加了新的错误代码
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED,当回收编解码器资源以用于更高优先级的任务时,会使用该错误代码。 - 允许
AdsMediaSource在初始内容媒体准备完成之前加载前贴片广告 (#1358)。 - 修复了以下 bug:在从清单中移除原始时段后重新准备多时段 DASH 直播时,播放会移至
STATE_ENDED。 - 将
PreloadMediaSource.PreloadControl中的onTimelineRefreshed()重命名为onSourcePrepared(),并将onPrepared()重命名为onTracksSelected()。同时相应地重命名DefaultPreloadManager.Stage中的 IntDef。 - 添加了对动态调度的实验性支持,以更好地使工作与 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)。
- 添加
- 转换器:
- 向
ExportResult添加了audioConversionProcess和videoConversionProcess,用于指明输出文件中相应轨道是如何制作的。 - 放宽了剪辑优化 H.264 级别检查。
- 添加了对在序列中更改 SDR 和 HDR 输入媒体的支持。
- 添加了对合成级音频效果的支持。
- 添加了对将 Ultra HDR 图片转码为 HDR 视频的支持。
- 修复了以下问题:在重置并重新使用后,
DefaultAudioMixer不会输出正确的字节数。 - 解决了解码器在处理 PCM 输入时音频声道数上限为立体声的 bug。
- 在
ExoPlayerAssetLoader中选择轨道时,请忽略音频通道数限制,因为这些限制仅适用于播放。 - 将
androidx.media3.transformer.Muxer接口替换为androidx.media3.muxer.Muxer并移除androidx.media3.transformer.Muxer。 - 修复了从内容 URI 方案加载 HEIC 图片的问题。 (#1373)。
- 在
AudioGraphInput中调整音轨时长,以改善影音同步效果。 - 移除
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中的 bug,即不同音频格式(例如立体声到单声道)之间的过渡可能会导致处理器抛出异常 (#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)。
- 修复了当 WebVTT 字幕样本不包含任何提示(例如,作为 DASH 流的一部分)时,来自
LegacySubtitleUtil的IllegalArgumentException(#1516)。
- 元数据:
- 图片:
- 添加了对非正方形 DASH 缩略图网格的支持 (#1300)。
- 为 API 34 及更高版本添加了对 AVIF 的支持。
- 允许将
null作为ExoPlayer.setImageOutput()的参数来清除之前设置的ImageOutput。
- DataSource:
- 实现对
android.resource://package/id原始资源 URI 的支持,其中package与当前应用的软件包不同。之前未记录此方法有效,但与按名称访问其他软件包中的资源相比,此方法更高效。 - 在
DataSpec构造函数中急切地检查url是否为非 null。此形参已添加注释,表示其不得为 null。 - 允许
ByteArrayDataSource在open()期间将 URI 解析为字节数组,而不是在构建时进行硬编码 (#1405)。
- 实现对
- DRM:
- 允许在
DefaultDrmSessionManagerProvider上设置LoadErrorHandlingPolicy(#1271)。
- 允许在
- 效果:
- 支持在
SpeedChangeEffect的同一EditedMediaItem或Composition中进行多次速度更改。 - 支持从 Ultra 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结合使用时崩溃的 bug (#821)。 - 将默认 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。还提供了保留原始色彩空间的第三个选项。
- 允许定义 EditedMediaItemSequences 的不确定 z 顺序 (#1055)。
- 在不同的 HDR 内容片段中保持一致的亮度范围(使用 HLG 范围)。
- 添加了对 HDR 内容上的 Ultra HDR(位图)叠加层的支持。
- 允许在 API 26 之前使用
SeparableConvolution效果。 - 移除了未使用的
OverlaySettings.useHdr,因为叠加层和帧的动态范围必须一致。 - 为
TextOverlay添加了 HDR 支持。可以使用OverlaySettings.Builder.setHdrLuminanceMultiplier()调整文字叠加层的亮度。
- 支持在
- IMA 扩展程序:
- 将应用播放 DAI 广告流所需的 API 升级为稳定版。
- 向
ImaServerSideAdInsertionMediaSource.AdLoader添加了replaceAdTagParameters(Map <String, String>),以便在运行时替换广告代码参数。 - 修复了以下 bug:在广告播放期间发生播放器错误时,未调用
VideoAdPlayer.VideoAdPlayerCallback.onError()(#1334)。 - 将 IMA SDK 版本提升至 3.33.0,以修复使用
data://广告代码 URI 时出现的NullPointerException问题 (#700)。
- 会话:
- 将
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()的 extra 传播到 media1 控制器的PlaybackStateCompat.getExtras()。 - 将严重错误和非严重错误映射到平台会话和从平台会话映射。
PlaybackException映射到PlaybackStateCompat的严重错误状态。发送到媒体通知控制器的SessionError(带有MediaSession.sendError(ControllerInfo, SessionError))会映射到PlaybackStateCompat中的非致命错误,这意味着系统会设置错误代码和消息,但平台会话的状态与STATE_ERROR保持不同。 - 允许按控制器设置会话 activity 以替换全局会话 activity。可以在连接时通过创建具有
AcceptedResultBuilder.setSessionActivivty(PendingIntent)的ConnectionResult为控制器定义会话 activity。连接后,可以使用MediaSession.setSessionActivity(ControllerInfo, PendingIntent)更新会话活动。 - 改进了对
MediaLibrarySession.Callback的调用中的错误复制。 现在,您可以使用MediaLibrarySession.Builder.setLibraryErrorReplicationMode()配置错误复制,以选择错误类型或选择停用默认开启的错误复制。
- 将
- 界面:
- 下载内容:
- 确保
DownloadHelper不会泄漏未释放的Renderer实例,这最终可能会导致应用因IllegalStateException: Too many receivers, total of 1000, registered for pid而崩溃 (#1224)。
- 确保
- Cronet 扩展程序:
- 修复了
CronetDataSource中的SocketTimeoutException。在某些版本的 Cronet 中,回调提供的请求并不总是相同的。这会导致回调未完成,请求超时 (https://issuetracker.google.com/328442628)。
- 修复了
- HLS 扩展程序:
- 修复了以下 bug:等待不连续性的待处理 EMSG 样本在
HlsSampleStreamWrapper中以错误的偏移量进行委托,导致出现IndexOutOfBoundsException或IllegalArgumentException(#1002)。 - 修复了非主播放列表针对 LL-HLS 流不断重新加载的 bug (#1240)。
- 修复了以下 bug:为具有初始化段的 HLS 启用 CMCD 会导致
Source Error和IllegalArgumentException。 - 修复了在直播期间未刷新非主要播放播放列表的 bug (#1240)。
- 修复了以下 bug:为 HLS 直播启用 CMCD 会导致
ArrayIndexOutOfBoundsException(#1395)。
- 修复了以下 bug:等待不连续性的待处理 EMSG 样本在
- DASH 扩展程序:
- Cast 扩展程序:
- 修复了将
MediaQueueItem的专辑标题转换为 Media3 媒体项中的艺术家的 bug (#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.FormatSupportIntDef 和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:
- 转换器:
- 添加了针对以下异常的解决方法:在 API 30 之前,由于
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 的色调映射。
- 会话:
- 界面:
- 如果
Locale无法识别显示名称,则回退到包含音轨语言名称 (#988)。
- 如果
- DASH 扩展程序:
- 将清单中的所有
Label元素填充到Format.labels中 (#1054)。
- 将清单中的所有
- RTSP 扩展程序:
- 在 SDP 解析中跳过空的会话信息值(i-tag)(#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 依赖项所必需的。 - 当
MediaMetadata.Builder.populate(MediaMetadata)中的artworkUri和artworkData至少有一个不为 null 时,填充这两个字段 (#964)。
- 实现对
- ExoPlayer:
- 添加了
PreloadMediaSource和PreloadMediaPeriod,允许应用在播放之前预加载特定起始位置的内容媒体源。PreloadMediaSource负责准备内容媒体源以接收Timeline,准备并缓存给定起始位置的周期,选择轨道并加载该周期的媒体数据。应用通过实现PreloadMediaSource.PreloadControl来控制预加载进度,并将预加载的来源设置为播放器的播放来源。 - 添加了
ExoPlayer.setImageOutput,允许应用设置ImageRenderer.ImageOutput。 DefaultRenderersFactory现在默认向播放器提供ImageRenderer,其中ImageOutput和ImageDecoder.Factory.DEFAULT为 null。- 在跳过静音时,发出
Player.Listener.onPositionDiscontinuity事件 (#765)。 - 添加了对在提取期间解析字幕的实验性支持。您可以使用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()启用此功能。 - 支持使用
PreloadMediaSource的自适应媒体源。 - 使用 HttpEngine API 实现
HttpEngineDataSource(一种使用HttpDataSource的 HttpEngine)。 - 防止子类化
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)。
- 添加了
- 转换器:
- 轨道选择:
- 添加了
DefaultTrackSelector.selectImageTrack以启用图片轨道选择。 - 添加
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled以确定在同时提供图片轨道和视频轨道的情况下,是否选择图片轨道。默认值为false,表示优先选择视频轨道。
- 添加了
- 提取器:
- 向 MP4 提取器添加了额外的 AV1C 解析,以检索
ColorInfo.colorSpace、ColorInfo.colorTransfer和ColorInfo.colorRange值 (#692)。 - MP3:使用恒定比特率 (CBR) 搜索具有
Info标头(相当于Xing标头的 CBR)的文件。之前我们使用Info标头中的搜索表,但这样会导致搜索精度不如忽略该标头并假设文件为 CBR 时高。 - MPEG2-TS:添加了 DTS、DTS-LBR 和 DTS:X Profile2 支持 (#275)。
- 从 TS 描述符中提取音频类型并将其映射到角色标志,从而让用户做出更明智的音频轨道选择 (#973)。
- 向 MP4 提取器添加了额外的 AV1C 解析,以检索
- 音频:
- 视频:
- 更改采用
VideoFrameProcessor.Factory实参的MediaCodecVideoRenderer构造函数,并将其替换为采用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 广告。
- 会话:
- 针对 TV 应用停用双击检测 (#962)。
- 修复了仅包含非 null extra 的
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:
- 转换器:
- 解决以下问题:由于设置了较高的运行速率,编码器会在配置时抛出异常。
- 提取器:
- 音频:
- 修复了多次调用
SilenceSkippingAudioProcessor时对 EOS 的处理 (#712)。
- 修复了多次调用
- 视频:
- 针对 Galaxy Tab S7 FE、Chromecast with Google TV 和 Lenovo M10 FHD Plus 上导致 60fps AVC 流被标记为不受支持的设备问题添加了解决方法 (#693)。
- 元数据:
- 修复了
MediaMetadata仅从具有大写键的 Vorbis 注释填充的 bug (#876)。 - 在解析非常大的 ID3 帧时捕获
OutOfMemoryError,这意味着播放可以继续,而不会因标记信息而完全失败。
- 修复了
- DRM:
- 将针对虚假 ClearKey
https://default.url许可网址的权变措施扩展到 API 33 及更高版本(之前该权变措施仅适用于 API 33)(#837)。 - 修复了以下问题:在没有附加到播放器的 surface 的情况下,从加密内容切换到非加密内容时,出现
ERROR_DRM_SESSION_NOT_OPENED。此错误是由于错误地使用安全解码器来播放未加密内容所致。
- 将针对虚假 ClearKey
- 会话:
- 界面:
- 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 兼容性问题,即未将可为 null 的泛型类型形参和可为 null 的数组元素类型检测为可为 null。例如,
TrackSelectorResult和SimpleDecoder方法参数 (#6792)。 - 更改
Util.shouldShowPlayButton中的默认界面和通知行为,以在播放暂时受到抑制(例如,由于音频焦点暂时丢失)时显示“播放”按钮。可以使用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)。
- 通过
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput启用此功能后,添加了对不合适的音频输出设备(例如 Wear OS 设备上的内置扬声器)的播放抑制。如果尝试在没有合适的音频输出时播放,或者在播放期间所有合适的输出都断开连接,播放抑制原因将更新为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实参。
- 转换器:
- 解析图片输入的 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 经典版支持。
- 音频:
- 添加了对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析了 MP4 中
lpcm的 PCM 编码。 - 添加了对提取 MP4 中的 Vorbis 音频的支持。
- 添加了
AudioSink.getFormatOffloadSupport(Format),用于通过DefaultAudioOffloadSupportProvider检索 sink 可以为格式提供的分流支持级别。它会返回包含isFormatSupported、isGaplessSupported和isSpeedChangeSupported的新AudioOffloadSupport。 - 添加
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类。 - 将
onAudioTrackInitialized和onAudioTrackReleased回调添加到AnalyticsListener、AudioRendererEventListener和AudioSink.Listener。 - 修复了 DTS Express 音频缓冲区下溢问题 (#650)。
- 修复了以下 bug:E-AC3-JOC 的功能检查会抛出
IllegalArgumentException(#677)。
- 添加了对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析了 MP4 中
- 视频:
- 允许
MediaCodecVideoRenderer使用自定义VideoFrameProcessor.Factory。 - 修复了以下 bug:如果音频流以负时间戳开头,则无法渲染第一帧 (#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 扩展程序:
- 修复了以下 bug:播放列表中不是第一个项目的多周期 DASH 直播可能会抛出异常 (#571)。
- 在调用
AdsLoader.destroy()之前释放 StreamManager - 将 IMA SDK 版本提升至 3.31.0。
- 会话:
- 在
DefaultMediaNotificationProvider中将通知前台服务行为设置为FOREGROUND_SERVICE_IMMEDIATE(#167)。 - 仅在 API 31 以上使用
android.media.session.MediaSession.setMediaButtonBroadcastReceiver(),以避免三星设备上已弃用的 API 出现问题 (#167)。 - 使用媒体通知控制器作为代理来设置可用的命令和用于填充通知和平台会话的自定义布局。
- 转换由 Media3 中的
MediaSessionService.onStartCommand()接收的媒体按钮事件,而不是将这些事件路由到平台会话并返回到 Media3。这样一来,调用方控制器始终是媒体通知控制器,应用可以在所有受支持的 API 级别上轻松识别来自通知的调用。 - 修复了连接到旧版
MediaSessionCompat时MediaController.getCurrentPosition()不前进的 bug。 - 添加了
MediaLibrarySession.getSubscribedControllers(mediaId)以方便使用。 - 替换
MediaLibrarySession.Callback.onSubscribe()以断言控制器订阅的父 ID 的可用性。如果成功,则接受订阅并立即调用notifyChildrenChanged()以通知浏览器 (#561)。 - 为 Automotive OS 添加了会话演示模块,并为 Android Auto 启用了会话演示。
- 当
COMMAND_GET_TIMELINE不适用于媒体通知控制器时,请勿设置框架会话的队列。如果 Android Auto 作为客户端控制器从框架会话中读取数据,则会导致 Android Auto 界面中的queue按钮不显示 (#339)。 - 默认使用
DataSourceBitmapLoader而不是SimpleBitmapLoader(#271、#327)。 - 添加了
MediaSession.Callback.onMediaButtonEvent(Intent),允许应用替换默认的媒体按钮事件处理。
- 在
- 界面:
- 为 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 扩展程序:
- 允许在分段模板网址中包含多个相同的 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 制品库的 bug。相应制品已重命名为
media3-exoplayer-midi(#734)。
- Leanback 扩展:
- 修复了停用 Surface 可能会导致 Leanback 代码中出现
ArithmeticException的 bug (#617)。
- 修复了停用 Surface 可能会导致 Leanback 代码中出现
- 测试实用程序:
- 使
TestExoPlayerBuilder和FakeClock与 Espresso 界面测试和 Compose 界面测试兼容。此版本修复了在 Espresso 或 Compose 视图互动期间播放以不确定方式前进的 bug。
- 使
- 移除了已废弃的符号:
- 移除了
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的 bug (#538)。
- 修复了在播放非常短的文件时
- 音频分流:
- 根据 RFC 7845,将 Ogg ID 标头和注释标头页面附加到比特流,以实现分流的 Opus 播放。
- 视频:
- 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通过以下方式创建VolumeProviderCompat的问题:通过旧版命令(COMMAND_ADJUST_DEVICE_VOLUME和COMMAND_SET_DEVICE_VOLUME)和新命令(COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS和COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)确定volumeControlType(#554)。
- 向控制器的状态添加自定义布局,并提供用于访问该布局的 getter。当自定义布局发生变化时,系统会调用
版本 1.1.0
2023 年 7 月 5 日
- 通用库:
- 添加了不合适的音频路线的抑制原因,并在准备就绪时播放 更改了抑制时间过长的原因。 (#15)。
- 向播放器添加命令:
COMMAND_GET_METADATACOMMAND_SET_PLAYLIST_METADATACOMMAND_SET_DEVICE_VOLUME_WITH_FLAGSCOMMAND_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.Builder.setMediaSourceFactory(MediaSource.Factory)。 请改用ExoPlayerAssetLoader.Factory(MediaSource.Factory)和Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)。 - 移除了
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)。 - 修复了以下 bug:如果在输入帧等待处理时视频流结束信号发出,转换可能会卡住(导致混合器超时)。
- 通过
MediaCodecList查询编解码器,而不是使用findDecoder/EncoderForFormat实用程序,以扩大支持范围。 - 移除了
DefaultEncoderFactory中的 B 帧配置,因为该配置在某些设备上无法正常运行。
- 移除
- 轨道选择:
- 添加了
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange(默认处于停用状态)。启用后,当渲染器功能发生变化时,DefaultTrackSelector将触发新的轨道选择。
- 添加了
- 提取器:
- 音频:
- 修复了以下 bug:当隧道传输处于启用状态且
AudioProcessors处于有效状态时,某些播放会失败,例如无缝剪辑 (#10847)。 - 在直接播放(分流)中将 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)。
- 修复了以下 bug:当隧道传输处于启用状态且
- 视频:
- 使
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)。
- 修复了以下 bug:由于连续时间轴中计算出的内容位置略有不同,导致在直播中插入了新的广告组。
- 会话:
- 添加辅助方法
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)。
- 添加辅助方法
- 界面:
- 添加了实用程序方法
shouldShowPlayButton和handlePlayPauseButtonAction,用于编写带有播放/暂停按钮的自定义界面元素。
- 添加了实用程序方法
- RTSP 扩展程序:
- DASH 扩展程序:
- 针对多周期 DASH 流,从
MediaLoadData.startTimeMs和MediaLoadData.endTimeMs中移除了媒体时间偏移量。 - 修复了重新准备多周期直播 DASH 媒体源时出现
IndexOutOfBoundsException的 bug (#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参数的选项。 - 移除了已废弃的字符集 String 常量(
ASCII_NAME、UTF8_NAME、ISO88591_NAME、UTF16_NAME和UTF16LE_NAME),改用kotlin.text软件包、java.nio.charset.StandardCharsets或com.google.common.base.Charsets中的 Kotlin 字符集。 - 移除了已弃用的
WorkManagerScheduler构造函数,改用未弃用的构造函数,该构造函数包含提供Context参数的选项。 - 移除了用于实例化
Format类的弃用方法createVideoSampleFormat、createAudioSampleFormat、createContainerFormat和createSampleFormat。请改用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)。 - 移除了 4 个已废弃的
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时,MediaController不会更新其可用命令。 - 修复了以下 bug:在 API 30 上,当系统界面调用
Callback.onGetLibraryRoot时,如果params.isRecent == true为MediaLibraryService,则MediaLibraryService无法返回 null (#355)。 - 修复了
MediaSessionService或MediaLibraryService的内存泄漏问题 (#346)。 - 修复了以下 bug:
MediaSession中同时包含Timeline和位置更新可能会导致MediaController抛出IllegalStateException。
- 修复了以下问题:当
版本 1.0.1
2023 年 4 月 18 日
发布了 androidx.media3:media3-*:1.0.1。版本 1.0.1 中包含这些提交内容。
此版本与 ExoPlayer 2.18.6 版本相对应。
- 核心库:
- 在跳转到默认位置时,重置目标直播替换项 (#11051)。
- 修复了媒体中空白的样本流可能导致播放卡住的 bug。
- 会话:
- 修复了以下 bug:旧版
MediaSessionCompat发布的多个相同队列项会导致MediaController中出现异常 (#290)。 - 添加了将
MediaSession.broadcastCustomCommand转发到旧版MediaControllerCompat.Callback.onSessionEvent的缺失功能 (#293)。 - 修复了调用
MediaSession.setPlayer不会更新可用命令的 bug。 - 修复了以下问题:如果从
MediaController发送的TrackSelectionOverride实例引用了具有Format.metadata的群组,则会被忽略 (#296)。 - 修复了以下问题:需要
Player.COMMAND_GET_CURRENT_MEDIA_ITEM才能通过旧版MediaSessionCompat访问元数据。 - 修复了以下问题:当在
MediaSessionService中使用后台线程上的MediaSession实例时,会导致崩溃 (#318)。 - 修复了以下问题:库声明了媒体按钮接收器,但应用并非有意为之 (#314)。
- 修复了以下 bug:旧版
- DASH:
- 修复了对空白细分时间轴的处理问题 (#11014)。
- RTSP:
- 如果使用 UDP 的 RTSP 设置因 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 格式映射到
- Cast:
- 修复了在媒体项之间过渡时出现的瞬态
STATE_IDLE问题 (#245)。
- 修复了在媒体项之间过渡时出现的瞬态
- RTSP:
- 捕获在解析无效 RTSP Describe 响应消息时抛出的 IllegalArgumentException (#10971)。
- 会话:
- 修复了通知播放/暂停按钮未随播放器状态更新的 bug (#192)。
- IMA 扩展程序:
- 修复了以下 bug:由于未收到第一个(也是唯一一个,如果没有任何广告)
LOADED事件,导致没有任何广告的 DAI 流无法启动。
- 修复了以下 bug:由于未收到第一个(也是唯一一个,如果没有任何广告)
版本 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),则抛出
- 音频:
- 使用压缩音频格式比特率来计算直接播放(直通)中
AudioTrack的最小缓冲区大小。
- 使用压缩音频格式比特率来计算直接播放(直通)中
- 文本:
- 修复了当字幕文件不包含任何提示时,向
Subtitle.getEventTime传递无效(负数)索引的TextRenderer。 - SubRip:如果 UTF-16 文件以字节顺序标记开头,请添加对此类文件的支持。
- 修复了当字幕文件不包含任何提示时,向
- 元数据:
- 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
- 添加了
MediaMetadata.mediaType,以指示内容类型或元数据描述的文件夹类型。 - 添加了
MediaMetadata.isBrowsable,以替代MediaMetadata.folderType。下一个版本中将废弃文件夹类型。
- DASH:
- 为图片适配集添加了完整的解析,包括图块计数 (#3752)。
- 界面:
- 会话:
- 添加了抽象
SimpleBasePlayer,以帮助为自定义播放器实现Player接口。 - 添加了辅助方法,用于将平台会话令牌转换为 Media3
SessionToken(#171)。 - 使用
onMediaMetadataChanged来触发平台媒体会话的更新 (#219)。 - 将媒体会话添加为
DefaultMediaNotificationProvider的getMediaButtons()的参数;为清楚起见,还使用了不可变列表 (#216)。 - 添加了
onSetMediaItems回调监听器,以便修改/设置MediaItem列表,同时按会话启动索引和位置,然后再设置到播放器上 (#156)。 - 避免针对非蓝牙媒体按钮事件执行两次点按检测 (#233)。
- 提高了
QueueTimeline在出现可疑的旧版会话状态时的稳健性 (#241)。
- 添加了抽象
- 元数据:
- 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
- 添加了
MediaMetadata.mediaType,以指示内容类型或元数据描述的文件夹类型。 - 添加了
MediaMetadata.isBrowsable,以替代MediaMetadata.folderType。下一个版本中将废弃文件夹类型。
- Cast 扩展程序:
- 将 Cast SDK 版本升级到 21.2.0。
- IMA 扩展程序:
- 移除了应用线程上
ImaServerSideAdInsertionMediaSource的播放器监听器,以避免出现线程问题。 - 为
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder添加focusSkipButtonWhenAvailable属性,以请求将 TV 设备上的“跳过”按钮设置为焦点,并将其默认设置为 true。 - 将
focusSkipButton()方法添加到ImaServerSideAdInsertionMediaSource.AdsLoader,以便通过程序化方式请求将“跳过”按钮设置为焦点。 - 将 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)。 - 在播放因可用内存不足而卡住之前舍弃返回缓冲区。
- 在已启用分流的情况下关闭用于跟踪“doSomeWork”块的功能。
- 修复了
PlaybackStatsListener中快速跳转的会话跟踪问题 (#180)。 - 在单项播放列表中调用
seekToNext或seekToPrevious时,发送缺失的onMediaItemTransition回调 (#10667)。 - 添加了
Player.getSurfaceSize,用于返回呈现视频时所用 Surface 的大小。 - 修复了在播放器释放期间移除监听器可能会导致
IllegalStateException的 bug (#10758)。
- 添加了
- build:
- 强制执行最低
compileSdkVersion以避免编译错误 (#10684)。 - 避免于包含在另一 Gradle build 中时发布块。
- 强制执行最低
- 轨道选择:
- 如果显示设备不支持杜比视界,请改选轨道。 (#8944)。
- 下载内容:
- 视频:
- 如果显示设备不支持杜比视界,请尝试改用替代解码器。 (#9794)。
- 音频:
- 使用
SingleThreadExecutor释放AudioTrack实例,以免同时释放多个播放器时出现 OutOfMemory 错误 (#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 实现中会返回非空但无效许可网址的 bug。
- 修复了在播放列表中的 DRM 方案之间切换时(例如从 Widevine 切换为 ClearKey)出现的
setMediaDrmSession failed: session not opened错误。
- 文本:
- CEA-608:确保正确处理字段 2 上的服务切换命令 (#10666)。
- DASH:
- 从清单中解析
EventStream.presentationTimeOffset(#10460)。
- 从清单中解析
- 界面:
- 使用播放器的当前替换值作为
TrackSelectionDialogBuilder中的预设值 (#10429)。
- 使用播放器的当前替换值作为
- 会话:
- 确保命令始终以正确顺序执行,即使某些命令需要异步解析也是如此 (#85)。
- 添加了
DefaultMediaNotificationProvider.Builder以构建DefaultMediaNotificationProvider实例。构建器可以配置提供程序使用的通知 ID、通知渠道 ID 和通知渠道名称。此外,还添加了方法DefaultMediaNotificationProvider.setSmallIcon(int)以设置通知小图标。(#104)。 - 确保不会丢弃在
MediaController.release()之前发送的命令 (#99)。 SimpleBitmapLoader可以从file://URI 加载位图 (#108)。- 修复了阻止
MediaController在一段时间内查找广告的断言 (#122)。 - 播放结束后,系统会从前台停止
MediaSessionService,并显示通知以重新开始播放最近播放过的媒体项 (#112)。 - 不启动具有待处理的暂停 intent 的前台服务 (#167)。
- 手动隐藏与
DefaultNotificationProvider在 API 26 和 API 27 上创建的通知关联的“标记”(在 API 28 及更高级别上,标记会自动隐藏)(#131)。 - 修复了从旧版 MediaSession 到 Media3 MediaController 的第二项 binder 连接导致 IllegalStateException 的 bug (#49)。
- RTSP:
- IMA:
- FFmpeg 扩展程序:
- 添加了新的必需标志,以将 FFmpeg 库与 NDK 23.1.7779620 及更高版本关联 (#9933)。
- AV1 扩展程序:
- 更新了 CMake 版本,以免与最新的 Android Studio 版本不兼容 (#9933)。
- Cast 扩展程序:
- 实现了
getDeviceInfo(),以便能在使用MediaController控制播放时识别CastPlayer(#142)。
- 实现了
- 转换器:
- 添加了多路复用器监控定时器,以检测生成输出样本的速度是否过慢。
- 移除了已废弃的符号:
- 移除了
Transformer.Builder.setOutputMimeType(String)。此功能已被移除。使用默认多路复用器时,MIME 类型将始终为 MP4 格式。
- 移除了
版本 1.0.0-beta02
2022 年 7 月 21 日
发布了 androidx.media3:media3-*:1.0.0-beta02。版本 1.0.0-beta02 中包含这些提交内容。
此版本与 ExoPlayer 2.18.1 版本相对应。
- 核心库:
- 确保使用
ExoPlayer.setShuffleOrder更改ShuffleOrder后会导致使用reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED对Player.Listener#onTimelineChanged进行调用 (#9889)。 - 对于渐进式媒体,仅在缓冲位置添加所选轨道 (#10361)。
- 允许将自定义日志记录器用于所有 ExoPlayer 日志输出 (#9752)。
- 修复了在
DefaultMediaSourceFactory中实现setDataSourceFactory的问题,后者以前在某些情况下无法正常运行 (#116)。
- 确保使用
- 提取器:
- DASH:
- 从清单中解析 ClearKey 许可网址 (#10246)。
- 界面:
- 确保 TalkBack 在播放控件菜单中公布当前有效的速度选项 (#10298)。
- RTSP:
- 添加了 VP8 碎片化数据包处理机制 (#110)。
- Leanback 扩展:
- 监听
LeanbackAdapter中的playWhenReady更改 (10420)。
- 监听
- Cast:
版本 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时轨道重置太频繁的 bug,例如侧载 (side-loading) 字幕和播放过程中更改所选字幕时 (#10248)。 - 停止在 API 29 和 30 上检测 5G-NSA 网络类型。这些播放将假设使用 4G 网络。
- 禁止将
null传递给MediaSource.Factory.setDrmSessionManagerProvider和MediaSource.Factory.setLoadErrorHandlingPolicy。如果需要,可以显式传递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。这包括“取消废弃” (un-deprecating)Player.Listener.onTracksChanged方法名称,但使用的是不同的参数类型。 - 更改了
DefaultTrackSelector.buildUponParameters和DefaultTrackSelector.Parameters.buildUpon以返回DefaultTrackSelector.Parameters.Builder,而不是已废弃的DefaultTrackSelector.ParametersBuilder。 - 添加了
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities(默认处于启用状态)。启用后,DefaultTrackSelector会优先选用声道数不超过设备输出功能的音轨。在手持设备上,DefaultTrackSelector会优先选用立体声/单声道,而非多声道音频格式,除非该多声道格式可以空间化(Android 12L 及更高版本)或属于杜比环绕声格式。此外,在支持音频空间化的设备上,DefaultTrackSelector将监控空间化程序属性的变化,并在出现这些变化时触发新的音轨选择。具有television界面模式的设备不受这些限制的约束,系统会优先选用声道数最多的格式。如需启用此功能,必须使用Context构建DefaultTrackSelector实例。
- 已将
- 视频:
- 已将
DummySurface重命名为PlaceholderSurface。 - 为
MediaCodecVideoRenderer.getCodecMaxInputSize添加了 AV1 支持。
- 已将
- 音频:
- 使用宣传非标准 MIME 类型的 LG AC3 音频解码器。
- 将
AudioAttributes.getAudioAttributesV21()的返回值类型从android.media.AudioAttributes更改为新的AudioAttributesV21封装容器类,以防止 ART 验证速度在级别低于 21 的 API 上变慢。 - 对平台(级别为 29 及以上的 API)进行查询,或在未设置格式声道数的情况(在启用 HLS 无块准备时会发生)下对音频透传的音频编码声道数进行假设 (10204)。
- 解码器输出为 12 声道 PCM 音频时使用声道掩码
AudioFormat.CHANNEL_OUT_7POINT1POINT4来配置AudioTrack(#10322)。
- DRM
- 确保格式更改后始终能够立即正确更新 DRM 会话 (10274)。
- 文本:
- 更改了
Player.getCurrentCues()以返回CueGroup,而不是List<Cue>。 - SSA:支持
BorderStyle == 3(即OutlineColour设置 cue 文件的背景)时的OutlineColour样式设置 (#8435)。 - CEA-708:将数据解析为多个服务块,并忽略与当前所选服务号码无关的块。
- 移除了过去仅用于处理 Google 内部字幕格式的
RawCcExtractor。
- 更改了
- 提取器:
- 界面:
- 修复了
useController=false时将事件传递给PlayerView上设置的OnClickListener的问题 (#9605)。此外,还修复了针对所有视图配置将事件传递给OnLongClickListener的问题。 - 修复了将
ACTION_UP之前退出PlayerView边界的一系列触摸事件错误处理为点击的问题 (#9861)。 - 修复了点按操作可能会切换播放,而不是隐藏控件的
PlayerView无障碍功能问题 (#8627)。 - 重写了
TrackSelectionView和TrackSelectionDialogBuilder,以使用Player接口(而不是ExoPlayer)。这样做将允许视图与其他Player实现一起使用,并移除界面模块对 ExoPlayer 模块的依赖关系。这是一项重大变更。 - 不在
PlayerView轨道选择器中显示强制文字轨道;如果选择了“None”,则保留一个合适的强制文字轨道 (#9432)。
- 修复了
- DASH:
- 解析了 DTS
AudioChannelConfiguration元素中的声道数。这会为 DTS 流重新启用音频透传 (#10159)。 - 禁止将
null传递给DashMediaSource.Factory.setCompositeSequenceableLoaderFactory。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory的实例。
- 解析了 DTS
- HLS:
- 如果播放列表 CODECS 属性不包含音频编解码器,则回退到分块准备 (#10065)。
- 禁止将
null传递给HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory、HlsMediaSource.Factory.setPlaylistParserFactory和HlsMediaSource.Factory.setPlaylistTrackerFactory。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory、DefaultHlsPlaylistParserFactory或对DefaultHlsPlaylistTracker.FACTORY的引用。
- 流畅的流式传输:
- 禁止将
null传递给SsMediaSource.Factory.setCompositeSequenceableLoaderFactory。如果需要,可以显式传递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.MediaItemFiller替换为MediaSession.Callback.onAddMediaItems,以允许异步解析请求。 - 当
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:
- 将广告轮询频率从每 100 毫秒减少到每 200 毫秒,以便与美国媒体评定委员会 (MRC) 建议保持一致。
- FFmpeg 扩展程序:
- 将 CMake 版本更新为
3.21.0+,以避免 CMake bug 导致 Android Studio 的 Gradle 同步失败 (#9933)。
- 将 CMake 版本更新为
- 移除了已废弃的符号:
- 移除了
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)。改用Player.Listener.onTracksChanged(Tracks)。 - 移除了
Player.getCurrentTrackGroups和Player.getCurrentTrackSelections。改用Player.getCurrentTracks。您也可以继续使用ExoPlayer.getCurrentTrackGroups和ExoPlayer.getCurrentTrackSelections,尽管这些方法已废弃。 - 移除了
DownloadHelperDEFAULT_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 中杜比全景声 (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)。
- 界面:
- DASH:
- HLS:
- RTSP:
- 转换器:
- 将要求的最低 API 版本提高到 21。
TransformationException现已用于描述转换期间发生的错误。- 添加了
TransformationRequest以指定转换选项。 - 允许注册多个监听器。
- 修复了当读取了部分编解码器输出内容时转换器卡住的问题。
- 修复了在释放多路复用器抛出项时
Transformer.getProgress中潜在的 NPE 问题。 - 添加了用于应用转换的演示版应用。
- MediaSession 扩展程序:
- 默认情况下,
MediaSessionConnector现会在停止时清除播放列表。希望保留播放列表的应用可以在连接器上调用setClearMediaItemsOnStop(false)。
- 默认情况下,
- Cast 扩展程序:
- FFmpeg 扩展程序:
- 让
build_ffmpeg.sh依赖于 LLVM(而非 GNU)的 bin utils (#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接口。 - 用于构建媒体播放界面的界面组件。
- 其他库中用于 ExoPlayer 的模块封装功能,例如通过 IMA SDK 插入广告。
如需了解详情,请参阅 Media3 GitHub 项目。
之前,ExoPlayer 托管在单独的 ExoPlayer GitHub 项目中。在 Media3 中,其软件包名称为 androidx.media3.exoplayer。我们计划在一段时间内继续维护和发布 ExoPlayer GitHub 项目,以便让应用有时间迁移到 Media3。Media3 取代了所有 ExoPlayer 模块,但旧版 media2 和 mediasession 扩展程序除外,后者已被新的 media3-session 模块取代。这可以实现播放器和媒体会话之间的直接集成,而无需使用适配器/连接器类。