Media3
最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2023 年 2 月 16 日 | - | 1.0.0-rc01 | - | - |
声明依赖项
如需添加 Media3 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle
文件中添加所需制品的依赖项:
Groovy
dependencies { def media3_version = "1.0.0-rc01" // 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 RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$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 implementation "androidx.media3:media3-ui:$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" // 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 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" }
Kotlin
dependencies { val media3_version = "1.0.0-rc01" // 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 RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$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 implementation("androidx.media3:media3-ui:$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") // 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 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") }
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。您可以使用 Media3 问题跟踪器来查找问题的答案、已知问题和功能请求,以及提交新问题。
版本 1.0.0
版本 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
,尽管这些方法已废弃。 - 移除了
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
和DEFAULT_TRACK_SELECTOR_PARAMETERS
常量。尽可能改用getDefaultTrackSelectorParameters(Context)
,或者使用DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
。 - 移除了构造函数
DefaultTrackSelector(ExoTrackSelection.Factory)
。 改用DefaultTrackSelector(Context, ExoTrackSelection.Factory)
。 - 移除了
Transformer.Builder.setContext
。改为将Context
传递给Transformer.Builder
构造函数。
- 移除了
版本 1.0.0-alpha03
2022 年 3 月 14 日
发布了 androidx.media3:media3-*:1.0.0-alpha03
。版本 1.0.0-alpha03 中包含这些提交内容。
这与 ExoPlayer 2.17.1 版本相对应。
- 音频:
- 修复了 HLS 中杜比全景声 (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
模块取代。这可以实现播放器和媒体会话之间的直接集成,而无需使用适配器/连接器类。