Media3

媒体用例支持库。
最新更新 稳定版 发布候选版 Beta 版 Alpha 版
2025 年 5 月 15 日 1.7.1 - - 1.8.0-alpha01

声明依赖项

要添加 Media3 的依赖项,您必须将 Google Maven 仓库添加到您的项目中。阅读Google 的 Maven 仓库以获取更多信息。

在您的应用或模块的 build.gradle 文件中添加您所需构件的依赖项

Groovy

dependencies {
    def media3_version = "1.6.1"

    // For media playback using ExoPlayer
    implementation "androidx.media3:media3-exoplayer:$media3_version"

    // For DASH playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // For HLS playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // For SmoothStreaming playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
    // For RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation "androidx.media3:media3-exoplayer-midi:$media3_version"
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-ima:$media3_version"

    // For loading data using the Cronet network stack
    implementation "androidx.media3:media3-datasource-cronet:$media3_version"
    // For loading data using the OkHttp network stack
    implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
    // For loading data using librtmp
    implementation "androidx.media3:media3-datasource-rtmp:$media3_version"

    // For building media playback UIs using Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs using Views
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs using Jetpack Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

    // For exposing and controlling media sessions
    implementation "androidx.media3:media3-session:$media3_version"

    // For extracting data from media containers
    implementation "androidx.media3:media3-extractor:$media3_version"

    // For integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.6.1"

    // For media playback using ExoPlayer
    implementation("androidx.media3:media3-exoplayer:$media3_version")

    // For DASH playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-dash:$media3_version")
    // For HLS playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-hls:$media3_version")
    // For SmoothStreaming playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version")
    // For RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version")
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation("androidx.media3:media3-exoplayer-midi:$media3_version")
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-ima:$media3_version")

    // For loading data using the Cronet network stack
    implementation("androidx.media3:media3-datasource-cronet:$media3_version")
    // For loading data using the OkHttp network stack
    implementation("androidx.media3:media3-datasource-okhttp:$media3_version")
    // For loading data using librtmp
    implementation("androidx.media3:media3-datasource-rtmp:$media3_version")

    // For building media playback UIs using Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs using Views
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs using Jetpack Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

    // For exposing and controlling media sessions
    implementation("androidx.media3:media3-session:$media3_version")

    // For extracting data from media containers
    implementation("androidx.media3:media3-extractor:$media3_version")

    // For integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

有关依赖项的更多信息,请参阅添加构建依赖项

反馈

您的反馈有助于改进 Jetpack。您可以使用 Media3 问题跟踪器查找问题的答案、已知问题和功能请求,并提交新问题。

版本 1.8.0

版本 1.8.0-alpha01

2025 年 5 月 19 日

androidx.media3:media3-*:1.8.0-alpha01 已发布。版本 1.8.0-alpha01 包含这些提交

  • ExoPlayer
    • 添加 ExoPlayer.setScrubbingModeEnabled(boolean) 方法。这优化了播放器以适应频繁的跳播(例如,用户拖动进度条)。跳播模式的行为可以通过 ExoPlayerExoPlayer.Builder 上的 setScrubbingModeParameters(..) 进行自定义。
    • 允许在跳播模式下自定义小数跳播容差。
    • 在跳播模式下提高编解码器操作速率。
    • 修复了 AdsMediaSource 内容中的准备错误可能从未报告的 bug (#2337)。
    • 修复了 MergingMediaSource 中的内存泄漏问题,例如在旁加载字幕时使用 (#2338)。
    • 允许 CmcdConfiguration.Factory 返回 null 以禁用特定媒体项的 CMCD 日志记录 (#2386)。
    • 将默认图像缓冲区大小从 128KB(文本轨道复制粘贴错误)增加到 26MB,这足以容纳 50MP 超高清 HDR 图像 (#2417)。
    • 添加 PreCacheHelper,允许应用预缓存具有指定起始位置和持续时间的单个媒体。
  • Transformer
    • 现在,通过 addGap() 添加的初始间隙填充静音音频,需要在 EditedMediaItemSequence.Builder 中显式设置 experimentalSetForceAudioTrack(true)。如果间隙在序列中间,则不需要此标志。
    • Muxer 接口从 media3-transformer 移至 media3-muxer
    • MediaItem.Builder().setImageDuration(long) 设置为强制项,以便将媒体项作为图像导入。
    • 添加 Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean),在修剪时包含 MP4 编辑列表,以指示播放器忽略修剪起始点之前的关键帧和修剪起始点之间的样本。
    • 更新 Composition 演示应用以使用 Kotlin 和 Jetpack Compose,并添加自定义 VideoCompositorSettings 以将序列排列为 2x2 或画中画布局。
  • 提取器
    • MP3:当因 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) 而回退到恒定比特率寻址时,使用不可寻址的 Xing、VBRI 和类似可变比特率元数据中的持续时间和数据大小 (#2194)。
  • 音频
    • 允许 DefaultAudioMixer 中的恒定功率上混/下混。
    • ChannelMappingAudioProcessorTrimmingAudioProcessorToFloatPcmAudioProcessor 公开 (#2339)。
    • AudioTrackPositionTracker 中使用 AudioTrack#getUnderrunCount() 来检测 DefaultAudioSink 中的欠载,而不是尽力估算。
    • 改进音频时间戳平滑处理,以应对音频输出设备意外的位置漂移。
    • 修复了连接到蓝牙设备时,从暂停恢复后的前 10 秒内音视频同步中断的 bug。
    • 修复了 AnalyticsListener.onAudioPositionAdvancing 未报告音频开始前进的时间,而是报告第一次测量时间的 bug。
  • 视频
    • 添加实验性 ExoPlayer API,在排队仅解码输入缓冲区时包含 MediaCodec.BUFFER_FLAG_DECODE_ONLY 标志。此标志将指示解码器跳过仅解码缓冲区,从而加快寻址速度。通过 DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag 启用此功能。
    • 改进软件视频编解码器的编解码器性能检查。这可能导致一些额外的轨道被标记为 EXCEEDS_CAPABILITIES
    • 修复了某些设备上 VP9 Widevine 播放错误 (#2408)。
  • 文本
    • 修复了 SSA 和 SubRip 在启用字幕时显示进行中提示的 bug (#2309)。
    • 修复了从具有字幕错误的流切换到具有空字幕轨道的直播流时播放卡顿的 bug (#2328)。
    • 修复了播放包含 B 帧的 H.262 流时 CEA-608 字幕乱码的 bug (#2372)。
    • 在 Matroska 文件中添加对 CodecId = S_TEXT/SSA 的 SSA 字幕的支持。以前 MatroskaExtractor 只支持 CodecId = S_TEXT/ASS,它旨在表示 SubStation Alpha 字幕的“高级”(v4+)变体(但 ExoPlayer 的解析逻辑对于两种变体都相同) (#2384)。
    • 添加对 SubStation Alpha (SSA) 字幕文件中 layer 属性的支持,该属性用于定义同时显示多个提示时的 z 轴顺序 (#2124)。
  • 效果
    • 添加 Presentation.createForShortSide(int),它创建一个 Presentation,无论输入方向如何,都能确保最短边始终与给定值匹配。
  • 多路复用器
    • writeSampleData() API 现在使用多路复用器特定的 BufferInfo 类,而不是 MediaCodec.BufferInfo
    • 添加 Muxer.Factory#supportsWritingNegativeTimestampsInEditList,默认为 false。
  • IMA 扩展
    • 修复了在一个广告中加载错误可能意外使另一个广告组失效的 bug。
    • 修复了 VOD 窗口结束后的广告组导致播放停滞的 bug。起始时间在窗口之后的广告组不再排队进入 MediaPeriodQueue (#2215)。
  • 会话
    • 修复了将 null 传递给连接到旧版 MediaBrowserServiceCompatMediaBrowsergetLibraryRoot 时会产生 NullPointerException 的 bug。
    • 修复了发送自定义操作、搜索结果或 getItem 请求时,旧版会话应用因 ClassNotFoundException 而崩溃的 bug。
    • 修复了 MediaItem.LocalConfiguration.uri 被共享到平台会话的 MediaMetadata 的 bug。要有意地共享 URI 以允许控制器重新请求媒体,请改为设置 MediaItem.RequestMetadata.mediaUri
  • UI
    • 修复了 Compose 中的一个 bug,该 bug 导致在设置初始按钮状态和观察状态变化(例如图标形状或启用状态)之间存在间隙。现在,在观察期之外对播放器所做的任何更改都会被拾取 (#2313)。
    • media3-ui-compose 模块中为 SeekBackButtonStateSeekForwardButtonState 添加状态持有者和可组合项。
    • PlayerControlView 添加对 ExoPlayer 跳播模式的支持。启用后,当用户开始拖动进度条时,此模式会将播放器置于跳播模式,每次移动都会发出 player.seekTo 调用,然后在手指离开屏幕时退出跳播模式。此集成可以通过 XML 中的 time_bar_scrubbing_enabled = true 或 Java/Kotlin 中的 setTimeBarScrubbingEnabled(boolean) 方法启用。
    • 使 PlayerSurface 接受可为空的 Player 参数。
  • 下载
    • 添加对渐进流的部分下载支持。应用可以使用 DownloadHelper 准备渐进流,并从帮助器请求一个 DownloadRequest,指定下载应涵盖的基于时间的媒体起始和结束位置。返回的 DownloadRequest 携带解析的字节范围,可以使用它创建 ProgressiveDownloader 并相应地下载内容。
    • 添加 DownloadHelper.Factory,它替换了静态 DownloadHelper.forMediaItem() 方法。
    • SegmentDownloader 实现添加 Factory
    • 添加对自适应流的部分下载支持。应用可以使用 DownloadHelper 准备自适应流,并从帮助器请求一个 DownloadRequest,指定下载应涵盖的基于时间的媒体起始和结束位置。返回的 DownloadRequest 携带解析的时间范围,可以使用它创建具体的 SegmentDownloader 并相应地下载内容。
  • HLS 扩展
    • 支持 HlsInterstitialsAdsLoader 的 X-ASSET-LIST 和直播流。
  • RTSP 扩展
    • 添加对包含尾随空格字符的 SessionDescriptions 行的解析支持 (#2357)。
  • Cast 扩展
    • 添加对 getDeviceVolume()setDeviceVolume()getDeviceMuted()setDeviceMuted() 的支持 (#2089)。
  • 测试实用程序
    • 移除了 transformer.TestUtil.addAudioDecoders(String...)transformer.TestUtil.addAudioEncoders(String...)transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)。请改用 ShadowMediaCodecConfig 配置影子编码器和解码器。
    • ShadowMediaCodecConfig 报告的编解码器名称中的“exotest”前缀替换为“media3”。
  • 删除已弃用符号
    • 移除了已弃用的 SegmentDownloader 构造函数 SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) 及其子类 DashDownloaderHlsDownloaderSsDownloader 中的相应构造函数。
    • 移除了已弃用的 Player.hasNext()Player.hasNextWindow()。请改用 Player.hasNextMediaItem()
    • 移除了已弃用的 Player.next()。请改用 Player.seekToNextMediaItem()
    • 移除了已弃用的 Player.seekToPreviousWindow()。请改用 Player.seekToPreviousMediaItem()
    • 移除了已弃用的 Player.seekToNextWindow()。请改用 Player.seekToNextMediaItem()
    • 移除了 exoplayer 模块中已弃用的 BaseAudioProcessor。请改用 common 模块下的 BaseAudioProcessor
    • 移除已弃用的 MediaCodecVideoRenderer 构造函数 MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)

版本 1.7.0

版本 1.7.1

2025 年 5 月 16 日

此版本与 1.6.1 的代码相同,发布是为了确保它看起来比 1.7.0 更“新”,1.7.0 是一个不小心被标记为稳定版的 alpha 版本(见下文)。

版本 1.7.0

2025 年 5 月 16 日

此版本本应是 1.7.0-alpha01,但意外地在 maven.google.com 上被标记为 1.7.0(即稳定版)。请勿使用此版本。请继续使用 1.6.1 或升级到 1.7.1(其代码与 1.6.1 相同)。

版本 1.6.0

1.6.1

2025 年 4 月 14 日

androidx.media3:media3-*:1.6.1 已发布。版本 1.6.1 包含这些提交

  • 通用库
    • 添加 PlaybackParameters.withPitch(float) 方法,以便轻松复制具有新 pitch 值的 PlaybackParameters (#2257)。
  • ExoPlayer
    • 修复了在初始化下一个媒体项期间,由于可恢复的渲染器错误导致媒体项转换失败的问题 (#2229)。
    • 修复了 ProgressiveMediaPeriod 抛出 IllegalStateException 的问题,因为 PreloadMediaSource 在准备好之前尝试调用其 getBufferedDurationUs() (#2315)。
    • 修复了在 DASH、HLS 和 SmoothStreaming 的清单请求中发送 CmcdData 的问题 (#2253)。
    • 确保 AdPlaybackState.withAdDurationsUs(long[][]) 可以在广告组被移除后使用。用户仍然需要为已移除的广告组传入一个时长数组,该数组可以为空或 null (#2267)。
  • 提取器
    • MP4:从 tkhd box 解析 alternate_group 并将其作为 Mp4AlternateGroupData 条目公开在每个轨道的 Format.metadata 中 (#2242)。
  • 音频
    • 修复了播放短内容播放列表时位置可能卡住的卸载问题 (#1920)。
  • 会话
    • 将平台 MediaSession 回调的聚合超时从 500 毫秒降低到 100 毫秒,并添加一个实验性 setter 以允许应用配置此值。
    • 修复了用户关闭通知后重新出现的问题 (#2302)。
    • 修复了一个 bug,即当包装的播放器实际为空时,会话返回一个单项时间线。这发生在包装的播放器没有 COMMAND_GET_TIMELINE 可用,而 COMMAND_GET_CURRENT_MEDIA_ITEM 可用且包装的播放器为空时 (#2320)。
    • 修复了在与服务进行其他交互(例如 setForegroundServiceTimeoutMs)之后,调用 MediaSessionService.setMediaNotificationProvider 被静默忽略的 bug (#2305)。
  • UI
    • 启用 PlayerSurface 以与 ExoPlayer.setVideoEffectsCompositionPlayer 配合使用。
    • 修复了 PlayerSurface 无法用新的 Player 重新组合的 bug。
  • HLS 扩展
    • 修复了 HLS 媒体的 CmcdData 中未设置块持续时间的问题,导致在处理加密媒体片段时断言失败 (#2312)。
  • RTSP 扩展
    • 添加对带有 RTSPT 方案的 URI 的支持,作为配置 RTSP 会话以使用 TCP 的方式 (#1484)。
  • Cast 扩展
    • 添加对播放列表元数据的支持 (#2235)。

1.6.0

2025 年 3 月 26 日

androidx.media3:media3-*:1.6.0 已发布。版本 1.6.0 包含这些提交

  • 通用库
    • 添加 AudioManagerCompatAudioFocusRequestCompat 以替换 androidx.media 中的等效类。
    • 将 Kotlin 从 1.9.20 升级到 2.0.20 并使用 Compose 编译器 Gradle 插件。将 KotlinX Coroutines 库从 1.8.1 升级到 1.9.0。
    • 移除 Format.toBundle(boolean excludeMetadata) 方法,请改用 Format.toBundle()
    • 修复了 SimpleBasePlayer 中的 bug,即在 setPlaylist 后将 State 中的新 currentMediaItemIndex 设置为 null MediaMetadata 时,不会重新评估元数据 (#1940)。
    • SimpleBasePlayer.State 的访问权限从 protected 更改为 public,以便于在其他类中处理更新 (#2128)。
  • ExoPlayer
    • 添加 MediaExtractorCompat,这是一个新类,提供与平台 MediaExtractor 等效的功能。
    • 添加实验性的 ExoPlayer 预热支持,用于使用 MediaCodecVideoRenderer 进行播放。您可以通过 experimentalSetEnableMediaCodecVideoRendererPrewarming 配置 DefaultRenderersFactory,为 ExoPlayer 提供辅助 MediaCodecVideoRenderer。如果启用,ExoPlayer 会在播放期间预处理连续媒体项的视频,以减少媒体项转换延迟。
    • DefaultLoadControlbufferForPlaybackMsbufferForPlaybackAfterRebufferMs 的默认值分别减少到 1000 毫秒和 2000 毫秒。
    • 异步初始化 DeviceInfo 和设备音量(如果使用 setDeviceVolumeControlEnabled 启用)。这些值在 ExoPlayer.Builder.build() 之后不会立即可用,Player.Listener 会通过 onDeviceInfoChangedonDeviceVolumeChanged 通知更改。
    • 创建播放器后,初始音频会话 ID 不再立即可用。如果需要,您可以使用 AnalyticsListener.onAudioSessionIdChanged 监听初始更新。
    • 在选择视频轨道时考虑语言。默认情况下,如果可用,选择与所选音频轨道的语言匹配的“主”视频轨道。可以通过 TrackSelectionParameters.Builder.setPreferredVideoLanguage(s) 表达明确的视频语言偏好。
    • DefaultTrackSelector.selectVideoTrack() 方法添加 selectedAudioLanguage 参数。
    • MediaSourceEventListener.onLoadStarted 和相应的 MediaSourceEventListener.EventDispatcher 方法添加 retryCount 参数。
    • 修复了多周期 DASH 流中,播放列表项或周期持续时间与实际内容不匹配可能导致项目末尾画面冻结的 bug (#1698)。
    • BasePreloadManager.Listener 移至顶级 PreloadManagerListener
    • 可以实现 RenderersFactory.createSecondaryRenderer 以提供用于预热的辅助渲染器。预热可在播放期间实现更快的媒体项转换。
    • 启用在自适应流媒体格式 DASH、HLS 和 SmoothStreaming 中为清单请求发送 CmcdData (#1951)。
    • MediaCodecRenderer.onReadyToInitializeCodec 中提供将要初始化的编解码器的 MediaCodecInfo (#1963)。
    • 更改 AdsMediaSource 以允许 AdPlaybackStates 通过附加广告组而增长。检测到无效修改时会抛出异常。
    • 修复了在插播广告后过渡到内容媒体时,可能快速连续显示额外仅解码帧的问题。
    • 使 DefaultRenderersFactory 默认添加两个 MetadataRenderer 实例,以便应用能够接收两种不同的元数据方案。
    • 重新评估在播放暂停时是否应取消正在进行的块加载 (#1785)。
    • ClippingMediaSource 添加选项,允许在不可寻址媒体中进行剪辑。
    • 修复了预热寻址可能阻塞后续媒体项转换的 bug。
    • 修复了当 ExoPlayer.isLoading() 过渡到 STATE_IDLESTATE_ENDED 后仍保持 true 的 bug (#2133)。
    • LoadControl.Parameter 添加 lastRebufferRealtimeMs (#2113)。
  • Transformer
    • 添加对转换为兼容旧版本的备用格式的支持。
    • 添加对转码和转封装杜比视界 (profile 8) 格式的支持。
    • 更新 VideoFrameProcessor.registerInputStreamVideoFrameProcessor.Listener.onInputStreamRegistered 的参数以使用 Format
    • 使用 DefaultEncoderFactory 时生成 HDR 静态元数据。
    • 启用对使用 MediaMetricsManager 的 Android 平台诊断的支持。Transformer 将编辑事件和性能数据转发到平台,这有助于提供设备上的系统性能和调试信息。如果设备用户启用了共享使用情况和诊断数据,Google 也可能收集此数据。应用可以使用 Transformer.Builder.setUsePlatformDiagnostics(false) 选择退出向 Transformer 贡献平台诊断数据。
    • InAppMuxer 拆分为 InAppMp4MuxerInAppFragmentedMp4Muxer。您使用 InAppMp4Muxer 生成非分段 MP4 文件,而 InAppFragmentedMp4Muxer 用于生成分段 MP4 文件。
    • Muxer 接口从 media3-muxer 移至 media3-transformer
    • 添加 MediaProjectionAssetLoader,它从 MediaProjection 提供媒体用于屏幕录制,并为 Transformer 演示应用添加屏幕录制支持。
    • Codec 接口添加 #getInputFormat()
    • DefaultVideoFrameProcessorDefaultVideoCompositor 中,尽可能将释放 GlObjectsProvider 的责任转移到调用者身上。
  • 提取器
    • AVI:修复了恒定比特率压缩音频文件处理中的问题,其中流头存储的是字节数而不是块数。
    • 修复了长度以 1 或 2 字节(而不是 4 字节)表示的 NAL 单元处理问题。
    • 修复了 MP4 编辑列表中 ArrayIndexOutOfBoundsException 的问题,当编辑列表从非同步帧开始且没有前置同步帧时 (#2062)。
    • 修复了 TS 流在某些设备上可能卡住的问题 (#2069)。
    • FLAC:添加对 32 位 FLAC 文件的支持。此前,这些文件会因 IllegalStateException: Playback stuck buffering and not loading 而无法播放 (#2197)。
  • 音频
    • 修复了 onAudioPositionAdvancing 在播放恢复时调用(此前在播放暂停时调用)的 bug。
    • SpeedChangingAudioProcessor 配置了默认参数时,不要绕过 SonicAudioProcessor
    • 修复了 Sonic#getOutputSize() 中的下溢问题,该问题可能导致 DefaultAudioSink 停滞。
    • 修复了 MediaCodecAudioRenderer.getDurationToProgressUs()DecoderAudioRenderer.getDurationToProgressUs(),以便寻址正确地重置提供的持续时间。
    • androidx.media3.common.audio.SonicAudioProcessor 设置为 final。
    • ChannelMappingAudioProcessorTrimmingAudioProcessor 添加对浮点 PCM 的支持。
  • 视频
    • MediaCodecVideoRenderer.shouldUsePlaceholderSurface 更改为 protected,以便应用程序可以覆盖以阻止使用占位符表面 (#1905)。
    • 添加实验性 ExoPlayer AV1 样本依赖解析以加快寻址。通过新的 DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies API 启用它。
    • 添加实验性 ExoPlayer API,用于丢弃不依赖的晚期 MediaCodecVideoRenderer 解码器输入缓冲区。通过 DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs 启用它。
    • 修复了没有表面的播放器立即就绪且解码任何待处理帧非常慢的问题 (#1973)。
    • 将小米和 OPPO 设备排除在分离表面模式之外,以避免屏幕闪烁 (#2059)。
  • 文本
    • 添加对 VobSub 字幕的支持 (#8260)。
    • 停止急切加载所有使用 MediaItem.Builder.setSubtitleConfigurations 配置的字幕文件,而是仅在轨道选择选中一个时才加载它 (#1721)。
    • TTML:添加对使用 style 引用 tts:origintts:extent 的支持 (#2953)。
    • 将 WebVTT 和 SubRip 时间戳限制为精确到 3 位小数。以前,我们错误地解析了任意位数的小数,但总是假设值为毫秒,导致时间戳不正确 (#1997)。
    • 修复了播放列表中包含带有 CEA-608 或 CEA-708 字幕的剪辑项时播放卡顿的问题。
    • 修复了 SSA 文件包含持续时间为零(开始时间和结束时间相同)的提示时 IllegalStateException 的 bug (#2052)。
    • 当字幕与音频和视频一起复用到同一个容器中时,抑制(并记录)字幕解析错误 (#2052)。
    • 修复了使用 CR 行结束符的 WebVTT 文件中多字节 UTF-8 字符的处理问题 (#2167)。
  • DRM
    • 修复了在 API < 27 设备上播放 ClearKey 内容时出现的 MediaCodec$CryptoException: Operation not supported in this configuration 错误 (#1732)。
  • 效果
    • OverlaySettings 的功能移至 StaticOverlaySettingsOverlaySettings 可以被子类化以允许动态叠加设置。
  • 多路复用器
    • MuxerExceptionMuxer 接口移出,以避免过长的完全限定名。
    • Mp4Muxer.BuilderFragmentedMp4Muxer.Builder 中的 setSampleCopyEnabled() 方法重命名为 setSampleCopyingEnabled()
    • Mp4Muxer.addTrack()FragmentedMp4Muxer.addTrack() 现在返回 int 轨道 ID,而不是 TrackToken
    • Mp4MuxerFragmentedMp4Muxer 不再实现 Muxer 接口。
    • 默认禁用 Mp4Muxer 样本批处理和复制。
    • 修复了 FragmentedMp4Muxer 中的一个 bug,即仅写入音频轨道时会创建大量片段。
  • 会话
    • 当播放暂停、停止或失败时,将前台服务状态额外保持 10 分钟。这允许用户在此超时时间内恢复播放,而不会面临各种设备上的前台服务限制。请注意,在覆盖 onTaskRemoved 时,仅调用 player.pause() 不再能用于在 stopSelf() 之前停止前台服务,请改用 MediaSessionService.pauseAllPlayersAndStopSelf()
    • 当播放进入错误或停止状态时,保持通知可见。通知仅在播放列表被清除或播放器被释放时才会被移除。
    • 改进 Android 平台 MediaSession 操作 ACTION_PLAY 和 ACTION_PAUSE 的处理,以便根据可用命令仅设置其中一个,并且即使仅设置其中一个也接受。
    • Context 作为参数添加到 MediaButtonReceiver.shouldStartForegroundService (#1887)。
    • 修复了在连接到旧版会话的 MediaController 上调用 Player 方法时,会丢失待处理更新中的更改的 bug。
    • 使 MediaSession.setSessionActivity(PendingIntent) 接受 null (#2109)。
    • 修复了播放列表被清除时,陈旧通知仍然可见的 bug (#2211)。
  • UI
    • media3-ui-compose 模块中为 PlayerSurfacePresentationStatePlayPauseButtonStateNextButtonStatePreviousButtonStateRepeatButtonStateShuffleButtonStatePlaybackSpeedState 添加状态持有者和可组合项。
  • 下载
    • 修复了 CacheWriter 中的 bug,该 bug 在数据源抛出除 IOException 之外的 Exception 时,会使数据源保持打开状态并锁定缓存区域 (#9760)。
  • HLS 扩展
    • 添加第一个版本的 HlsInterstitialsAdsLoader。此广告加载器读取 HLS 媒体播放列表的 HLS 插页广告,并将其映射到传递给 AdsMediaSourceAdPlaybackState。此初始版本仅支持具有 X-ASSET-URI 属性的 HLS VOD 流。
    • 添加 HlsInterstitialsAdsLoader.AdsMediaSourceFactory。应用可以使用它以方便安全的方式创建使用 HlsInterstitialsAdsLoaderAdsMediaSource 实例。
    • 从 HLS 播放列表解析 SUPPLEMENTAL-CODECS 标签以检测杜比视界格式 (#1785)。
    • 放宽在 HLS 流中寻址同步位置的条件 (#2209)。
  • DASH 扩展
    • 为 DASH 添加 AC-4 Level-4 格式支持 (#1898)。
    • 修复了在多周期直播流中计算广告插入更新间隔的问题 (#1698)。
    • 从 DASH 清单解析 scte214:supplementalCodecs 属性以检测杜比视界格式 (#1785)。
    • 改进了直播流中周期转换的处理,其中周期包含的媒体样本超出声明的周期持续时间 (#1698)。
    • 修复了标记为 adaptation-set-switching 但语言或角色标志不同步适应集被合并的问题 (#2222)。
  • 解码器扩展(FFmpeg、VP9、AV1 等)
    • 添加 MPEG-H 解码器模块,该模块使用内置 MPEG-H 解码器解码 MPEG-H 音频 (#1826)。
  • MIDI 扩展
    • 将自定义 AudioSinkAudioRendererEventListener 实例连接到 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.VideoComponentExoPlayer.AudioComponentExoPlayer.TextComponentExoPlayer.DeviceComponent
    • 移除了 androidx.media3.exoplayer.audio.SonicAudioProcessor
    • 移除了以下已弃用的 DownloadHelper 方法
      • 构造函数 DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]),请改用 DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)
      • getRendererCapabilities(RenderersFactory),可以通过使用 RenderersFactory 创建 DefaultRendererCapabilitiesList 并调用 DefaultRendererCapabilitiesList.getRendererCapabilities() 来实现等效功能。
    • 移除了 PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat) 方法。请改用 PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) 并传入 (MediaSession.Token) compatToken.getToken()

1.6.0-rc02

2025 年 3 月 19 日

使用 1.6.0 稳定版本

1.6.0-rc01

2025 年 3 月 12 日

使用 1.6.0 稳定版本

1.6.0-beta01

2025 年 2 月 26 日

使用 1.6.0 稳定版本

版本 1.6.0-alpha03

2025 年 2 月 06 日

使用 1.6.0 稳定版本

版本 1.6.0-alpha02

2025 年 1 月 30 日

使用 1.6.0 稳定版本

版本 1.6.0-alpha01

2024 年 12 月 20 日

使用 1.6.0 稳定版本

版本 1.5

版本 1.5.1

2024 年 12 月 19 日

androidx.media3:media3-*:1.5.1 已发布。版本 1.5.1 包含这些提交

  • ExoPlayer
    • 禁用 MediaCodec 中的异步解密,以避免报告的此平台 API 编解码器超时问题 (#1641)。
  • 提取器
    • MP3:当 VBRI 帧的内容表未覆盖文件中所有 MP3 数据时,不要过早停止播放 (#1904)。
  • 视频
    • 回滚在使用 MediaCodecAdapter 提供的像素宽高比值时,在处理 onOutputFormatChanged 时使用这些值的情况 (#1371)。
  • 文本
    • 修复了 ReplacingCuesResolver.discardCuesBeforeTimeUs 中的 bug,即在 timeUs 处活动的提示(之前已开始但尚未结束)被错误丢弃 (#1939)。
  • 元数据
    • 从 Vorbis 注释中提取光盘/轨道编号和流派到 MediaMetadata (#1958)。

版本 1.5.0

2024 年 11 月 27 日

androidx.media3:media3-*:1.5.0 已发布。版本 1.5.0 包含这些提交

  • 通用库
    • 添加 ForwardingSimpleBasePlayer,它允许在进行少量调整的同时转发到另一个播放器,同时确保完全一致性和监听器处理 (#1183)。
    • getPlaylist() 方法替换 SimpleBasePlayer.State.playlist
    • SimpleBasePlayer.State.Builder.setPlaylist() 添加重写,以直接指定 Timeline 和当前 TracksMetadata,而不是构建播放列表结构。
    • minSdk 提高到 21 (Android Lollipop)。这与所有其他 AndroidX 库保持一致。
    • 添加 androidx.media3:media3-common-ktx 构件,它提供基于通用库构建的 Kotlin 特定功能
    • media3-common-ktx 库添加 Player.listen 挂起扩展函数,用于启动协程监听 Player.Events
    • 从手动外联的内部类中移除 @DoNotInline 注解,这些内部类旨在避免运行时类验证失败。最近版本的 R8 现在会自动外联此类调用以避免运行时失败(因此不再需要手动外联)。该库的所有 Gradle 用户必须已经使用 Android Gradle 插件的一个版本,该版本使用了执行此操作的 R8 版本,由于 compileSdk = 35。使用非 Gradle 构建系统的库用户需要确保其等效于 R8 的代码缩减/混淆步骤执行类似的自动外联过程,以避免运行时类验证失败。此更改已在其他 AndroidX 库中完成
  • ExoPlayer
    • 现在可以为每个媒体项调用 MediaCodecRenderer.onProcessedStreamChange()。以前,第一个媒体项不会调用此方法。使用 MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() 启用此功能。
    • 添加 PreloadMediaSource.PreloadControl.onPreloadError,以允许 PreloadMediaSource.PreloadControl 实现器在发生错误时采取行动。
    • 添加 BasePreloadManager.Listener 以将预加载事件传播到应用。
    • 允许更改 SNTP 客户端超时并在超时时重试备用地址 (#1540)。
    • 移除 MediaCodecAdapter.Configuration.flags,因为该字段始终为零。
    • 允许用户在 Wear OS API 35+ 上选择内置扬声器进行播放(如果设备宣传支持此功能)。
    • 推迟对 Context.getSystemService(Context.AUDIO_SERVICE) 的阻塞调用,直到启用音频焦点处理。这确保了如果未启用音频焦点处理,则不会进行阻塞调用 (#1616)。
    • 当加载失败时,允许播放而不受缓冲持续时间的影响 (#1571)。
    • 添加 AnalyticsListener.onRendererReadyChanged() 以指示单个渲染器何时允许播放就绪。
    • 修复了当 MediaCodec 在异步模式下操作时(API 31+ 上的默认行为),MediaCodec.CryptoException 有时被报告为“意外运行时错误”的 bug。
    • PreloadMediaSource.PreloadControl.onContinueLoadingRequested() 中传递 bufferedDurationUs 而不是 bufferedPositionUs。还将 DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS 更改为 DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS,然后应用需要传入一个值,该值表示从默认起始位置开始的特定持续时间,对应的媒体源必须使用此 IntDef 进行预加载,而不是位置。
    • 添加 ForwardingRenderer 实现,将所有方法调用转发到另一个渲染器 (1703)。
    • 添加播放列表中下一个项目的播放列表预加载。应用可以通过相应地调用 ExoPlayer.setPreloadConfiguration(PreloadConfiguration) 来启用预加载。默认情况下,预加载是禁用的。当选择加入且不干扰播放时,DefaultLoadControl 将预加载限制为仅当播放器未加载播放内容时才开始和继续。应用可以通过相应地实现 LoadControl.shouldContinuePreloading() 来更改此行为(例如在 DefaultLoadControl 中重写此方法时)。如果应用使用自定义实现的 LoadControl,则 LoadControl 的默认实现会禁用预加载。
    • 添加方法 MediaSourceEventListener.EventDispatcher.dispatchEvent() 以允许调用子类监听器的事件 (1736)。
    • 添加 DefaultPreloadManager.Builder,它以一致共享的配置构建 DefaultPreloadManagerExoPlayer 实例。
    • LoadControl.onTracksSelected() 中移除 Renderer[] 参数,因为 DefaultLoadControl 实现可以从 ExoTrackSelection[] 中检索流类型。
    • 弃用了 DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) 并将方法标记为 final 以防止重写。应改用新的 DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
    • 报告 MergingMediaSource 中辅助源的 MediaSourceEventListener 事件。这将导致旁加载字幕(使用 MediaItem.LocalConfiguration.subtitleConfigurations 添加的字幕)报告加载开始/错误/取消/完成事件,这些事件可能显示为从 AnalyticsListener 发出的重复加载事件。
    • 防止字幕和元数据错误完全停止播放。相反,有问题的轨道被禁用,其余轨道的播放继续 (#1722)。
      • 在新的字幕处理(提取期间)中,相关的解析错误(例如无效字幕数据)和加载错误(例如 HTTP 404)通过 onLoadError 回调发出。
      • 在旧版字幕处理(渲染期间)中,只有相关的加载错误通过 onLoadError 回调发出,而解析错误被静默忽略(这是预先存在的行为)。
    • 修复了多周期 DASH 流中,播放列表项或周期持续时间与实际内容不匹配可能导致项目末尾画面冻结的 bug (#1698)。
    • SntpClient 添加一个 setter,用于设置自上次更新以来的最大经过时间,之后客户端将重新初始化 (#1794)。
  • Transformer
    • 添加 SurfaceAssetLoader,它支持通过 Surface 将视频数据排队到 Transformer。
    • ImageAssetLoader 通过 AssetLoader.onError 报告不支持的输入,而不是抛出 IllegalStateException
    • 将使用 MediaItem.Builder.setImageDurationMs 设置图像持续时间设为图像导出的强制项。
    • 添加对音频 EditedMediaItems 序列中间隙的导出支持。
  • 轨道选择
    • DefaultTrackSelector:在其他因素相同的情况下,优先选择基于对象的音频而非基于声道的音频。
  • 提取器
    • 允许 Mp4ExtractorFragmentedMp4Extractor 识别未被后续样本用作参考的 H264 样本。
    • 添加在 AmrExtractor 中启用基于索引的寻址的选项。
    • 将有效帧之间超过 128KB 的 MP3 文件视为已截断(而不是无效)。这意味着末尾包含非 MP3 数据,且没有其他元数据指示 MP3 字节长度的文件,现在会在 MP3 数据末尾停止播放,而不是因 ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} 而失败 (#1563)。
    • 修复了在处理 MP4 文件中的编辑列表时,非关键帧媒体起始位置的预卷样本处理问题 (#1659)。
    • 通过使用 Mp4ExtractorFragmentedMp4Extractormdhd box 的媒体持续时间,改进了帧率计算 (#1531)。
    • 修复了 MP4 编辑列表中 media_time 缩放不正确的问题。虽然 segment_duration 已经使用电影时间刻度正确缩放,但现在 media_time 根据 MP4 格式标准,使用轨道时间刻度正确缩放 (#1792)。
    • 处理带编辑列表的 MP4 中 endIndices 计算的乱序帧 (#1797)。
    • 修复了 MP4 文件 mdhd box 中媒体持续时间解析以处理 -1 值的问题 (#1819)。
    • 添加对 MP4 文件中 h263 box 的识别支持,用于 H.263 视频 (#1821)。
    • 添加 AC-4 Level-4 ISO 基本媒体文件格式支持 (#1265)。
  • 数据源
    • 更新 HttpEngineDataSource 以允许从 S 扩展版本 7 而不是 API 级别 34 开始使用 (#1262)。
    • DataSourceContractTest:断言 DataSource.getUri() 返回已解析的 URI(如文档所述)。如果这与请求的 URI 不同,测试可以使用新的 DataSourceContractTest.TestResource.Builder.setResolvedUri() 方法指示。
    • DataSourceContractTest:断言 DataSource.getUri()getResponseHeaders()open() 调用失败(由于“未找到”资源)之后以及后续 close() 调用之前返回其“打开”值。
      • 覆盖 DataSourceContractTest.getNotFoundResources() 允许测试子类提供多个“未找到”资源,并提供任何预期的头部。这允许区分 HTTP 404(带头部)和“服务器未找到”(无头部)。
  • 音频
    • 如果媒体中存在 CTA-2075 响度元数据,则自动在编解码器上配置。
    • 确保寻址时音量平稳降低。
    • 修复了寻址过程中可能出现的爆音。
    • 修复了 Sonic 的时间拉伸/音高变换算法的截断误差累积问题。
    • 修复了 SpeedChangingAudioProcessor 中导致输出帧丢失的 bug。
  • 视频
    • MediaCodecVideoRenderer 避免解码既未渲染也未被其他样本用作参考的样本。
    • 在 API 35 及更高版本上,MediaCodecAdapter 现在可以在 configure 中接收 null Surface,并调用新方法 detachOutputSurface 以移除先前设置的 Surface,如果编解码器支持此功能 (MediaCodecInfo.detachedSurfaceSupported)。
    • 在处理 onOutputFormatChanged 时,如果提供了 MediaCodecAdapter 提供的像素宽高比值,则使用这些值 (#1371)。
    • 添加了一个针对 Galaxy Tab S7 FE 设备问题的解决方法,该问题导致 60fps 安全 H264 流被标记为不支持 (#1619)。
    • 添加一个针对编解码器在最后一个样本后卡住而不返回流结束信号的解决方法。
  • 文本
    • 添加自定义 VoiceSpan 并为 WebVTT 语音跨度填充它 (#1632)。
    • 确保显示 HLS 中 WebVTT 具有非常大的字幕时间戳(当表示为微秒并乘以 90,000 MPEG 时间基准时,会溢出 64 位 long) (#1763)。
    • 支持杜比视界内容中的 CEA-608 字幕 (#1820)。
    • 修复了当启用 CEA-608 字幕时,DASH 多周期流播放卡顿的问题 (#1863)。
  • 元数据
    • C.TRACK_TYPE_METADATA 类型分配给包含 icy 或 vnd.dvb.ait 内容的轨道。
  • 图像
    • 添加 ExternallyLoadedImageDecoder,以便更轻松地与 Glide 或 Coil 等外部图像加载库集成。
  • 数据源
    • 添加 FileDescriptorDataSource,一个可用于从 FileDescriptor 读取数据的新 DataSource#3757)。
  • 效果
    • 为微小的 SurfaceTexture 缩放添加 DefaultVideoFrameProcessor 解决方法。SurfaceTexture 可能会包含一个小缩放,该缩放会剪裁掉裁剪缓冲区边缘周围的 1 纹素边界。现在已对此进行处理,使输出更接近预期。
    • 加快 DefaultVideoFrameProcessor.queueInputBitmap() 的速度。因此,使用 Transformer 将图像导出为视频会更快。
  • IMA 扩展
    • 修复了清除播放列表可能导致 ImaServerSideAdInsertionMediaSource 中出现 ArrayIndexOutOfBoundsException 的错误。
    • 修复了服务器端插入的 DAI 流(没有 preroll)在播放到最后一个 midroll 之后可能导致 ArrayIndexOutOfBoundsException 的错误(#1741)。
  • 会话
    • 添加 MediaButtonReceiver.shouldStartForegroundService(Intent) 以允许应用通过重写此方法来抑制用于播放恢复的播放命令。默认情况下,服务始终启动,并且在不导致系统因 ForegroundServiceDidNotStartInTimeException 而崩溃服务的情况下无法抑制播放(#1528)。
    • 修复了连接到旧版服务时,从 MediaBrowser 发送的自定义命令被分派到 MediaSessionCompat.Callback 而不是 MediaBrowserServiceCompat 变体方法中的错误。这阻止了 MediaBrowser 接收旧版服务返回的实际返回值(#1474)。
    • 处理某些制造商的设备在设置媒体按钮意图的广播接收器时抛出的 IllegalArgumentException#1730)。
    • 为媒体项添加命令按钮。这为旧版库中通过 MediaBrowserCompat 所知的 Custom browse actions 添加了 Media3 API。请注意,使用 Media3,媒体项的命令按钮同时适用于 MediaBrowserMediaController。请参阅 AAOS 的自定义浏览操作
    • 修复了 Media3 控制器在请求 play() 后有时无法让会话应用启动前台服务的错误。
    • CommandButton.Builder.setIconUri 限制为仅接受内容 URI。
    • 将 Media3 浏览器的连接提示传递给初始的 MediaBrowserCompat,以便连接到旧版 MediaBrowserCompat。服务可以通过对 onGetRoot() 的首次调用,以根提示的形式接收传递的连接提示。
    • 修复了连接到旧版浏览器服务的 MediaBrowser 在订阅 parentid 后没有收到服务发送的错误的错误。
    • 改进互操作性行为,使连接到旧版 MediaBrowserService 的 Media3 浏览器在订阅父级时不会两次请求 parentId 的子级。
  • UI
    • 由于基于 XML 的共享过渡存在问题,PlayerView 在 Compose AndroidView 中拉伸/裁剪视频的解决方法现在需要选择启用。在 AndroidView 中使用 PlayerView 的应用需要调用 PlayerView.setEnableComposeSurfaceSyncWorkaround 才能选择启用(#1237, #1594)。
    • PlayerView 添加 setFullscreenButtonState,以允许按需更新全屏按钮的图标,即带外更新而非响应点击交互(#1590, #184)。
    • 修复了当存在应用定义的文本轨道选择偏好设置时,文本选择中的“无”选项不起作用的错误。
  • DASH 扩展
    • 添加对分段中间开始的时段的支持(#1440)。
  • 平滑流式传输扩展
    • 修复了播放带文本轨道的 SmoothStreaming 流时出现的 Bad magic number for Bundle 错误(#1779)。
  • RTSP 扩展
    • 修复了包含编码 @ 字符的 URL 的用户信息删除问题(#1138)。
    • 修复了在解析带有标头扩展的 RTP 数据包时崩溃的问题(#1225)。
  • 解码器扩展(FFmpeg、VP9、AV1 等)
    • 添加 IAMF 解码器模块,该模块提供对包含 IAMF 轨道的 MP4 文件播放的支持,使用 libiamf 本机库合成音频。
      • 支持立体声布局和 5.1 空间化播放,并可选择启用头部追踪,但目前不支持双耳播放。
    • 添加 Android 15 上解码器扩展的 16 KB 页面支持(#1685)。
  • Cast 扩展
    • 停止在 CastSession 断开连接后清理时间线,这使得发送方应用在断开连接后可以本地恢复播放。
    • 在提供 Context 时填充 CastPlayer 的 DeviceInfo。这使得 MediaSession 能够链接到 RoutingSession,这对于集成输出切换器是必需的(#1056)。
  • 测试实用程序
    • DataSourceContractTest 现在包含用于验证的测试:
      • 输入流 read position 已更新。
      • 输出缓冲区 offset 应用正确。
  • 演示应用
    • 解决演示短格式应用中的内存泄漏问题(#1839)。
  • 删除已弃用符号
    • 移除已弃用的 Player.hasPreviousPlayer.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
    • PreloadMediaSource 中异步处理预加载回调(#1568)。
    • 当加载失败时,允许播放而不受缓冲持续时间的影响 (#1571)。
  • 提取器
    • MP3:通过根据 Info 帧中的长度字段正确忽略尾部非 MP3 数据来修复 Searched too many bytes 错误(#1480)。
  • 文本
    • TTML:修复百分比 tts:fontSize 值的处理,以确保它们从具有百分比 tts:fontSize 值的父节点正确继承。
    • 修复了 LegacySubtitleUtil 中由于未正确处理请求的输出开始时间大于或等于 Subtitle 中最终事件时间的情况而导致的 IndexOutOfBoundsException#1516)。
  • DRM
    • 修复了在 API 31+ 设备上播放 L1 Widevine 内容时出现的 android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE 错误。此错误是由框架 MediaDrm.requiresSecureDecoder 方法的不完整实现引起的(#1603)。
  • 效果
    • GlObjectsProvider 添加 release() 方法。
  • 会话
    • KEYCODE_HEADSETHOOK 的双击转换为“快进”操作,如文档所述(#1493)。
    • MediaButtonReceiver 中,将 KEYCODE_HEADSETHOOK 作为“播放”命令处理,以决定是否忽略它,从而避免 ForegroundServiceDidNotStartInTimeException#1581)。
  • RTSP 扩展
    • 跳过 SDP 解析中的无效媒体描述(#1087)。

版本 1.4.0

2024 年 7 月 25 日

androidx.media3:media3-*:1.4.0 已发布。版本 1.4.0 包含这些提交

  • 通用库
    • 将推定的空操作查找调用转发给受保护的 BasePlayer.seekTo()SimpleBasePlayer.handleSeek() 方法,而不是忽略它们。如果您在自定义播放器中实现这些方法,您可能需要处理这些附加调用,其中 mediaItemIndex == C.INDEX_UNSET
    • 移除对增强型 Java 8 desugaring 的编译依赖(#1312)。
    • 确保传递给 MediaItem.Builder.setImageDurationMs() 的时长对于非图像 MediaItem 会被忽略(如文档所述)。
    • 添加 Format.customData 以存储应用提供的关于 Format 实例的自定义信息。
  • ExoPlayer
    • 添加 BasePreloadManager,它根据其 rankingData 定义的优先级协调多个源的预加载。通过扩展此类别可以进行自定义。添加 DefaultPreloadManager,它使用 PreloadMediaSource 将源的媒体样本预加载到内存中,并使用一个整数 rankingData 来指示 UI 上项目的索引。
    • LoadControl 的大多数方法添加 PlayerId,以使 LoadControl 实现能够支持多个播放器。
    • 移除 Buffer.isDecodeOnly()C.BUFFER_FLAG_DECODE_ONLY。无需设置此标志,因为渲染器和解码器将根据时间戳决定是否跳过缓冲区。自定义 Renderer 实现应检查缓冲区时间是否至少为 BaseRenderer.getLastResetPositionUs() 以决定是否应显示样本。自定义 SimpleDecoder 实现可以根据需要检查 isAtLeastOutputStartTimeUs() 或用 DecoderOutputBuffer.shouldBeSkipped 标记其他缓冲区以跳过它们。
    • 允许 TargetPreloadStatusControl.getTargetPreloadStatus(T) 返回 null 值,以指示不预加载具有给定 rankingDataMediaSource
    • BasePreloadManager 添加 remove(MediaSource)
    • BasePreloadManager 添加 reset(),以释放所有持有的源,同时保留预加载管理器实例。
    • 添加 ExoPlayer.setPriority()(和 Builder.setPriority())以定义在 PriorityTaskManager 中使用的优先级值以及从 API 35 开始的 MediaCodec 重要性。
    • 修复了更新上次重新缓冲时间导致 CMCD 中 bs(缓冲区饥饿)键不正确的问题(#1124)。
    • 添加 PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) 以指示源已加载到末尾。这允许 DefaultPreloadManager 和自定义 PreloadMediaSource.PreloadControl 实现预加载下一个源或执行其他操作。
    • 修复了在项目末尾跳过静音可能触发播放异常的错误。
    • PreloadMediaSource 添加 clear 以丢弃预加载时段。
    • 添加新的错误代码 PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED,该代码在编解码器资源被回收用于更高优先级任务时使用。
    • 允许 AdsMediaSource 在初始内容媒体准备完成之前加载 preroll 广告(#1358)。
    • 修复了在原始时段已从清单中移除后,重新准备多时段 DASH 直播流时播放移动到 STATE_ENDED 的错误。
    • PreloadMediaSource.PreloadControl 中,将 onTimelineRefreshed() 重命名为 onSourcePrepared(),将 onPrepared() 重命名为 onTracksSelected()。同时,在 DefaultPreloadManager.Stage 中相应地重命名 IntDefs。
    • 添加对动态调度的实验性支持,以更好地使工作与 CPU 唤醒周期对齐,并延迟唤醒直到渲染器可以进行。您可以在设置 ExoPlayer 实例时使用 experimentalSetDynamicSchedulingEnabled() 启用此功能。
    • 添加 Renderer.getDurationToProgressUs()。一个 Renderer 可以实现此方法以向 ExoPlayer 返回播放必须前进的时长,以便渲染器可以进行。如果 ExoPlayer 设置了 experimentalSetDynamicSchedulingEnabled(),则 ExoPlayer 将在计算调度其工作任务的时间时调用此方法。
    • 添加 MediaCodecAdapter#OnBufferAvailableListener,以便在输入和输出缓冲区可供 MediaCodecRenderer 使用时发出警报。MediaCodecRenderer 在收到这些回调时会向 ExoPlayer 发出信号,如果 ExoPlayer 设置了 experimentalSetDynamicSchedulingEnabled(),则 ExoPlayer 将在渲染器可以进行时调度其工作循环。
    • LoadControl 方法使用数据类,而不是单独的参数。
    • 添加 ExoPlayer.isReleased() 以检查是否已调用 Exoplayer.release()
    • 添加 ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() 以配置 seekToPrevious() 查找上一项的最大位置(#1425)。
    • 修复了一些音频焦点不一致问题,例如播放器暂停时未报告完全或暂时性焦点丢失(#1436)。
    • 修复了提取器在初始准备步骤后报告额外轨道可能导致 IndexOutOfBoundsException 的问题(#1476)。
    • ExoPlayer.setVideoEffect() 中的 Effects 将接收已移除渲染器偏移量的时间戳(#1098)。
    • 修复了在读取到另一个播放列表项时发生播放器错误时处理 IllegalArgumentException 的潜在问题(#1483)。
  • Transformer
    • audioConversionProcessvideoConversionProcess 添加到 ExportResult,指示输出文件中相应轨道的生成方式。
    • 放宽裁剪优化 H.264 级别检查。
    • 添加对序列中 SDR 和 HDR 输入媒体之间切换的支持。
    • 添加对合成级音频效果的支持。
    • 添加将超 HDR 图像转码为 HDR 视频的支持。
    • 修复 DefaultAudioMixer 在重置和重用后未输出正确字节数的问题。
    • 解决解码器处理 PCM 输入时音频通道数上限为立体声的错误。
    • ExoPlayerAssetLoader 中选择轨道时,忽略音频通道计数限制,因为它们仅适用于播放。
    • androidx.media3.transformer.Muxer 接口替换为 androidx.media3.muxer.Muxer 并移除 androidx.media3.transformer.Muxer
    • 修复从内容 URI 方案加载 HEIC 图像的问题。(#1373)。
    • 调整 AudioGraphInput 中的音频轨道持续时间以改善 AV 同步。
    • 移除 ExportResult.processedInputs 字段。如果您将此字段用于编解码器详细信息,请改用 DefaultDecoderFactory.listener。如果发生编解码器异常,编解码器详细信息将在 ExportException.codecInfo 中可用。
  • 提取器
    • MPEG-TS:回滚更改,确保通过将流的最后一个访问单元传递到样本队列来渲染最后一帧(#7909)。包含了解决 I 帧 HLS 流(#1150)和 H.262 HLS 流(#1126)中出现的问题的修复。
    • MP3:优先使用 Info 帧中的数据大小,而不是底层流报告的大小(例如文件大小或 HTTP Content-Length 标头)。这有助于从恒定比特率查找计算中排除不可播放的尾部数据(例如专辑封面),使查找更精确(#1376)。
    • MP3:使用 Info 帧(如果存在)中的帧计数和其他数据来计算恒定比特率查找的平均比特率,而不是从 Info 帧之后的帧(可能人为地小,例如 PCUT 帧)的比特率推断(#1376)。
    • 修复 AVI 容器中的 PCM 音频格式提取。
  • 音频
    • 修复 DTS:X Profile 2 编码属性以进行直通播放(#1299)。
    • 对于卸载播放,在调用 AudioTrack.stop() 之前,重置 DefaultAudioSink 中流完成的跟踪字段,以便 AudioTrack.StreamEventCallback#onPresentationEnded 正确识别所有待处理数据何时已播放。
    • 修复 SilenceSkippingAudioProcessor 中的错误,即不同音频格式(例如立体声到单声道)之间的转换可能导致处理器抛出异常(#1352)。
    • 实现 MediaCodecAudioRenderer.getDurationToProgressUs(),以便 ExoPlayer 将其主工作循环动态调度到 MediaCodecAudioRenderer 可以进行时。
  • 视频
    • 修复了在播放过程中切换表面时 Listener.onRenderedFirstFrame() 过早到达的问题。
    • 修复了杜比视界的解码器回退逻辑,使其在需要时使用兼容的 AV1 解码器(#1389)。
    • 修复了可能因在播放中途启用视频渲染器而导致的编解码器异常。
  • 文本
    • 修复了字幕在查找位置之前开始时被跳过的错误。此问题仅在 Media3 1.4.0-alpha01 中引入。
    • 更改默认字幕解析行为,使其在提取过程中发生,而不是在渲染过程中发生(有关提取和渲染之间差异的更多信息,请参阅ExoPlayer 架构图)。
      • 此更改可以通过同时调用 MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)TextRenderer.experimentalSetLegacyDecodingEnabled(true) 来覆盖。有关如何将这些组件插入 ExoPlayer 实例的详细信息,请参阅自定义文档。这些方法(以及对旧版字幕解码的所有支持)将在未来的版本中移除。
      • 具有自定义 SubtitleDecoder 实现的应用需要更新它们以实现 SubtitleParser(以及 SubtitleParser.Factory 而不是 SubtitleDecoderFactory)。
    • PGS:修复行程长度解码以将 0 解析为颜色索引,而不是字面颜色值(#1367)。
    • CEA-708:忽略 rowLock 值。CEA-708-E S-2023 规范指出,无论流中存在的值如何,rowLockcolumnLock 都应假定为 true(columnLock 支持未实现,因此实际上总是假定为 false)。
      • 这最初包含在 1.3.0-alpha01 发布说明中,但在 1.3.0-rc01 发布之前意外回滚了此更改。现在已修复,因此此更改再次存在。
    • CEA-708:避免 ExoPlayer 对“设置笔位置”命令的简单处理添加重复的换行符(#1315)。
    • 修复 LegacySubtitleUtil 在 WebVTT 字幕样本不包含任何提示时(例如作为 DASH 流的一部分)抛出的 IllegalArgumentException#1516)。
  • 元数据
    • 修复 MP4 到 ID3 排序标签的映射。此前,“专辑排序”(soal)、“艺术家排序”(soar)和“专辑艺术家排序”(soaa)MP4 标签被错误地映射到 TSO2TSOATSOP ID3 标签(#1302)。
    • 修复 MP4 (/iTunes) 数字 gnre (流派) 和 tmpo (速度) 标签在值长度超过一个字节时的读取问题。
    • 将 ID3 TCON 帧传播到 MediaMetadata.genre#1305)。
  • 图像
    • 添加对非方形 DASH 缩略图网格的支持(#1300)。
    • 为 API 34+ 添加 AVIF 支持。
    • 允许 ExoPlayer.setImageOutput() 的参数为 null,以清除之前设置的 ImageOutput
  • 数据源
    • 实现对 android.resource://package/id 原始资源 URI 的支持,其中 package 与当前应用程序的包不同。此前未记录此功能,但它是比按名称访问另一个包中的资源更有效的方式。
    • DataSpec 构造函数中提前检查 url 是否为非空。此参数已标记为非空。
    • 允许 ByteArrayDataSourceopen() 期间将 URI 解析为字节数组,而不是在构造时硬编码(#1405)。
  • DRM
    • 允许在 DefaultDrmSessionManagerProvider 上设置 LoadErrorHandlingPolicy#1271)。
  • 效果
    • 支持在 SpeedChangeEffect 中,同一 EditedMediaItemComposition 内的多次速度更改。
    • 支持从超 HDR 位图输入输出 HLG 和 PQ。
    • 添加对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,这改善了 ExoPlayer.setVideoEffect 和 Transformer 的 Debug SurfaceView 中的 HLG 表面输出。
    • 更新叠加矩阵实现,使其与文档一致,通过翻转 setOverlayFrameAnchor() 中应用的 x 和 y 值。如果使用 OverlaySettings.Builder.setOverlayFrameAnchor(),请将它们的 x 和 y 值乘以 -1 来翻转。
    • 修复了 TimestampWrapperExoPlayer#setVideoEffects 一起使用时崩溃的错误(#821)。
    • 将默认 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。还提供第三个选项以保留原始颜色空间。
    • 允许定义 EditedMediaItemSequences 的不确定 z 顺序(#1055)。
    • 在不同的 HDR 内容之间保持一致的亮度范围(使用 HLG 范围)。
    • 添加对 HDR 内容上的超 HDR(位图)叠加层的支持。
    • 允许在 API 26 之前使用 SeparableConvolution 效果。
    • 移除未使用的 OverlaySettings.useHdr,因为叠加层和帧的动态范围必须匹配。
    • TextOverlay 添加 HDR 支持。文本叠加层的亮度可以通过 OverlaySettings.Builder.setHdrLuminanceMultiplier() 进行调整。
  • IMA 扩展
    • 将应用播放 DAI 广告流所需的 API 提升为稳定版。
    • ImaServerSideAdInsertionMediaSource.AdLoader 添加 replaceAdTagParameters(Map <String, String>),允许在运行时替换广告标签参数。
    • 修复了在广告播放期间发生播放器错误时未调用 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)。
    • 对齐 MediaMetadataMediaDescriptionCompat 的转换,以便在选择元数据属性时使用与 media1 相同的首选顺序和逻辑。
    • 添加 MediaSession.sendError(),允许向 Media3 控制器发送非致命错误。当使用通知控制器(参见 MediaSession.getMediaNotificationControllerInfo())时,自定义错误用于将平台会话的 PlaybackState 更新为带有给定错误信息的错误状态(#543)。
    • 添加 MediaSession.Callback.onPlayerInteractionFinished() 以通知会话何时完成来自特定控制器的一系列播放器交互。
    • 添加 SessionError,并在 SessionResultLibraryResult 中使用它代替错误代码,以提供更多关于错误的信息以及如何(如果可能)解决错误。
    • 发布 media3 控制器测试应用的代码,该应用可用于测试与发布媒体会话的应用的交互。
    • 将传递给 media3 的 MediaSession[Builder].setSessionExtras() 的附加信息传播到 media1 控制器的 PlaybackStateCompat.getExtras()
    • 将致命和非致命错误映射到平台会话,并从中映射。一个 PlaybackException 被映射到 PlaybackStateCompat 的致命错误状态。发送到媒体通知控制器(通过 MediaSession.sendError(ControllerInfo, SessionError))的 SessionError 被映射到 PlaybackStateCompat 中的非致命错误,这意味着错误代码和消息已设置,但平台会话的状态与 STATE_ERROR 不同。
    • 允许按控制器设置会话活动,以覆盖全局会话活动。会话活动可以在连接时通过创建带有 AcceptedResultBuilder.setSessionActivivty(PendingIntent)ConnectionResult 来为控制器定义。连接后,会话活动可以通过 MediaSession.setSessionActivity(ControllerInfo, PendingIntent) 进行更新。
    • 改进对 MediaLibrarySession.Callback 调用的错误复制。现在可以通过使用 MediaLibrarySession.Builder.setLibraryErrorReplicationMode() 来配置错误复制,以选择错误类型或选择退出错误复制(默认启用)。
  • UI
    • 当连接到 ExoPlayer 时,为 PlayerView 添加图像显示支持(#1144)。
    • 通过 XML 属性添加 PlayerControlView 中各种图标的自定义功能,以允许每个 PlayerView 实例使用不同的可绘制对象,而不是全局覆盖(#1200)。
    • 解决 API 34 上在 Compose AndroidView 中使用 SurfaceView 时导致视频拉伸/裁剪的平台错误(#1237)。
  • 下载
    • 确保 DownloadHelper 不会泄漏未释放的 Renderer 实例,这最终可能导致应用因 IllegalStateException: Too many receivers, total of 1000, registered for pid 而崩溃(#1224)。
  • Cronet 扩展
    • 修复 CronetDataSource 中的 SocketTimeoutException。在某些版本的 Cronet 中,回调提供的请求并不总是相同的。这导致回调未完成且请求超时(https://issuetracker.google.com/328442628)。
  • HLS 扩展
    • 修复了 HlsSampleStreamWrapper 中,等待不连续性挂起的 EMSG 样本以不正确的偏移量委托,导致 IndexOutOfBoundsExceptionIllegalArgumentException 的错误(#1002)。
    • 修复了非主播放列表在 LL-HLS 流中持续重新加载的错误(#1240)。
    • 修复了为带有初始化段的 HLS 启用 CMCD 导致 Source ErrorIllegalArgumentException 的错误。
    • 修复了在直播播放期间非主要播放列表未刷新的错误(#1240)。
    • 修复了为 HLS 直播流启用 CMCD 导致 ArrayIndexOutOfBoundsException 的错误(#1395)。
  • DASH 扩展
    • 修复了重新准备多时段直播流可能抛出 IndexOutOfBoundsException 的错误(#1329)。
    • 添加对 dashif:Laurl 许可证 URL 的支持(#1345)。
  • Cast 扩展
    • 修复了将 MediaQueueItem 的专辑标题转换为 Media3 媒体项中艺术家的问题(#1255)。
  • 测试实用程序
    • FakeRenderer 中实现 onInit()onRelease()
    • 更改 TestPlayerRunHelper.runUntil()/playUntil() 方法,使其在非致命错误(例如报告给 AnalyticsListener.onVideoCodecError() 的错误)上失败。使用新的 TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() 方法链来禁用此行为。
  • 演示应用
    • 在短格式演示应用中使用 DefaultPreloadManager
    • 允许通过命令行 Intent 参数设置重复模式(#1266)。
    • 如果设备支持,则使用 HttpEngineDataSource 作为 HttpDataSource
  • 删除已弃用符号
    • 移除 CronetDataSourceFactory。请改用 CronetDataSource.Factory
    • 移除部分 DataSpec 构造函数。请改用 DataSpec.Builder
    • DefaultHttpDataSourceOkHttpDataSourceCronetDataSource 中移除 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.DUMMYgetDummyDrmSessionManager() 方法。请改用 DrmSessionManager.DRM_UNSUPPORTED
    • 移除 AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)AudioRendererEventListener.onAudioInputFormatChanged(Format)VideoRendererEventListener.onVideoInputFormatChanged(Format)。请改用接受 DecoderReuseEvaluation 的重载。
    • 移除 RendererSupport.FormatSupport IntDef 以及 FORMAT_HANDLEDFORMAT_EXCEEDS_CAPABILITIESFORMAT_UNSUPPORTED_DRMFORMAT_UNSUPPORTED_SUBTYPEFORMAT_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
    • 修复 PreloadMediaPeriod 再次预加载时无法保留流的问题。
    • 在轨道重新选择中,将正确的相应 TrackSelectionResult 应用于播放期间。
    • 在媒体项之间转换时,只有在前进播放期之后才启动早期启用的渲染器(#1017)。
    • 添加 DefaultVideoFrameProcessor.Factory.Builder.build() 的 Proguard -keepclasseswithmembers 规则中缺失的返回类型(#1187)。
  • Transformer
    • 添加对因 MediaMuxer 不支持 API 30 之前的负呈现时间戳而抛出异常的解决方法。
  • 轨道选择
    • DefaultTrackSelector:优先选择帧率“合理”(>=10fps)的视频轨道,而不是帧率较低或未设置的视频轨道。这确保了播放器在从运动照片中提取的 MP4 中选择“真实”视频轨道,这些 MP4 可能包含两个 HEVC 轨道,其中一个分辨率更高但帧数非常少(#1051)。
  • 提取器
    • 修复了从 WAV 文件读取奇数大小块时未跳过填充的问题(#1117)。
    • MP3:从 XINGVBRI 等元数据帧填充 Format.averageBitrate
    • MPEG-TS:回滚旨在确保通过将流的最后一个访问单元传递到样本队列来渲染最后一帧的更改(#7909)。这是因为该更改导致了 I 帧 HLS 流(#1150)和 H.262 HLS 流(#1126)的新问题。
  • 音频
    • 允许渲染器恢复,如果音频轨道在卸载模式下初始化失败,则禁用卸载。
  • 视频
    • 添加针对 Galaxy Tab S7 FE、Chromecast with Google TV 和 Lenovo M10 FHD Plus 设备问题的解决方法,该问题导致 60fps H265 流被标记为不受支持。
    • 添加解决方法,确保即使设备不按 API 要求自动执行此操作,在隧道传输时也能始终渲染第一帧(#1169)。(#966)。
    • 修复 HDR 颜色信息处理导致编解码器行为异常并阻止 SDR 视频轨道的自适应格式切换的问题(#1158)。
  • 文本
    • WebVTT:防止直接连续的提示从 WebvttParser.parse 创建虚假的附加 CuesWithTiming 实例(#1177)。
  • DRM
    • 解决了 MediaDrm 框架可能抛出 NoSuchMethodError 而不是 ResourceBusyExceptionNotProvisionedException 的问题,该问题发生在某些 Android 14 设备上(#1145)。
  • 效果
    • 通过转换颜色空间改进 PQ 到 SDR 色调映射。
  • 会话
    • 修复了当控制器替换当前项目时,当前位置跳回的错误(#951)。
    • 修复了仅包含非空 extrasMediaMetadata 未在媒体控制器和会话之间传输的错误(#1176)。
  • UI
    • 如果 Locale 无法识别显示名称,则回退到包含音频轨道语言名称(#988)。
  • DASH 扩展
    • 将清单中的所有 Label 元素填充到 Format.labels 中(#1054)。
  • RTSP 扩展
    • 跳过 SDP 解析中的空会话信息值(i 标签)(#1087)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • 默认情况下禁用 MIDI 扩展作为本地依赖项,因为它需要配置额外的 Maven 存储库。需要从本地依赖项获取此模块的用户可以重新启用它

版本 1.3.0

2024 年 3 月 6 日

androidx.media3:media3-*:1.3.0 已发布。版本 1.3.0 包含这些提交

  • 通用库
    • 实现对 android.resource://package/[type/]name 原始资源 URI 的支持,其中 package 与当前应用程序的包不同。这在文档中一直被视为可行,但直到现在才正确实现。
    • 规范化由应用代码设置或从媒体读取的 MIME 类型,使其完全小写。
    • AdPlaybackState 中使用完整的 MediaItem 而不是单个 Uri 来定义广告。
    • minSdk 增加到 19 (Android KitKat)。这与所有其他 AndroidX 库保持一致,并且是我们将升级到最新版本 AndroidX 依赖项所必需的。
    • artworkUriartworkData 中至少有一个非空时,将两者都填充到 MediaMetadata.Builder.populate(MediaMetadata) 中(#964)。
  • ExoPlayer
    • 添加 PreloadMediaSourcePreloadMediaPeriod,允许应用程序在播放前预加载特定起始位置的内容媒体源。PreloadMediaSource 负责准备内容媒体源以接收 Timeline,在给定起始位置准备和缓存时段,选择轨道并加载时段的媒体数据。应用程序通过实现 PreloadMediaSource.PreloadControl 并将预加载的源设置为播放器进行播放来控制预加载进度。
    • 添加 ExoPlayer.setImageOutput,允许应用设置 ImageRenderer.ImageOutput
    • DefaultRenderersFactory 现在默认向播放器提供一个 ImageRenderer,其 ImageOutput 为 null,ImageDecoder.Factory.DEFAULT
    • 在跳过静音时发出 Player.Listener.onPositionDiscontinuity 事件(#765)。
    • 添加对提取过程中解析字幕的实验性支持。您可以使用 MediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 启用此功能。
    • 支持 PreloadMediaSource 的自适应媒体源。
    • 实现 HttpEngineDataSource,这是一个使用 HttpEngine API 的 HttpDataSource
    • 阻止 CompositeSequenceableLoader 的子类化。此组件以前是可扩展的,但在库中从未被子类化。可以通过使用装饰器模式包装实例并实现自定义 CompositeSequenceableLoaderFactory 来进行自定义。
    • 修复了重复相同时间导致此项目的元数据被清除的错误(#1007)。
    • BundledChunkExtractor.FactoryDefaultHlsExtractorFactory 上的 experimentalSetSubtitleParserFactory 方法重命名为 setSubtitleParserFactory,并禁止传递 null。使用新的 experimentalParseSubtitlesDuringExtraction(boolean) 方法来控制解析行为。
    • 添加对自定义提取期间使用的 SubtitleParser.Factory 的支持。这可以通过 MediaSource.Factory.setSubtitleParserFactory() 实现。
    • 将源前缀添加到从 MergingMediaSource 生成的所有 Format.id 字段。这有助于识别哪个源产生了 Format#883)。
    • 通过修改用于验证自定义通用媒体客户端数据 (CMCD) 键名的正则表达式,使其仅检查连字符,从而修复了该正则表达式(#1028)。
    • 停止双重编码 CMCD 查询参数(#1075)。
  • Transformer
    • 添加对平化 H.265/HEVC SEF 慢动作视频的支持。
    • 提高转码速度,特别是对于“移除视频”编辑。
    • 添加 API 以确保输出文件以视频帧开始。这可以使裁剪操作的输出与播放器实现更兼容,因为这些播放器在呈现时间戳之前不显示第一帧视频(#829)。
    • 添加对优化单个资产 MP4 裁剪操作的支持。
    • 添加支持,确保视频帧在输出文件中具有第一个时间戳。修复了 iOS 播放器上输出文件以黑帧开始的问题(#829)。
  • 轨道选择
    • 添加 DefaultTrackSelector.selectImageTrack 以启用图像轨道选择。
    • 添加 TrackSelectionParameters.isPrioritizeImageOverVideoEnabled,用于确定当图像轨道和视频轨道都可用时是否选择图像轨道。默认值为 false,这意味着优先选择视频轨道。
  • 提取器
    • 向 MP4 提取器添加额外的 AV1C 解析,以检索 ColorInfo.colorSpaceColorInfo.colorTransferColorInfo.colorRange 值(#692)。
    • MP3:对于带有 Info 头部(与 Xing 头部等效的 CBR)的文件,使用恒定比特率 (CBR) 查找。以前我们使用 Info 头部中的查找表,但这会导致查找精度低于忽略它并假设文件是 CBR 的情况。
    • MPEG2-TS:添加 DTS、DTS-LBR 和 DTS:X Profile2 支持(#275)。
    • 从 TS 描述符中提取音频类型并将其映射到角色标志,允许用户做出更明智的音频轨道选择(#973)。
  • 音频
    • 通过平滑音量渐变改进静音跳过算法;保留了最小静音和更自然的静音时长(#7423)。
    • 更确定性地报告跳过的静音(#1035)。
  • 视频
    • 更改 MediaCodecVideoRenderer 的构造函数,该构造函数接受 VideoFrameProcessor.Factory 参数,并将其替换为接受 VideoSinkProvider 参数的构造函数。希望注入自定义 VideoFrameProcessor.Factory 的应用可以实例化一个使用自定义 VideoFrameProcessor.FactoryCompositingVideoSinkProvider,并将视频接收器提供者传递给 MediaCodecVideoRenderer
  • 文本
    • 修复位图提示的序列化,以解决使用 DefaultExtractorsFactory.setTextTrackTranscodingEnabled 时出现的 Tried to marshall a Parcel that contained Binder objects 错误(#836)。
    • CEA-708:忽略 rowLock 值。CEA-708-E S-2023 规范指出,无论流中存在的值如何,rowLockcolumnLock 都应假定为 true(columnLock 支持未实现,因此实际上总是假定为 false)。
  • 图像
    • 添加对 DASH 缩略图的支持。网格图像被裁剪,并以接近其呈现时间的方式向 ImageOutput 提供单个缩略图。
  • DRM
  • IMA 扩展
    • 修复了没有相应文件扩展名的 DASH 和 HLS 广告无法播放的错误。
  • 会话
    • 为电视应用禁用双击检测(#962)。
    • 修复了仅包含非空 extras 的 MediaItem.RequestMetadata 未在媒体控制器和会话之间传输的问题。
    • MediaLibrarySession.Builder 添加构造函数,该构造函数仅接受 Context 而不是 MediaLibraryService
  • HLS 扩展
    • HlsMediaPeriod 的可见性限制为包私有。此类型不应直接依赖于 HLS 包之外。
    • 更有效地解决查找段开始的问题(#1031)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • MIDI 解码器:忽略 SysEx 事件消息(#710)。
  • 测试实用程序
    • TestPlayerRunHelper.playUntilPosition 中不暂停播放。测试使播放保持播放状态,但暂停进度,直到测试能够添加断言和进一步操作。
  • 演示应用
    • 添加一个短格式演示模块,以演示 PreloadMediaSource 在短格式内容用例中的使用。

版本 1.3.0-rc01

2024 年 2 月 22 日

使用 1.3.0 稳定版

版本 1.3.0-beta01

2024 年 2 月 7 日

使用 1.3.0 稳定版

版本 1.3.0-alpha01

2024 年 1 月 15 日

使用 1.3.0 稳定版

版本 1.2.0

版本 1.2.1

2024 年 1 月 9 日

  • ExoPlayer
    • 修复了在 LiveConfiguration.min/maxOffset 范围之外手动查找会持续将偏移量调整回 min/maxOffset 的问题。
    • 修复了 OPUS 和 VORBIS 声道布局在 3、5、6、7 和 8 声道时错误的问题(#8396)。
    • 修复了在直播流中寻找零点后轨道选择错误地导致流在默认位置开始的问题(#9347)。
    • 修复了 CmcdData.Factory 新实例从块源接收 bufferedDurationUs 的负值,导致 IllegalArgumentException 的问题(#888)。
  • Transformer
    • 解决了编码器在配置时因设置高操作速率而抛出异常的问题。
  • 提取器
    • 将 JPEG 运动照片中的次要(不可播放)HEVC 轨道标记为 ROLE_FLAG_ALTERNATE,以防止它们因分辨率较高而被自动选择播放。
    • 修复 TS H264 流的错误关键帧检测(#864)。
    • 修复了 TS 流时长超过 47721 秒的持续时间估算问题(#855)。
  • 音频
    • 修复了多次调用 SilenceSkippingAudioProcessor 时 EOS 处理的问题(#712)。
  • 视频
    • 添加针对 Galaxy Tab S7 FE、Chromecast with Google TV 和 Lenovo M10 FHD Plus 设备问题的解决方法,该问题导致 60fps AVC 流被标记为不受支持(#693)。
  • 元数据
    • 修复了 MediaMetadata 仅从大写键的 Vorbis 注释中填充的错误(#876)。
    • 捕获解析超大 ID3 帧时出现的 OutOfMemoryError,这意味着播放可以在没有标签信息的情况下继续,而不是完全失败。
  • DRM
    • 将针对虚假 ClearKey https://default.url 许可证 URL 的解决方法扩展到 API 33+(此前该解决方法仅适用于 API 33)(#837)。
    • 修复了在播放器未附加表面时从加密内容切换到明文内容时出现的 ERROR_DRM_SESSION_NOT_OPENED 错误。该错误是由于错误地使用安全解码器播放明文内容造成的。
  • 会话
    • MediaMetadataCompat 中的自定义键和值放入 MediaMetadata.extras,并将 MediaMetadata.extras 放入 MediaMetadataCompat#756, #802)。
    • 修复了向旧版控制器广播 notifyChildrenChanged 的问题(#644)。
    • 修复了通知禁用 setWhen 计时器设置为负时间时,在某些设备上导致崩溃的错误(#903)。
    • 修复了当第一次请求通知更新时,媒体通知控制器尚未完成连接,导致 IllegalStateException 的问题(#917)。
  • UI
    • 修复了与 Material Design 在 BottomSheetDialogFragment 中使用时,快进和快退按钮不可见的问题(#511)。
    • 修复了 PlayerControlView 中快进按钮上的数字错位问题(#547)。
  • DASH 扩展
    • 在 DASH 清单中将“f800”解析为杜比的 5 个声道(#688)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • MIDI:修复了快进时跳过 Program Change 事件的问题(#704)。
    • 迁移到 FFmpeg 6.0 并更新支持的 NDK 到 r26b#707, #867)。
  • 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 兼容性问题,即不可空泛型类型参数和不可空数组元素类型未被检测为不可空。示例包括 TrackSelectorResultSimpleDecoder 方法参数(#6792)。
    • 更改 Util.shouldShowPlayButton 中的默认 UI 和通知行为,以便在播放暂时被抑制(例如,由于暂时性音频焦点丢失)时显示“播放”按钮。旧版行为可以通过使用 PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) 来保持(#11213)。
    • androidx.annotation:annotation-experimental 升级到 1.3.1 以修复 https://issuetracker.google.com/251172715。
    • ExoPlayer.setAudioAttributes 移动到 Player 接口。
  • ExoPlayer
    • 修复由于未能正确识别仅解码样本而导致的 AC4 流中的查找问题(#11000)。
    • 添加对在不合适的音频输出设备(例如 Wear OS 设备上的内置扬声器)上抑制播放的支持,当此功能通过 ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput 启用时。如果播放时没有合适的音频输出设备,或者所有合适的输出设备在播放期间断开连接,则播放抑制原因将更新为 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT。当连接合适的输出设备时,抑制原因将被移除。
    • 添加 MediaSource.canUpdateMediaItemMediaSource.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 包含附加参数,包括 playbackSpeedlastRebufferRealtimeMs,以及现有的 playbackPositionUs
    • 增强 ChunkSource 接口中的 ChunkSource.getNextChunk(long, long, List, ChunkHolder) 方法,使其变为 ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
    • 在通用媒体客户端数据 (CMCD) 日志中添加附加字段:缓冲区饥饿 (bs)、截止时间 (dl)、播放速率 (pr) 和启动 (su)(#8699)。
    • ColorInfo 添加亮度和色度位深度(#491)。
    • 向通用媒体客户端数据 (CMCD) 日志中添加附加字段:下一个对象请求 (nor) 和下一个范围请求 (nrr)(#8699)。
    • 添加使用查询参数传输通用媒体客户端数据 (CMCD) 数据的功能(#553)。
    • 修复 ExperimentalBandwidthMeter 中的 ConcurrentModificationException#612)。
    • CompositeMediaSource.getMediaTimeForChildMediaTime 添加 MediaPeriodId 参数。
    • ConcatenatingMediaSource2 中支持 ClippingMediaSource(以及其他带有周期/窗口时间偏移的源)(#11226)。
    • BaseRenderer.onStreamChanged() 更改为也接收 MediaPeriodId 参数。
  • Transformer
    • 解析图像输入的 EXIF 旋转数据。
    • 移除 TransformationRequest.HdrMode 注解类型及其相关常量。请改用 Composition.HdrMode 及其相关常量。
    • 简化 OverlaySettings 以修复旋转问题。
    • SampleConsumer.queueInputBitmapframeRatedurationUs 参数更改为 TimestampIterator
  • 轨道选择
    • 添加 DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness 以明确允许或禁止非无缝自适应。默认行为保持不变,即 true
  • 提取器
    • MPEG-TS:确保通过将流的最后一个访问单元传递到样本队列来渲染最后一帧(#7909)。
    • 修复确定 rotationDegrees 时的拼写错误。将 projectionPosePitch 更改为 projectionPoseRoll#461)。
    • 移除 Extractor 实例可以直接使用 instanceof 检查的假设。如果您想在运行时访问 Extractor 的实现细节,您必须首先调用 Extractor.getUnderlyingInstance
    • 添加 BmpExtractor
    • 添加 WebpExtractor
    • 添加 HeifExtractor
    • Mp4Extractor 中添加对 QuickTime classic 的支持。
  • 音频
    • 添加对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析 MP4 中 lpcm 的 PCM 编码。
    • 添加对在 MP4 中提取 Vorbis 音频的支持。
    • 添加 AudioSink.getFormatOffloadSupport(Format),它通过 DefaultAudioOffloadSupportProvider 检索接收器可以为格式提供的卸载支持级别。它返回新的 AudioOffloadSupport,其中包含 isFormatSupportedisGaplessSupportedisSpeedChangeSupported
    • 添加 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.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
    • onExperimentalSleepingForOffloadChanged 重命名为 onSleepingForOffloadChanged,将 onExperimentalOffloadedPlayback 重命名为 onOffloadedPlayback
    • 将与音频卸载模式相关的 TrackSelectionParameters 接口和定义移动到内部 AudioOffloadPreferences 类。
    • AnalyticsListenerAudioRendererEventListenerAudioSink.Listener 添加 onAudioTrackInitializedonAudioTrackReleased 回调。
    • 修复 DTS Express 音频缓冲区下溢问题(#650)。
    • 修复了 E-AC3-JOC 的功能检查抛出 IllegalArgumentException 的错误(#677)。
  • 视频
    • 允许 MediaCodecVideoRenderer 使用自定义的 VideoFrameProcessor.Factory
    • 修复了如果音频流以负时间戳开始,则无法渲染第一帧的错误(#291)。
  • 文本
    • 移除 ExoplayerCuesDecoder。现在,带有 sampleMimeType = application/x-media3-cues 的文本轨道由 TextRenderer 直接处理,无需 SubtitleDecoder 实例。
  • 元数据
    • 将不再为“仅解码”样本调用 MetadataDecoder.decode,因为实现无论如何都必须返回 null。
  • 效果
    • 添加 VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>),按时间戳排队位图输入。
    • VideoFrameProcessor.registerInputStream() 更改为非阻塞。应用必须实现 VideoFrameProcessor.Listener#onInputStreamRegistered()
    • VideoFrameProcessor.queueInputBitmapframeRatedurationUs 参数更改为 TimestampIterator
  • IMA 扩展
    • 修复了播放列表中不是第一个项目的多时段 DASH 直播流可能抛出异常的错误(#571)。
    • 在调用 AdsLoader.destroy() 之前释放 StreamManager
    • IMA SDK 版本更新至 3.31.0。
  • 会话
    • DefaultMediaNotificationProvider 中将通知前台服务行为设置为 FOREGROUND_SERVICE_IMMEDIATE (#167)。
    • 在 API 31 以上版本中,仅使用 android.media.session.MediaSession.setMediaButtonBroadcastReceiver() 以避免在三星设备上出现已弃用 API 的问题 (#167)。
    • 使用媒体通知控制器作为代理来设置可用命令和用于填充通知和平台会话的自定义布局。
    • 将通过 MediaSessionService.onStartCommand() 在 Media3 中收到的媒体按钮事件进行转换,而不是将它们路由到平台会话再路由回 Media3。这样,调用方控制器始终是媒体通知控制器,并且应用程序可以在所有支持的 API 级别上轻松识别来自通知的调用。
    • 修复连接到旧版 MediaSessionCompatMediaController.getCurrentPosition() 不前进的错误。
    • 添加 MediaLibrarySession.getSubscribedControllers(mediaId) 以提供便利。
    • 覆盖 MediaLibrarySession.Callback.onSubscribe() 以断言控制器订阅的父 ID 的可用性。如果成功,则接受订阅并立即调用 notifyChildrenChanged() 以通知浏览器 (#561)。
    • 为 Automotive OS 添加会话演示模块,并为 Android Auto 启用会话演示。
    • 当媒体通知控制器不支持 COMMAND_GET_TIMELINE 时,不设置框架会话的队列。由于 Android Auto 作为从框架会话读取的客户端控制器,这将导致 Android Auto UI 中的 queue 按钮不显示 (#339)。
    • 默认使用 DataSourceBitmapLoader 而不是 SimpleBitmapLoader (#271, #327)。
    • 添加 MediaSession.Callback.onMediaButtonEvent(Intent),允许应用程序覆盖默认的媒体按钮事件处理。
  • UI
    • 为 Wear OS 设备添加了 Player.Listener 实现,该实现通过启动系统对话框处理由于 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT 导致的播放抑制,以允许用户连接合适的音频输出(例如蓝牙耳机)。如果在可配置的超时(默认为 5 分钟)内连接了合适的设备,则侦听器将自动恢复播放。
  • 下载
    • DownloadService 声明“数据同步”前台服务类型,以兼容 Android 14。使用此服务时,应用程序还需要在清单中将 dataSync 添加为 foregroundServiceType 并添加 FOREGROUND_SERVICE_DATA_SYNC 权限 (#11239)。
  • HLS 扩展
    • 以从上次加载开始时间而不是上次加载完成时间计算的间隔刷新 HLS 直播播放列表 (#663)。
  • DASH 扩展
    • 允许段模板 URL 中存在多个相同的 DASH 标识符。
    • 添加在提取过程中解析字幕的实验性支持。这更好地支持合并重叠字幕,包括解决字幕段之间切换时的闪烁问题。您可以使用 DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 启用此功能 (#288)。
  • RTSP 扩展
    • 修复可能导致回退到 TCP 时出现 IndexOutOfBoundsException 或在某些情况下播放挂起的竞态条件。
    • 在返回 RtspMediaPeriod 的加载状态时检查 RTSP 设置中的状态 (#577)。
    • 忽略 Options 响应公共头部中的自定义 Rtsp 请求方法 (#613)。
    • 在发送保持活动状态的 RTSP Options 请求的时间间隔中使用 RTSP Setup 响应超时值 (#662)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • 发布 MIDI 解码器模块,该模块支持使用 Jsyn 库合成音频来播放标准 MIDI 文件。
    • 添加 DecoderOutputBuffer.shouldBeSkipped 以直接标记不需要呈现的输出缓冲区。这比将被弃用的 C.BUFFER_FLAG_DECODE_ONLY 更受推荐。
    • 添加 Decoder.setOutputStartTimeUsSimpleDecoder.isAtLeastOutputStartTimeUs 以允许解码器在开始时间之前丢弃仅解码样本。这应该优先于将被弃用的 Buffer.isDecodeOnly
    • 修复将 MIDI 解码器工件发布到 Maven 仓库的错误。该工件已重命名为 media3-exoplayer-midi (#734)。
  • Leanback 扩展
    • 修复在 Leanback 代码中禁用 surface 可能导致 ArithmeticException 的错误 (#617)。
  • 测试实用程序
    • 使 TestExoPlayerBuilderFakeClock 兼容 Espresso UI 测试和 Compose UI 测试。这修复了在 Espresso 或 Compose 视图交互期间播放非确定性推进的错误。
  • 删除已弃用符号
    • 移除 TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)。改用 Composition.Builder.setHdrMode(int) 并将 Composition 传递给 Transformer.start(Composition, String)
    • 移除已弃用的 DownloadNotificationHelper.buildProgressNotification 方法,请改用接受 notMetRequirements 参数的非弃用方法。

版本 1.2.0-rc01

2023 年 11 月 1 日

使用 1.2.0 稳定版本

版本 1.2.0-beta01

2023 年 10 月 19 日

使用 1.2.0 稳定版本

版本 1.2.0-alpha02

2023 年 9 月 29 日

使用 1.2.0 稳定版本

版本 1.2.0-alpha01

2023 年 8 月 17 日

使用 1.2.0 稳定版本

版本 1.1.0

版本 1.1.1

2023 年 8 月 16 日

  • 通用库
    • 从所有模块中移除意外添加的 multidex 依赖项 (#499)。
  • ExoPlayer
    • 修复 PlaybackStatsListener 中在播放列表清除后创建虚假 PlaybackStats 的问题。
    • 为通用媒体客户端数据 (CMCD) 日志记录添加更多字段:流格式 (sf)、流类型 (st)、版本 (v)、最高比特率 (tb)、对象持续时间 (d)、测量吞吐量 (mtp) 和对象类型 (ot) (#8699)。
  • 音频
    • 修复播放非常短的文件时 Player.getState() 从未转换为 STATE_ENDED 的错误 (#538)。
  • 音频卸载
    • 根据 RFC 7845,在卸载 Opus 播放的比特流前添加 Ogg ID Header 和 Comment Header Pages。
  • 视频
    • H.265/HEVC:修复 SPS 短期和长期参考图片信息解析。
  • 文本
    • CEA-608:更改字幕截断逻辑,仅考虑可见文本。以前,在将字幕长度限制为 32 个字符时(按规范技术上是正确的)会包含缩进和制表符偏移 (#11019)。
  • IMA 扩展
    • IMA SDK 版本更新至 3.30.3。
  • 会话
    • 将自定义布局添加到控制器的状态并提供 getter 以访问它。当自定义布局更改时,将调用 MediaController.Listener.onCustomLayoutChanged。希望向不同 Media3 控制器发送不同自定义布局的应用程序可以在 MediaSession.Callback.onConnect 中通过使用 AcceptedResultBuilder 来确保自定义布局在连接完成时对控制器可用。
    • 修复 MediaLibraryServiceLegacyStub 向不支持此功能的 Result 发送错误,从而产生 UnsupportedOperationException 的情况 (#78)。
    • 修复 PlayerWrapper 通过传统命令 (COMMAND_ADJUST_DEVICE_VOLUMECOMMAND_SET_DEVICE_VOLUME) 和新命令 (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGSCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) 确定 volumeControlType 来创建 VolumeProviderCompat 的方式 (#554)。

版本 1.1.0

2023 年 7 月 5 日

  • 通用库
    • 添加不合适音频路由的抑制原因和抑制时间过长的播放准备就绪更改原因。(#15)。
    • 向 Player 添加命令
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • 向 Player 添加重载方法,允许用户指定音量标志
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • DeviceInfo 添加 Builder 并弃用现有构造函数。
    • 添加 DeviceInfo.routingControllerId 以指定远程播放的路由控制器 ID。
    • 添加 Player.replaceMediaItem(s) 作为在相同位置添加和移除项目的快捷方式 (#8046)。
  • ExoPlayer
    • 仅当明确选择时,才允许 ExoPlayer 控制设备音量方法。使用 ExoPlayer.Builder.setDeviceVolumeControlEnabled 来访问
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int)setDeviceVolume(int, int)
      • increaseDeviceVolume(int)increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int)decreaseDeviceVolume(int, int)
    • 添加 FilteringMediaSource,允许从 MediaSource 过滤可用轨道类型。
    • 添加对在 DASH、HLS 和 SmoothStreaming 等自适应流格式的传出请求中包含通用媒体客户端数据 (CMCD) 的支持。已包含以下字段:brblcidrtpsid (#8699)。API 结构和 API 方法
      • CMCD 日志记录默认禁用,使用 MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) 启用它。
      • 默认情况下,所有密钥都启用,覆盖 CmcdConfiguration.RequestConfig.isKeyAllowed(String key) 以过滤掉要记录的密钥。
      • 覆盖 CmcdConfiguration.RequestConfig.getCustomData() 以启用自定义密钥日志记录。
    • 在主演示的清单中添加额外的操作,以便更轻松地使用自定义 *.exolist.json 文件启动演示应用程序 (#439)。
    • 添加 ExoPlayer.setVideoEffects() 用于视频播放期间使用 Effect
    • 更新 SampleQueue 以将 sourceId 存储为 long 而不是 int。这会更改公共方法 SampleQueue.sourceIdSampleQueue.peekSourceId 的签名。
    • LoadControl 方法 shouldStartPlaybackonTracksSelected 添加参数,允许将这些方法与相关的 MediaPeriod 关联。
    • 更改 ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) 的签名,通过添加一个时间线参数,该参数包含以映射中用作键的 UID 的周期。这对于避免多周期直播流的并发问题是必需的。
    • 弃用 EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)。可以改为调用不带 mediaTimeOffsetUs 的方法变体。请注意,即使对于已弃用的变体,偏移量也不再添加到调度程序调度的 MediaLoadData 对象的 startTimeUsendTimeUs 中。
    • ExoTrackSelection.blacklist 重命名为 excludeTrack,将 isBlacklisted 重命名为 isTrackExcluded
    • 修复在空播放列表上调用 ExoPlayer.setMediaItem(s)addMediaItem(s) 时行为不一致的错误。
  • Transformer
    • 移除 Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)。改用 ExoPlayerAssetLoader.Factory(MediaSource.Factory)Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
    • 移除 Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • 修复了一个错误,即如果视频流的末尾在输入帧等待处理时发出信号,则转换可能会卡住(导致混音器超时)。
    • 通过 MediaCodecList 查询编解码器,而不是使用 findDecoder/EncoderForFormat 实用程序,以扩展支持。
    • 移除 DefaultEncoderFactory 中的 B 帧配置,因为它在某些设备上不起作用。
  • 轨道选择
    • 添加 DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange,默认禁用。启用后,当渲染器功能更改时,DefaultTrackSelector 将触发新的轨道选择。
  • 提取器
    • Ogg:修复在持续时间较长的文件中查找时的错误 (#391)。
    • FMP4:修复 TimestampAdjuster 使用来自 emsg atom 的元数据采样时间初始化错误时间戳偏移的问题 (#356)。
  • 音频
    • 修复启用隧道且 AudioProcessors 处于活动状态时(例如用于无间隙修剪)某些播放失败的错误 (#10847)。
    • 在直接播放 (offload) 中将 Opus 帧封装在 Ogg 数据包中。
    • 通过卸载调度在睡眠期间推断当前位置。
    • 添加 Renderer.release()AudioSink.release() 以在播放器生命周期结束时释放资源。
    • 监听 DefaultAudioSink 中的音频功能更改。在 DefaultAudioSink 的构造函数中添加了一个必需参数 contextDefaultAudioSink 将使用它注册为 AudioCapabilitiesReceiver 的侦听器,并在收到功能更改通知时更新其 audioCapabilities 属性。
    • 通过 AudioSink.Listener 接口中的新事件 onAudioCapabilitiesChanged 和触发 onRendererCapabilitiesChanged 事件的新接口 RendererCapabilities.Listener 传播音频功能更改。
    • 添加 ChannelMixingAudioProcessor 以将缩放/混合应用于音频通道。
    • DecoderDiscardReasons 添加新的 int 值 DISCARD_REASON_AUDIO_BYPASS_POSSIBLE,以便在音频功能更改后可能进入旁路模式时丢弃音频解码器。
    • 添加对 DTS Express 和 DTS:X 的直接播放支持 (#335)。
  • 视频
    • 当渲染器禁用时,使 MediaCodecVideoRenderer 报告宽度和高度为 0 的 VideoSize。当 Player.getVideoSize() 更改时,Player.Listener.onVideoSizeChanged 会相应地被调用。通过此更改,当 Player.getCurrentTracks 不支持视频,或支持的视频轨道的大小尚未确定时,ExoPlayer 使用 MediaCodecVideoRenderer 时的视频大小的宽度和高度为 0。
  • DRM
    • 降低 DefaultDrmSession 上几个仅供内部使用的方法的可见性,这些方法不应从 DRM 包外部调用。
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • 混音器
    • 添加一个新的混音器库,可用于创建 MP4 容器文件。
  • IMA 扩展
    • 为 DAI 启用多周期直播 DASH 流。请注意,当前实现尚不支持直播流中的查找 (#10912)。
    • 修复了由于连续时间线中计算出的内容位置略有不同,导致在直播流中插入新广告组的错误。
  • 会话
    • 添加辅助方法 MediaSession.getControllerForCurrentRequest 以获取有关当前调用 Player 方法的控制器的信息。
    • 添加 androidx.media3.session.MediaButtonReceiver,使应用程序能够通过蓝牙耳机等发送的媒体按钮事件实现播放恢复 (#167)。
    • MediaSession.Callback.onAddMediaItems 添加默认实现,以允许将请求的 MediaItems 传递给 Player,如果它们具有 LocalConfiguration(例如 URI)(#282)。
    • 默认情况下,在 Android 12 及以下版本的紧凑媒体通知视图上添加“快进”和“快退”命令按钮 (#410)。
    • MediaSession.Callback.onAddMediaItems 添加默认实现,以允许将请求的 MediaItems 传递给 Player,如果它们具有 LocalConfiguration(例如 URI)(#282)。
    • 默认情况下,在 Android 12 及以下版本的紧凑媒体通知视图上添加“快进”和“快退”命令按钮 (#410)。
  • UI
    • 添加 Util 方法 shouldShowPlayButtonhandlePlayPauseButtonAction 以使用播放/暂停按钮编写自定义 UI 元素。
  • RTSP 扩展
    • 对于 MPEG4-LATM,如果在 Describe Response SDP 消息中不存在,则使用默认的 profile-level-id 值 (#302)。
    • 如果 DESCRIBE 响应头中存在,则使用 RTSP 会话的基本 Uri 进行相对路径解析 (#11160)。
  • DASH 扩展
    • 从多周期 DASH 流的 MediaLoadData.startTimeMsMediaLoadData.endTimeMs 中移除媒体时间偏移。
    • 修复重新准备多周期直播 Dash 媒体源时产生 IndexOutOfBoundsException 的错误 (#10838)。
  • HLS 扩展
    • 添加 HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) 以设置加载线程等待 TimestampAdjuster 初始化的超时。如果初始化在超时前未完成,则会抛出 PlaybackException 以避免播放无限期停滞。默认情况下,超时设置为零 (#323)。
  • 测试实用程序
    • DataSourceContractTest 中检查 URI 方案大小写不敏感性。
  • 删除已弃用符号
    • 移除 DefaultAudioSink 构造函数,改用 DefaultAudioSink.Builder
    • 移除 HlsMasterPlaylist,改用 HlsMultivariantPlaylist
    • 移除 Player.stop(boolean)。改用 Player.stop()Player.clearMediaItems()(如果 resettrue)。
    • 移除两个已弃用的 SimpleCache 构造函数,改用接受 DatabaseProvider 的非弃用构造函数以获得更好的性能。
    • 移除 DefaultBandwidthMeter 构造函数,改用 DefaultBandwidthMeter.Builder
    • 移除 DefaultDrmSessionManager 构造函数,改用 DefaultDrmSessionManager.Builder
    • 移除两个已弃用的 HttpDataSource.InvalidResponseCodeException 构造函数,改用接受附加字段(causeresponseBody)的非弃用构造函数以增强错误日志记录。
    • 移除 DownloadHelper.forProgressiveDownloadHelper.forHlsDownloadHelper.forDashDownloadHelper.forSmoothStreaming,改用 DownloadHelper.forMediaItem
    • 移除已弃用的 DownloadService 构造函数,改用包含提供 channelDescriptionResourceId 参数选项的非弃用构造函数。
    • 移除已弃用的 Charsets 字符串常量(ASCII_NAMEUTF8_NAMEISO88591_NAMEUTF16_NAMEUTF16LE_NAME),改用 kotlin.text 包中的 Kotlin Charsets、java.nio.charset.StandardCharsetscom.google.common.base.Charsets
    • 移除已弃用的 WorkManagerScheduler 构造函数,改用包含提供 Context 参数选项的非弃用构造函数。
    • 移除已弃用的方法 createVideoSampleFormatcreateAudioSampleFormatcreateContainerFormatcreateSampleFormat,这些方法用于实例化 Format 类。改用 Format.Builder 创建 Format 实例。
    • 移除已弃用的方法 copyWithMaxInputSizecopyWithSubsampleOffsetUscopyWithLabelcopyWithManifestFormatInfocopyWithGaplessInfocopyWithFrameRatecopyWithDrmInitDatacopyWithMetadatacopyWithBitratecopyWithVideoSize,改用 Format.buildUpon() 和 setter 方法。
    • 移除已弃用的 ExoPlayer.retry(),改用 prepare()
    • 移除已弃用的零参数 DefaultTrackSelector 构造函数,改用 DefaultTrackSelector(Context)
    • 移除已弃用的 OfflineLicenseHelper 构造函数,改用 OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
    • 移除已弃用的 DownloadManager 构造函数,改用接受 Executor 的构造函数。
    • 移除已弃用的 Cue 构造函数,改用 Cue.Builder
    • 移除已弃用的 OfflineLicenseHelper 构造函数,改用 OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
    • 移除四个已弃用的 AnalyticsListener 方法
      • onDecoderEnabled,改用 onAudioEnabled 和/或 onVideoEnabled
      • onDecoderInitialized,改用 onAudioDecoderInitialized 和/或 onVideoDecoderInitialized
      • onDecoderInputFormatChanged,改用 onAudioInputFormatChanged 和/或 onVideoInputFormatChanged
      • onDecoderDisabled,改用 onAudioDisabled 和/或 onVideoDisabled
    • 移除已弃用的 Player.Listener.onSeekProcessedAnalyticsListener.onSeekProcessed,改用 onPositionDiscontinuity 配合 DISCONTINUITY_REASON_SEEK
    • 移除 ExoPlayer.setHandleWakeLock(boolean),改用 setWakeMode(int)
    • 移除已弃用的 DefaultLoadControl.Builder.createDefaultLoadControl(),改用 build()
    • 移除已弃用的 MediaItem.PlaybackProperties,改用 MediaItem.LocalConfiguration。已弃用的字段 MediaItem.playbackProperties 现在是 MediaItem.LocalConfiguration 类型。

版本 1.1.0-rc01

2023 年 6 月 21 日

使用 1.1.0 稳定版本

版本 1.1.0-beta01

2023 年 6 月 7 日

使用 1.1.0 稳定版本

版本 1.1.0-alpha01

2023 年 5 月 10 日

使用 1.1.0 稳定版本

版本 1.0.0

版本 1.0.2

2023 年 5 月 18 日

androidx.media3:media3-*:1.0.2 已发布。版本 1.0.2 包含这些提交。

此版本对应于 ExoPlayer 2.18.7 版本

此版本包含自 1.0.1 版本以来的以下更改

  • 核心库
    • 添加 Buffer.isLastSample(),表示 Buffer 是否包含标志 C.BUFFER_FLAG_LAST_SAMPLE
    • 修复了如果最后一个包含帧的样本在未读取“流结束”样本的情况下出队,则最后一个帧可能无法呈现的问题。(#11079)。
  • 提取器
    • 通过重用 RTSP 和 MP4 提取器已使用的解析逻辑来修复 MPEG-TS 文件中 H.265 SPS 的解析 (#303)。
  • 文本
    • SSA:如果 UTF-16 文件以字节顺序标记开头,则添加对其的支持 (#319)。
  • 会话
    • 修复了 MediaController 在连接到更新其动作的旧版 MediaSessionCompat 时不更新其可用命令的问题。
    • 修复了在 API 30 上,当系统 UI 调用 Callback.onGetLibraryRootparams.isRecent == true 时,MediaLibraryService 无法返回 null 的错误 (#355)。
    • 修复 MediaSessionServiceMediaLibraryService 的内存泄漏 (#346)。
    • 修复了 MediaSession 中合并的 Timeline 和位置更新可能导致 MediaController 抛出 IllegalStateException 的错误。

版本 1.0.1

2023 年 4 月 18 日

androidx.media3:media3-*:1.0.1 已发布。版本 1.0.1 包含这些提交。

此版本对应于 ExoPlayer 2.18.6 版本

  • 核心库
    • 在跳转到默认位置时重置目标直播流覆盖 (#11051)。
    • 修复了媒体中空样本流可能导致播放卡住的错误。
  • 会话
    • 修复了旧版 MediaSessionCompat 发布多个相同队列项导致 MediaController 中出现异常的错误 (#290)。
    • 添加了缺少将 MediaSession.broadcastCustomCommand 转发到旧版 MediaControllerCompat.Callback.onSessionEvent 的功能 (#293)。
    • 修复了调用 MediaSession.setPlayer 不会更新可用命令的错误。
    • 修复了如果 MediaController 发送的 TrackSelectionOverride 实例引用具有 Format.metadata 的组,则会被忽略的问题 (#296)。
    • 修复了需要 Player.COMMAND_GET_CURRENT_MEDIA_ITEM 才能通过旧版 MediaSessionCompat 访问元数据的问题。
    • 修复了在后台线程上使用 MediaSession 实例在 MediaSessionService 中导致崩溃的问题 (#318)。
    • 修复了库在应用程序未意图的情况下声明媒体按钮接收器的问题 (#314)。
  • DASH
    • 修复空段时间线的处理 (#11014)。
  • RTSP
    • 如果 RTSP Setup 与 UDP 失败并出现 RTSP 错误 461 UnsupportedTransport,则使用 TCP 重试 (#11069)。

版本 1.0.0

2023 年 3 月 22 日

androidx.media3:media3-*:1.0.0 已发布。版本 1.0.0 包含这些提交。

此版本对应于 ExoPlayer 2.18.5 版本

自 1.0.0-rc02 以来没有变化。

版本 1.0.0-rc02

2023 年 3 月 2 日

androidx.media3:media3-*:1.0.0-rc02 已发布。版本 1.0.0-rc02 包含这些提交。

此版本对应于 ExoPlayer 2.18.4 版本

  • 核心库
    • 修复 API 33 上的网络类型检测 (#10970)。
    • 修复调用 ExoPlayer.isTunnelingEnabled 时出现的 NullPointerException (#10977)。
  • 下载
    • 使 SegmentDownloader 及其子类中两个段的开始时间的最大差异可配置 (#248)。
  • 音频
    • 修复三星设备上损坏的无缝 MP3 播放 (#8594)。
    • 修复了禁用音频后立即设置的播放速度可能被之前的速度更改覆盖的错误 (#10882)。
  • 视频
    • 将 HEVC HDR10 格式映射到 HEVCProfileMain10HDR10 而不是 HEVCProfileMain10
    • 添加了针对 Chromecast with Google TV 和 Lenovo M10 FHD Plus 设备问题的临时修复,该问题导致 60fps AVC 流被标记为不支持 (#10898)。
    • 修复播放帧率远高于屏幕刷新率的媒体时帧释放性能问题。
  • 投射
    • 修复媒体项目之间转换时的瞬时 STATE_IDLE (#245)。
  • RTSP
    • 捕获在解析无效 RTSP Describe 响应消息时抛出的 IllegalArgumentException (#10971)。
  • 会话
    • 修复通知播放/暂停按钮未随播放器状态更新的错误 (#192)。
  • IMA 扩展
    • 修复了 DAI 流未包含任何广告时无法启动的错误,因为第一个(在没有广告的情况下是唯一的)LOADED 事件未收到。

版本 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)。
  • 音频
    • 在直接播放 (passthrough) 中使用压缩音频格式比特率计算 AudioTrack 的最小缓冲区大小。
  • 文本
    • 修复 TextRenderer 在字幕文件中不包含提示时将无效(负)索引传递给 Subtitle.getEventTime 的问题。
    • SubRip:如果 UTF-16 文件以字节顺序标记开头,则添加对其的支持。
  • 元数据
    • 解析 ID3 帧中多个以 null 分隔的值,ID3 v2.4 允许这样做。
    • 添加 MediaMetadata.mediaType 以表示内容类型或元数据描述的文件夹类型。
    • 添加 MediaMetadata.isBrowsable 作为 MediaMetadata.folderType 的替代。文件夹类型将在下一版本中弃用。
  • DASH
    • 添加图像适应集的完整解析,包括瓦片计数 (#3752)。
  • UI
    • 修复已弃用的 PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener),以确保可见性更改传递给注册的侦听器 (#229)。
    • 修复 PlayerView 中使用从右到左 (RTL) 布局时中心播放器控件的顺序 (#227)。
  • 会话
    • 添加抽象 SimpleBasePlayer 以帮助实现自定义播放器的 Player 接口。
    • 添加辅助方法以将平台会话令牌转换为 Media3 SessionToken (#171)。
    • 使用 onMediaMetadataChanged 触发平台媒体会话的更新 (#219)。
    • 将媒体会话添加为 DefaultMediaNotificationProvidergetMediaButtons() 的参数,并使用不可变列表以增加清晰度 (#216)。
    • 添加 onSetMediaItems 回调侦听器,以提供在设置到 Player 之前修改/设置 MediaItem 列表、起始索引和位置的方法 (#156)。
    • 避免对非蓝牙媒体按钮事件进行双击检测 (#233)。
    • 使 QueueTimeline 在阴暗的旧版会话状态下更健壮 (#241)。
  • 元数据
    • 解析 ID3 帧中多个以 null 分隔的值,ID3 v2.4 允许这样做。
    • 添加 MediaMetadata.mediaType 以表示内容类型或元数据描述的文件夹类型。
    • 添加 MediaMetadata.isBrowsable 作为 MediaMetadata.folderType 的替代。文件夹类型将在下一版本中弃用。
  • Cast 扩展
    • 将 Cast SDK 版本更新至 21.2.0。
  • IMA 扩展
    • 移除应用程序线程上 ImaServerSideAdInsertionMediaSource 的播放器侦听器,以避免线程问题。
    • ImaServerSideAdInsertionMediaSource.AdsLoader.Builder 添加属性 focusSkipButtonWhenAvailable,以请求在电视设备上聚焦跳过按钮并将其默认设置为 true。
    • ImaServerSideAdInsertionMediaSource.AdsLoader 添加方法 focusSkipButton(),以编程方式请求聚焦跳过按钮。
    • IMA SDK 版本更新至 3.29.0。
  • 演示应用
    • 在运行时请求下载通知的通知权限 (#10884)。

版本 1.0.0-beta03

2022 年 11 月 22 日

androidx.media3:media3-*:1.0.0-beta03 已发布。版本 1.0.0-beta03 包含这些提交。

此版本对应于 ExoPlayer 2.18.2 版本

  • 核心库
    • 添加 ExoPlayer.isTunnelingEnabled 以检查当前选定轨道是否启用了隧道传输 (#2518)。
    • 添加 WrappingMediaSource 以简化包装单个 MediaSource (#7279)。
    • 在播放因可用内存不足而卡住之前丢弃后备缓冲区。
    • 启用卸载时关闭 Tracing“doSomeWork”块。
    • 修复 PlaybackStatsListener 中快速查找导致的会话跟踪问题 (#180)。
    • 在单项播放列表中调用 seekToNextseekToPrevious 时发送缺少的 onMediaItemTransition 回调 (#10667)。
    • 添加 Player.getSurfaceSize,返回渲染视频的 surface 大小。
    • 修复在播放器释放期间移除侦听器可能导致 IllegalStateException 的错误 (#10758)。
  • 构建
    • 强制执行最低 compileSdkVersion 以避免编译错误 (#10684)。
    • 避免在包含在另一个 gradle 构建中时发布块。
  • 轨道选择
    • 如果显示器不支持,则优先选择其他轨道而不是杜比视界。(#8944)。
  • 下载
    • 修复 ProgressiveDownloader 中由于同时下载和使用同一 PriorityTaskManager 播放而导致的潜在无限循环 (#10570)。
    • 使下载通知立即显示 (#183)。
    • 将并行下载删除限制为 1,以避免创建过多线程 (#10458)。
  • 视频
    • 如果显示器不支持,则尝试使用杜比视界的替代解码器。(#9794)。
  • 音频
    • 使用 SingleThreadExecutor 释放 AudioTrack 实例,以避免同时释放多个播放器时出现内存不足错误 (#10057)。
    • 为 AudioTrack 卸载状态添加 AudioOffloadListener.onExperimentalOffloadedPlayback。(#134)。
    • AudioTrackBufferSizeProvider 设为公共接口。
    • 添加 ExoPlayer.setPreferredAudioDevice 以设置首选音频输出设备 (#135)。
    • androidx.media3.exoplayer.audio.AudioProcessor 重命名为 androidx.media3.common.audio.AudioProcessor
    • 在所有 Android 版本上,将 8 声道和 12 声道音频分别映射到 7.1 和 7.1.4 声道掩码 (#10701)。
  • 元数据
    • MetadataRenderer 现在可以配置为在元数据可用后立即渲染。使用 MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) 创建实例,以指定渲染器是提前输出元数据还是与播放器位置同步输出。
  • DRM
    • 解决 Android 13 ClearKey 实现中的一个错误,该错误返回一个非空但无效的许可证 URL。
    • 修复在播放列表中切换 DRM 方案(例如 Widevine 到 ClearKey)时 setMediaDrmSession failed: session not opened 错误。
  • 文本
    • CEA-608:确保正确处理字段 2 上的服务切换命令 (#10666)。
  • DASH
    • 从清单中解析 EventStream.presentationTimeOffset (#10460)。
  • UI
    • 使用播放器的当前覆盖作为 TrackSelectionDialogBuilder 中的预设 (#10429)。
  • 会话
    • 确保命令始终按正确顺序执行,即使某些命令需要异步解析 (#85)。
    • 添加 DefaultMediaNotificationProvider.Builder 以构建 DefaultMediaNotificationProvider 实例。构建器可以配置提供程序使用的通知 ID、通知通道 ID 和通知通道名称。此外,添加方法 DefaultMediaNotificationProvider.setSmallIcon(int) 以设置通知的小图标。(#104)。
    • 确保在 MediaController.release() 之前发送的命令不会被丢弃 (#99)。
    • SimpleBitmapLoader 可以从 file:// URI 加载位图 (#108)。
    • 修复阻止 MediaController 在一个周期内跳过广告的断言 (#122)。
    • 播放结束后,MediaSessionService 从前台停止,并显示通知以重新开始播放上次播放的媒体项目 (#112)。
    • 不要使用暂停的 pending intent 启动前台服务 (#167)。
    • 在 API 26 和 API 27 上手动隐藏与 DefaultNotificationProvider 创建的通知关联的“徽章”(徽章在 API 28+ 上自动隐藏)(#131)。
    • 修复了旧版 MediaSession 到 Media3 MediaController 的第二次 binder 连接导致 IllegalStateExceptions 的错误 (#49)。
  • RTSP
    • 添加 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
    • 添加 muxer 看门狗计时器,以检测生成输出样本是否过慢。
  • 删除已弃用符号
    • 移除 Transformer.Builder.setOutputMimeType(String)。此功能已移除。当使用默认 muxer 时,MIME 类型将始终为 MP4。

版本 1.0.0-beta02

2022 年 7 月 21 日

androidx.media3:media3-*:1.0.0-beta02 已发布。版本 1.0.0-beta02 包含这些提交。

此版本对应于 ExoPlayer 2.18.1 版本

  • 核心库
    • 确保使用 ExoPlayer.setShuffleOrder 更改 ShuffleOrder 会导致调用 Player.Listener#onTimelineChanged,其中 reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889)。
    • 对于渐进式媒体,仅在缓冲位置中包含选定的轨道 (#10361)。
    • 允许为所有 ExoPlayer 日志输出自定义记录器 (#9752)。
    • 修复 DefaultMediaSourceFactorysetDataSourceFactory 的实现,该实现在某些情况下不起作用 (#116)。
  • 提取器
    • 修复 H265 短期参考图片集的解析 (#10316)。
    • 修复从 esds 框解析比特率的问题 (#10381)。
  • DASH
    • 从清单中解析 ClearKey 许可证 URL (#10246)。
  • UI
    • 确保 TalkBack 宣布播放控件菜单中当前活动的播放速度选项 (#10298)。
  • RTSP
    • 添加 VP8 分片数据包处理 (#110)。
  • Leanback 扩展
    • 监听 LeanbackAdapter 中的 playWhenReady 更改 (10420)。
  • 投射
    • CastTimeline 中使用已传递给播放列表方法作为 Window.mediaItemMediaItem (#25, #8212)。
    • 支持 CastPlayerPlayer.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 时轨道重置过于频繁的错误,例如在侧载字幕并中途更改选定字幕时 (#10248)。
    • 停止在 API 29 和 30 上检测 5G-NSA 网络类型。这些播放将假定为 4G 网络。
    • 不允许向 MediaSource.Factory.setDrmSessionManagerProviderMediaSource.Factory.setLoadErrorHandlingPolicy 传递 null。如果需要,可以显式传递 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。这包括“取消弃用”Player.Listener.onTracksChanged 方法名,但参数类型不同。
    • DefaultTrackSelector.buildUponParametersDefaultTrackSelector.Parameters.buildUpon 的返回类型更改为 DefaultTrackSelector.Parameters.Builder,而不是已弃用的 DefaultTrackSelector.ParametersBuilder
    • 添加 DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities,默认启用。启用后,DefaultTrackSelector 将优先选择声道数不超过设备输出功能的音频轨道。在手持设备上,DefaultTrackSelector 将优先选择立体声/单声道而不是多声道音频格式,除非多声道格式可以空间化(Android 12L+)或为杜比环绕声格式。此外,在支持音频空间化的设备上,DefaultTrackSelector 将监视 Spatializer 属性的更改并触发新的轨道选择。具有 television UI 模式的设备不受这些限制,并且将优先选择声道数最高的格式。要启用此功能,必须使用 Context 构造 DefaultTrackSelector 实例。
  • 视频
    • DummySurface 重命名为 PlaceholderSurface
    • 将 AV1 支持添加到 MediaCodecVideoRenderer.getCodecMaxInputSize
  • 音频
    • 使用 LG AC3 音频解码器,该解码器宣传非标准 MIME 类型。
    • AudioAttributes.getAudioAttributesV21() 的返回类型从 android.media.AudioAttributes 更改为新的 AudioAttributesV21 包装类,以防止 API < 21 上的 ART 验证速度缓慢。
    • 当格式音频声道数未设置时(HLS 无块准备时发生),查询平台 (API 29+) 或假定音频直通的音频编码声道数 (10204)。
    • 如果解码器输出 12 声道 PCM 音频,则使用声道掩码 AudioFormat.CHANNEL_OUT_7POINT1POINT4 配置 AudioTrack (#10322)。
  • DRM
    • 确保在格式更改后立即查找时,DRM 会话始终正确更新 (10274)。
  • 文本
    • Player.getCurrentCues() 更改为返回 CueGroup 而不是 List<Cue>
    • SSA:支持 OutlineColour 样式设置,当 BorderStyle == 3 时(即 OutlineColour 设置提示的背景)(#8435)。
    • CEA-708:将数据解析为多个服务块,并忽略与当前选定服务号无关的块。
    • 移除 RawCcExtractor,该提取器仅用于处理 Google 内部字幕格式。
  • 提取器
    • 添加对 AVI 的支持 (#2092)。
    • Matroska:为 Opus 轨道解析 DiscardPadding
    • MP4:从 esds 框解析比特率。
    • Ogg:允许重复的 Opus ID 和注释头 (#10038)。
  • UI
    • 修复了在 useController=false 的情况下,PlayerView 上设置的 OnClickListener 的事件传递问题 (#9605)。还修复了所有视图配置的 OnLongClickListener 的事件传递问题。
    • 修复了将一系列触摸事件在 ACTION_UP 之前超出 PlayerView 边界错误地视为点击的问题 (#9861)。
    • 修复了 PlayerView 辅助功能问题,即点击可能切换播放而不是隐藏控件 (#8627)。
    • 重写 TrackSelectionViewTrackSelectionDialogBuilder,使其使用 Player 接口而不是 ExoPlayer。这允许视图与其他 Player 实现一起使用,并移除了 UI 模块对 ExoPlayer 模块的依赖。这是一个破坏性更改。
    • 不在 PlayerView 轨道选择器中显示强制文本轨道,如果选择了“无”,则保持选中合适的强制文本轨道 (#9432)。
  • DASH
    • 从 DTS AudioChannelConfiguration 元素中解析声道计数。这重新启用了 DTS 流的音频直通 (#10159)。
    • 不允许向 DashMediaSource.Factory.setCompositeSequenceableLoaderFactory 传递 null。如果需要,可以显式传递 DefaultCompositeSequenceableLoaderFactory 的实例。
  • HLS
    • 如果播放列表 CODECS 属性不包含音频编解码器,则回退到无块准备 (#10065)。
    • 不允许向 HlsMediaSource.Factory.setCompositeSequenceableLoaderFactoryHlsMediaSource.Factory.setPlaylistParserFactoryHlsMediaSource.Factory.setPlaylistTrackerFactory 传递 null。如果需要,可以显式传递 DefaultCompositeSequenceableLoaderFactoryDefaultHlsPlaylistParserFactory 的实例或 DefaultHlsPlaylistTracker.FACTORY 的引用。
  • 平滑流式传输
    • 不允许向 SsMediaSource.Factory.setCompositeSequenceableLoaderFactory 传递 null。如果需要,可以显式传递 DefaultCompositeSequenceableLoaderFactory 的实例。
  • RTSP
    • 为 H263 添加 RTP 阅读器 (#63)。
    • 为 MPEG4 添加 RTP 阅读器 (#35)。
    • 为 HEVC 添加 RTP 阅读器 (#36)。
    • 为 AMR 添加 RTP 阅读器。目前仅支持单声道、非交错 AMR 流。不支持复合 AMR RTP 有效负载。(#46)
    • 为 VP8 添加 RTP 阅读器 (#47)。
    • 为 WAV 添加 RTP 阅读器 (#56)。
    • 修复 RTSP 基本授权头。(#9544)。
    • 停止检查强制 SDP 字段,因为 ExoPlayer 不需要它们 (#10049)。
    • 解析 RTSP 计时时抛出受检异常 (#10165)。
    • 为 VP9 添加 RTP 阅读器 (#47)。
    • 为 OPUS 添加 RTP 阅读器 (#53)。
  • 数据源
    • DummyDataSource 重命名为 PlaceholderDataSource
    • 解决 OkHttp 中断处理。
  • 会话
    • MediaSession.Callback.onAddMediaItems 替换 MediaSession.MediaItemFiller,以允许异步解析请求。
    • MediaController 连接到旧版媒体会话时,支持 setMediaItems(s) 方法。
    • 移除 MediaController.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
    • 将广告轮询频率从每 100ms 降低到每 200ms,以符合媒体评级委员会 (MRC) 的建议。
  • FFmpeg 扩展
    • 更新 CMake 版本到 3.21.0+,以避免导致 AndroidStudio 的 gradle 同步失败的 CMake 错误 (#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.setContextContext 应传递给 Transformer.Builder 构造函数。

版本 1.0.0-alpha03

2022 年 3 月 14 日

androidx.media3:media3-*:1.0.0-alpha03 已发布。版本 1.0.0-alpha03 包含这些提交。

这对应于 ExoPlayer 2.17.1 版本

  • 音频
    • 修复 HLS 中 Dolby Atmos (E-AC3-JOC) 的音频能力检查错误。
  • 提取器
    • FMP4:修复了对于包含 v0 和 v1 emsg atom 的流,emsg 样本元数据可能输出顺序错误的问​​题 (#9996)。
  • 文本
    • 修复 SingleSampleMediaSource.Factory.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 构造函数中设置 idTrackGroup 始终可以区分。这修复了在后台应用程序并带有活动轨道覆盖后恢复播放时的崩溃问题 (#9718)。
    • 修改 AdaptiveTrackSelection 中的逻辑,即使播放非常接近直播边缘,在网络带宽充足的情况下也允许提高质量 (#9784)。
  • 视频
    • 修复杜比视界的解码器回退逻辑,以便在需要时使用兼容的 H264/H265 解码器。
  • 音频
    • 修复杜比全景声(E-AC3-JOC)的解码器回退逻辑,以便在需要时使用兼容的 E-AC3 解码器。
    • 更改 AudioCapabilities API 以要求显式传递 AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES 而不是 null
    • 通过向 DefaultAudioSink 注入 AudioTrackBufferSizeProvider,允许自定义 AudioTrack 缓冲区大小计算。(#8891)。
    • 如果请求的缓冲区大小 > 1MB,则重试 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)。
  • UI
    • 修复了使用某些主题时 StyledPlayerView 快退和快进按钮中数字的颜色问题 (#9765)。
    • 正确翻译播放速度字符串 (#9811)。
  • DASH
    • 将已解析的基本和补充属性添加到 Representation (#9579)。
    • 支持 forced-subtitle 轨道角色 (#9727)。
    • 停止将 main 轨道角色解释为 C.SELECTION_FLAG_DEFAULT
    • 修复未声明 DVB 命名空间的清单的基本 URL 排除逻辑 (#9856)。
    • 支持相对 MPD.Location URL (#9939)。
  • HLS
    • 正确填充仅音频 HLS 流的 Format.label (#9608)。
    • 默认使用无块准备以提高启动时间。如果您的渲染包含混音封闭字幕轨道且主播放列表中未声明,您应该将它们添加到主播放列表中以供播放,或者使用 HlsMediaSource.Factory.setAllowChunklessPreparation(false) 关闭无块准备。
    • 支持 HLS 中的关键帧精确查找 (#2882)。
  • RTSP
    • 提供客户端 API 来覆盖用于任何服务器连接的 SocketFactory (#9606)。
    • 如果同时存在 DIGEST 和 BASIC 认证方法,则优先选择 DIGEST 认证方法 (#9800)。
    • 处理 RTSP 计时不可用的情况 (#9775)。
    • 忽略无效的 RTP-Info 头值 (#9619)。
  • Transformer
    • 将所需最低 API 版本提高到 21。
    • TransformationException 现在用于描述转换过程中发生的错误。
    • 添加 TransformationRequest 用于指定转换选项。
    • 允许多个监听器注册。
    • 修复当编解码器输出被部分读取时转换器卡住的问题。
    • 修复当释放合成器时抛出异常导致 Transformer.getProgress 中潜在的 NPE 问题。
    • 添加一个用于应用转换的演示应用。
  • MediaSession 扩展
    • 默认情况下,MediaSessionConnector 现在会在停止时清除播放列表。如果应用希望保留播放列表,可以在连接器上调用 setClearMediaItemsOnStop(false)
  • Cast 扩展
    • 修复了阻止 CastPlayer 正确调用 onIsPlayingChanged 的错误 (#9792)。
    • 支持使用 DefaultMediaItemConverter 处理包含封面图在内的音频元数据 (#9663)。
  • FFmpeg 扩展
    • 使 build_ffmpeg.sh 依赖 LLVM 的 bin utils 而非 GNU 的 (#9933)。
  • Android 12 兼容性
    • 将 Cast 扩展升级至依赖 com.google.android.gms:play-services-cast-framework:20.1.0。早期版本的 play-services-cast-framework 与目标 Android 12 的应用不兼容,在创建 PendingIntent 时会因 IllegalArgumentException 而崩溃 (#9528)。
  • 删除已弃用符号
    • 移除 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 接口。
  • 用于构建媒体播放用户界面的 UI 组件。
  • 封装其他库功能的模块,可与 ExoPlayer 配合使用,例如通过 IMA SDK 插入广告。

有关更多信息,请参阅 Media3 GitHub 项目

ExoPlayer 之前托管在单独的 ExoPlayer GitHub 项目中。在 Media3 中,其包名为 androidx.media3.exoplayer。我们计划在一段时间内继续维护和发布 ExoPlayer GitHub 项目,以便为应用提供迁移到 Media3 的时间。Media3 提供了所有 ExoPlayer 模块的替代品,除了旧版 media2 和 mediasession 扩展,它们已被新的 media3-session 模块取代。这提供了播放器和媒体会话之间的直接集成,无需使用适配器/连接器类。