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)。
  • 音频:
    • 使用压缩音频格式比特率来计算直接播放(直通)中 AudioTrack 的最小缓冲区大小。
  • 文本:
    • 修复了当字幕文件不包含任何提示时,向 Subtitle.getEventTime 传递无效(负数)索引的 TextRenderer
    • SubRip:如果 UTF-16 文件以字节顺序标记开头,请添加对此类文件的支持。
  • 元数据:
    • 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
    • 添加了 MediaMetadata.mediaType,以指示内容类型或元数据描述的文件夹类型。
    • 添加了 MediaMetadata.isBrowsable,以替代 MediaMetadata.folderType。下一个版本中将废弃文件夹类型。
  • DASH:
    • 为图片适配集添加了完整的解析,包括图块计数 (#3752)。
  • 界面:
    • 修复了已废弃的 PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener),以确保将可见性更改传递给已注册的监听器 (#229)。
    • 修复了使用从右到左 (RTL) 布局时 PlayerView 内中心播放器控件的排序问题 (#227)。
  • 会话:
    • 添加了抽象 SimpleBasePlayer,以帮助为自定义播放器实现 Player 接口。
    • 添加了辅助方法,用于将平台会话令牌转换为 Media3 SessionToken (#171)。
    • 使用 onMediaMetadataChanged 来触发平台媒体会话的更新 (#219)。
    • 将媒体会话添加为 DefaultMediaNotificationProvidergetMediaButtons() 的参数;为清楚起见,还使用了不可变列表 (#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)。
    • 在单项播放列表中调用 seekToNextseekToPrevious 时,发送缺失的 onMediaItemTransition 回调 (#10667)。
    • 添加了 Player.getSurfaceSize,用于返回呈现视频时所用 Surface 的大小。
    • 修复了在播放器释放期间移除监听器可能会导致 IllegalStateException 的 bug (#10758)。
  • build:
    • 强制执行最低 compileSdkVersion 以避免编译错误 (#10684)。
    • 避免于包含在另一 Gradle build 中时发布块。
  • 轨道选择:
    • 如果显示设备不支持杜比视界,请改选轨道。 (#8944)。
  • 下载内容:
    • 修复了由于使用同一 PriorityTaskManager 同时下载和播放而导致的 ProgressiveDownloader 中潜在的无限循环 (#10570)。
    • 立即显示下载通知 (#183)。
    • 将并行下载移除次数限制为 1 次,以免过度创建线程 (#10458)。
  • 视频:
    • 如果显示设备不支持杜比视界,请尝试改用替代解码器。 (#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:
    • 添加了 H263 碎片化数据包处理机制 (#119)。
    • 添加了对 MP4A-LATM 的支持 (#162)。
  • IMA:
    • 添加了加载广告信息的超时,以处理 IMA SDK 在加载广告时卡住的情况 (#10510)。
    • 阻止在跳转到内容末尾时跳过中贴片广告 (#10685)。
    • 正确计算包含服务器端插入广告的直播(例如 IMA DAI)的窗口时长 (#10764)。
  • 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_CHANGEDPlayer.Listener#onTimelineChanged 进行调用 (#9889)。
    • 对于渐进式媒体,仅在缓冲位置添加所选轨道 (#10361)。
    • 允许将自定义日志记录器用于所有 ExoPlayer 日志输出 (#9752)。
    • 修复了在 DefaultMediaSourceFactory 中实现 setDataSourceFactory 的问题,后者以前在某些情况下无法正常运行 (#116)。
  • 提取器:
    • 修复了解析 H265 短期引用图片集的问题 (#10316)。
    • 修复了解析 esds 框中比特率的问题 (#10381)。
  • DASH:
    • 从清单中解析 ClearKey 许可网址 (#10246)。
  • 界面:
    • 确保 TalkBack 在播放控件菜单中公布当前有效的速度选项 (#10298)。
  • RTSP:
    • 添加了 VP8 碎片化数据包处理机制 (#110)。
  • Leanback 扩展:
    • 监听 LeanbackAdapter 中的 playWhenReady 更改 (10420)。
  • Cast:
    • 把已传递到播放列表方法的 MediaItem 用作 CastTimeline 中的 Window.mediaItem#25#8212)。
    • 使用 CastPlayer 来支持 Player.getMetadata()Listener.onMediaMetadataChanged() (#25)。

版本 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.setDrmSessionManagerProviderMediaSource.Factory.setLoadErrorHandlingPolicy。如果需要,可以显式传递 DefaultDrmSessionManagerProviderDefaultLoadErrorHandlingPolicy 的实例。
    • 添加了 MediaItem.RequestMetadata 来表示在确切 LocalConfiguration 未知的情况下播放媒体所需的元数据。此外,还移除了 MediaMetadata.mediaUrl,因为它现在已包含在 RequestMetadata 中。
    • 添加了 Player.Command.COMMAND_SET_MEDIA_ITEM,使播放器允许设置单个媒体项。
  • 轨道选择:
    • 已将 TrackSelectionOverrides 类扁平化为 TrackSelectionParameters,并将 TrackSelectionOverride 提升为顶级类。
    • 已将 TracksInfo 重命名为 Tracks,并将 TracksInfo.TrackGroupInfo 重命名为 Tracks.GroupPlayer.getCurrentTracksInfoPlayer.Listener.onTracksInfoChanged 也已重命名为 Player.getCurrentTracksPlayer.Listener.onTracksChanged。这包括“取消废弃” (un-deprecating) Player.Listener.onTracksChanged 方法名称,但使用的是不同的参数类型。
    • 更改了 DefaultTrackSelector.buildUponParametersDefaultTrackSelector.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
  • 提取器:
    • 添加了对 AVI 的支持 (#2092)。
    • Matroska:解析了 Opus 轨道的 DiscardPadding
    • MP4:解析了 esds 框中的比特率。
    • Ogg:允许重复的 Opus ID 和注释标头 (#10038)。
  • 界面:
    • 修复了 useController=false 时将事件传递给 PlayerView 上设置的 OnClickListener 的问题 (#9605)。此外,还修复了针对所有视图配置将事件传递给 OnLongClickListener 的问题。
    • 修复了将 ACTION_UP 之前退出 PlayerView 边界的一系列触摸事件错误处理为点击的问题 (#9861)。
    • 修复了点按操作可能会切换播放,而不是隐藏控件的 PlayerView 无障碍功能问题 (#8627)。
    • 重写了 TrackSelectionViewTrackSelectionDialogBuilder,以使用 Player 接口(而不是 ExoPlayer)。这样做将允许视图与其他 Player 实现一起使用,并移除界面模块对 ExoPlayer 模块的依赖关系。这是一项重大变更。
    • 不在 PlayerView 轨道选择器中显示强制文字轨道;如果选择了“None”,则保留一个合适的强制文字轨道 (#9432)。
  • DASH:
    • 解析了 DTS AudioChannelConfiguration 元素中的声道数。这会为 DTS 流重新启用音频透传 (#10159)。
    • 禁止将 null 传递给 DashMediaSource.Factory.setCompositeSequenceableLoaderFactory。如果需要,可以显式传递 DefaultCompositeSequenceableLoaderFactory 的实例。
  • HLS:
    • 如果播放列表 CODECS 属性不包含音频编解码器,则回退到分块准备 (#10065)。
    • 禁止将 null 传递给 HlsMediaSource.Factory.setCompositeSequenceableLoaderFactoryHlsMediaSource.Factory.setPlaylistParserFactoryHlsMediaSource.Factory.setPlaylistTrackerFactory。如果需要,可以显式传递 DefaultCompositeSequenceableLoaderFactoryDefaultHlsPlaylistParserFactory 或对 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.setMediaUriMediaSession.Callback.onSetMediaUri。使用 MediaController.setMediaItemMediaSession.Callback.onAddMediaItems 可实现相同的功能。
    • 转发旧版 MediaController 调用,以便将媒体播放到 MediaSession.Callback.onAddMediaItems(而非 onSetMediaUri)。
    • 添加了 MediaNotification.ProviderDefaultMediaNotificationProvider,以支持通知自定义。
    • 添加了 BitmapLoaderSimpleBitmapLoader,用于下载海报图片。
    • 添加了 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)。
  • 移除了已废弃的符号:
    • 移除了 Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)。改用 Player.Listener.onTracksChanged(Tracks)
    • 移除了 Player.getCurrentTrackGroupsPlayer.getCurrentTrackSelections。改用 Player.getCurrentTracks。您也可以继续使用 ExoPlayer.getCurrentTrackGroupsExoPlayer.getCurrentTrackSelections,尽管这些方法已废弃。
    • 移除了 DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTDEFAULT_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.setTrackIdMediaItem.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 标头字段 namegenre 分别传播到 MediaMetadata.stationMediaMetadata.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 解码器。
  • 音频:
    • 修复了杜比全景声 (E-AC3-JOC) 的解码器回退逻辑,以在需要时使用兼容的 E-AC3 解码器。
    • AudioCapabilities API 更改为要求明确传递 AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES 而不是 null
    • 允许通过将 AudioTrackBufferSizeProvider 注入 DefaultAudioSink 来自定义 AudioTrack 缓冲区空间的计算。(#8891)。
    • 在请求的缓冲区空间大于 1 MB 时重试创建 AudioTrack。(#9712)。
  • 提取器:
    • WAV:添加了对 RF64 流的支持 (#9543)。
    • 修复了对 H.265 SPS NAL 单元的解析错误 (#9719)。
    • 会解析 Ogg Opus 和 Ogg Vorbis 文件中的 Vorbis 注释(包括 METADATA_BLOCK_PICTURE)。
  • 文本:
    • 添加了一个 MediaItem.SubtitleConfiguration.id 字段,该字段会传播到通过配置创建的字幕轨道的 Format.id 字段 (#9673)。
    • 在 Matroska 容器中添加了对 WebVTT 字幕的基本支持 (#9886)。
    • 防止 Cea708Decoder 的读取量多于相应服务块声明的量。
  • DRM:
    • DrmSessionManager.(pre)acquireSession 中移除了 playbackLooper。 当自定义的 MediaSource 中的应用使用 DrmSessionManager 时,需要改为将 playbackLooper 传递给 DrmSessionManager.setPlayer
  • 广告播放/IMA:
    • 添加了对 IMA 动态广告插播 (DAI) 的支持 (#8213)。
    • AdPlaybackState 中添加了一个允许重置广告组的方法,以便广告组可以再次播放 (#9615)。
    • 在广告播放期间强制保持 1.0 的播放速度 (#9018)。
    • 修复了以下问题:未能加载广告组导致播放立即重置 (#9929)。
  • 界面:
    • 修复了使用某些主题时 StyledPlayerView 快退按钮和快进按钮中数字的颜色 (#9765)。
    • 正确解析播放速度字符串 (#9811)。
  • DASH:
    • 将解析出来的基本属性和补充属性添加到 Representation (#9579)。
    • 支持 forced-subtitle 轨道角色 (#9727)。
    • 停止将 main 轨道角色解读为 C.SELECTION_FLAG_DEFAULT
    • 修复了未声明 DVB 命名空间的清单的基本网址排除逻辑 (#9856)。
    • 支持相对 MPD.Location 网址 (#9939)。
  • HLS:
    • 为仅音频的 HLS 流正确地填充 Format.label (#9608)。
    • 默认使用无块准备来缩短启动时间。如果您的呈现内容包含在主播放列表中声明的多路复用字幕轨道,您应该将其添加到主播放列表中以供播放,或使用 HlsMediaSource.Factory.setAllowChunklessPreparation(false) 关闭无块准备。
    • 支持在 HLS 中进行关键帧精确定位 (#2882)。
  • RTSP:
    • 提供客户端 API 以替换用于任何服务器连接的 SocketFactory (#9606)。
    • 如果基本和摘要式身份验证方式都有,优先选用摘要式身份验证方式 (#9800)。
    • 当 RTSP 轨道时间不可用时及时应对 (#9775)。
    • 忽略无效的 RTP-Info 标头值 (#9619)。
  • 转换器:
    • 将要求的最低 API 版本提高到 21。
    • TransformationException 现已用于描述转换期间发生的错误。
    • 添加了 TransformationRequest 以指定转换选项。
    • 允许注册多个监听器。
    • 修复了当读取了部分编解码器输出内容时转换器卡住的问题。
    • 修复了在释放多路复用器抛出项时 Transformer.getProgress 中潜在的 NPE 问题。
    • 添加了用于应用转换的演示版应用。
  • MediaSession 扩展程序:
    • 默认情况下,MediaSessionConnector 现会在停止时清除播放列表。希望保留播放列表的应用可以在连接器上调用 setClearMediaItemsOnStop(false)
  • Cast 扩展程序:
    • 修复了导致 CastPlayer 无法正确调用 onIsPlayingChanged 的 bug (#9792)。
    • 支持音频元数据,包括带有 DefaultMediaItemConverter 的海报图片 (#9663)。
  • 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)。
  • 移除了已废弃的符号:
    • 移除了 Player.EventListener。改用 Player.Listener
    • 移除了 MediaSourceFactory#setDrmSessionManagerMediaSourceFactory#setDrmHttpDataSourceFactoryMediaSourceFactory#setDrmUserAgent。改用 MediaSourceFactory#setDrmSessionManagerProvider
    • 移除了 MediaSourceFactory#setStreamKeys。改用 MediaItem.Builder#setStreamKeys
    • 移除了 MediaSourceFactory#createMediaSource(Uri)。改用 MediaSourceFactory#createMediaSource(MediaItem)
    • DashMediaSourceHlsMediaSourceSsMediaSource 中移除了 setTag。改用 MediaItem.Builder#setTag
    • 移除了 DashMediaSource#setLivePresentationDelayMs(long, boolean)。使用 MediaItem.Builder#setLiveConfigurationMediaItem.LiveConfiguration.Builder#setTargetOffsetMs 替换清单,或使用 DashMediaSource#setFallbackTargetLiveOffsetMs 提供回退值。
    • 移除了 (Simple)ExoPlayer.setThrowsWhenUsingWrongThread。无法再选择停用线程强制执行。
    • 移除了 ActionFileActionFileUpgradeUtil。使用 ExoPlayer 2.16.1 或更低版本,以利用 ActionFileUpgradeUtil 将旧版操作文件合并到 DefaultDownloadIndex 中。
    • 移除了 ProgressiveMediaSource#setExtractorsFactory。改用 ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory) 构造函数。
    • 移除了 ProgressiveMediaSource.Factory#setTagProgressiveMediaSource.Factory#setCustomCacheKey。改用 MediaItem.Builder#setTagMediaItem.Builder#setCustomCacheKey
    • 移除了 DefaultRenderersFactory(Context, @ExtensionRendererMode int)DefaultRenderersFactory(Context, @ExtensionRendererMode int, long) 构造函数。改用 DefaultRenderersFactory(Context) 构造函数、DefaultRenderersFactory#setExtensionRendererModeDefaultRenderersFactory#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 模块取代。这可以实现播放器和媒体会话之间的直接集成,而无需使用适配器/连接器类。