Media3

适用于媒体用例的支持库。
最近更新时间 稳定版 候选版 Beta 版 Alpha 版
2024 年 2 月 22 日 1.3.0 - - -

声明依赖项

如需添加 Media3 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库

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

Groovy

dependencies {
    def media3_version = "1.3.0"

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

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

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

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

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

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

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

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

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

    // 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"
}

Kotlin

dependencies {
    val media3_version = "1.3.0"

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

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

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

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

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

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

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

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

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

    // 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")
}

如需详细了解依赖项,请参阅添加 build 依赖项

反馈

您的反馈将帮助我们改进 Jetpack。您可以使用 Media3 问题跟踪器来查找问题的答案、已知问题和功能请求,以及提交新问题。

版本 1.3.0

版本 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 中至少有一个非 null (#964) 时,MediaMetadata.Builder.populate(MediaMetadata)中要填充这两者。
  • ExoPlayer:
    • 添加了 PreloadMediaSourcePreloadMediaPeriod,以允许应用在播放之前在特定开始位置预加载内容媒体来源。PreloadMediaSource 负责准备内容媒体来源以接收 Timeline,准备时间段并将其缓存在给定的起始位置,以及为时间段选择轨道并加载媒体数据。应用通过实现 PreloadMediaSource.PreloadControl 来控制预加载进度,并将预加载的来源设置为播放器进行播放。
    • 添加了允许应用设置 ImageRenderer.ImageOutputExoPlayer.setImageOutput
    • DefaultRenderersFactory 现在默认向播放器提供 ImageRenderer,其中包含 null ImageOutputImageDecoder.Factory.DEFAULT
    • 跳过无声时发出 Player.Listener.onPositionDiscontinuity 事件 (#765)。
    • 添加了对在提取过程中解析字幕的实验性支持。您可以使用 MediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 来启用此功能。
    • 通过 PreloadMediaSource 支持自适应媒体来源。
    • 使用 HttpEngine API 实现 HttpEngineDataSource(一种 HttpDataSource)。
    • 防止创建 CompositeSequenceableLoader 的子类。此组件以前是可扩展的,但从未在库中进行子类化。如需进行自定义,您可以使用修饰器模式封装实例并实现自定义 CompositeSequenceableLoaderFactory
    • 修复了重复相同的时间会导致此项的元数据被清除的问题 (#1007)。
    • BundledChunkExtractor.FactoryDefaultHlsExtractorFactory 上的 experimentalSetSubtitleParserFactory 方法重命名为 setSubtitleParserFactory,并禁止传递 null。请使用新的 experimentalParseSubtitlesDuringExtraction(boolean) 方法控制解析行为。
    • 添加了对自定义提取过程中使用的 SubtitleParser.Factory 的支持。这可以通过 MediaSource.Factory.setSubtitleParserFactory() 来实现。
    • 向通过 MergingMediaSource 生成的所有 Format.id 字段添加源前缀。这有助于确定哪个来源生成了 Format (#883)。
    • 通过将正则表达式修改为仅检查连字符 (#1028),修复了用于验证自定义通用媒体客户端数据 (CMCD) 键名的正则表达式。
    • 停止对 CMCD 查询参数进行双重编码 (#1075)。
  • 转换器:
    • 添加了对扁平化 H.265/HEVC SEF 慢动作视频的支持。
    • 提高转路速度,尤其是对于“删除视频”修改。
    • 添加了 API,以确保输出文件从视频帧开始。这可以使剪辑操作的输出与在呈现时间戳之前一直显示第一视频帧的播放器实现更加兼容 (#829)。
    • 添加了对优化单资源 MP4 剪辑操作的支持。
    • 添加了相关支持,以确保视频帧在输出文件中具有第一个时间戳。修复了基于 iOS 的播放器中以黑帧开头的输出文件 (#829)。
  • 轨道选择:
    • 添加了 DefaultTrackSelector.selectImageTrack 以启用图片轨道选择。
    • 添加了 TrackSelectionParameters.isPrioritizeImageOverVideoEnabled,以确定在图片轨道和视频轨道均可用时是否选择图片轨道。默认值为 false,表示会优先选择视频轨道。
  • 提取器:
    • 为 MP4 提取器添加了额外的 AV1C 解析,以检索 ColorInfo.colorSpaceColorInfo.colorTransferColorInfo.colorRange 值 (#692)。
    • MP3:使用恒定比特率 (CBR) 搜寻带有 Info 标头(等同于 Xing 标头的 CBR)的文件。之前我们使用 Info 标头中的查找表,但与忽略它并假定文件为 CBR 相比,这样做会导致跳转的精确度降低。
    • MPEG2-TS:添加了 DTS、DTS-LBR 和 DTS:X Profile2 支持 (#275)。
    • 从 TS 描述符中提取音频类型并将它们映射到角色标志,以便用户做出更明智的音轨选择 (#973)。
  • 音频:
    • 通过平滑的音量梯度改进静音跳过算法;保留了最少量的无声,静音时长更自然 (#7423)。
    • 更确定地报告跳过的静音次数 (#1035)。
  • 视频:
    • 更改接受 VideoFrameProcessor.Factory 参数的 MediaCodecVideoRenderer 构造函数,并将其替换为接受 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 广告的问题。
  • 会话:
    • 停用了针对 TV 应用的双击检测 (#962)。
    • 修复了仅包含非 null extra 的 MediaItem.RequestMetadata 不会在媒体控制器和会话之间传输的问题。
    • MediaLibrarySession.Builder 添加了仅接受 Context 而非 MediaLibraryService 的构造函数。
  • HLS 扩展:
    • HlsMediaPeriod 降低到了软件包私有的可见性。不应从 HLS 软件包外部直接依赖于此类型。
    • 解析可更高效地寻找分段的开头 (#1031)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等):
    • MIDI 解码器:忽略 SysEx 事件消息 (#710)。
  • 测试实用程序:
    • 不要在 TestPlayerRunHelper.playUntilPosition 中暂停播放。测试会将播放保持在播放状态,但会暂停进度,直到测试能够添加断言和进一步操作。
  • 演示版应用:
    • 添加一个简短演示模块,以演示如何将 PreloadMediaSource 用于短视频内容用例。

版本 1.3.0-rc01

2024 年 2 月 22 日

使用 1.3.0 稳定版

版本 1.3.0-beta01

2024 年 2 月 7 日

使用 1.3.0 稳定版

版本 1.3.0-alpha01

2024 年 1 月 15 日

使用 1.3.0 稳定版

版本 1.2.0

版本 1.2.1

2024 年 1 月 9 日

  • ExoPlayer:
    • 修复了 LiveConfiguration.min/maxOffset 范围之外的手动跳转不断将偏移量调整回 min/maxOffset 的问题。
    • 修复了 3、5、6、7 和 8 声道 OPUS 和 VORBIS 声道布局错误的问题 (#8396)。
    • 修复了以下问题:在直播中将跳转至 0 后,曲目选择会错误地使直播从默认位置开始 (#9347)。
    • 修复了 CmcdData.Factory 的新实例从区块来源接收 bufferedDurationUs 的负值,进而导致 IllegalArgumentException 的问题 (#888)。
  • 转换器:
    • 解决了编码器由于设置高运行速率而在配置时抛出的问题。
  • 提取器:
    • 将 JPEG 动态照片中的次要(无法播放)HEVC 轨道标记为 ROLE_FLAG_ALTERNATE,以防止系统自动选择这些轨道进行播放,因为它们的分辨率较高。
    • 修复了 TS H264 流的错误关键帧检测 (#864)。
    • 修复了超过 47721 秒的 TS 流的持续时间估算值 (#855)。
  • 音频:
    • 修复了多次调用 SilenceSkippingAudioProcessor 时对 EOS 的处理 (#712)。
  • 视频:
    • 针对 Galaxy Tab S7 FE、Chromecast(支持 Google TV)和联想 M10 FHD Plus 上出现的设备问题添加了解决方法,该问题会导致 60fps 的 AVC 串流被标记为不受支持 (#693)。
  • 元数据:
    • 修复了仅从具有大写键的 Vorbis 注释填充 MediaMetadata 的 bug (#876)。
    • 在解析非常大的 ID3 帧时捕获 OutOfMemoryError,这意味着可以在没有标记信息的情况下继续播放,而不是完全播放失败。
  • DRM:
    • 将虚假的 ClearKey https://default.url 许可网址的解决方法扩展到了 API 33 及更高级别(以前,该解决方法仅确切适用于 API 33)(#837)。
    • 修复了在没有 Surface 连接到播放器时从加密切换为清除内容的 ERROR_DRM_SESSION_NOT_OPENED。该错误是由于错误使用安全解码器来播放清晰内容所致。
  • 会话:
    • MediaMetadataCompat 中的自定义键和值放入 MediaMetadata.extras,将 MediaMetadata.extras 放入 MediaMetadataCompat#756#802)。
    • 修复了旧版控制器的 notifyChildrenChanged 广播问题 (#644)。
    • 修复了以下 bug:为通知的已停用 setWhen 计时器设置负数时间会导致在某些设备上发生崩溃 (#903)。
    • 修复了当请求第一次通知更新时媒体通知控制器未完成连接时出现的 IllegalStateException (#917)。
  • 界面:
    • 修复了与 BottomSheetDialogFragment 中的 Material Design 搭配使用时前进和快退按钮不可见的问题 (#511)。
    • 修复了 PlayerControlView 的快进按钮中的数字未对齐的问题 (#547)。
  • DASH 扩展:
    • 在 DASH 清单中,将“f800”解析为杜比实验室的声道数 5 (#688)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等):
    • MIDI:修复了向前跳转会跳过“节目更改”事件的问题 (#704)。
    • 迁移到 FFmpeg 6.0 并将受支持的 NDK 更新为 r26b#707#867)。
  • Cast 扩展程序:
    • Timeline 的创建进行了清理,以避免在投放设备上加载媒体时导致应用崩溃 (#708)。

版本 1.2.0

2023 年 11 月 15 日

  • 通用库:
    • @Nullable Throwable 参数添加到 Log.Logger 接口中的方法。这些方法的 message 参数不再包含传递给 Log.{d,i,w,e}() 方法的 Throwable 的任何相关信息,因此实现需要根据需要手动附加此信息(可能使用 Logger.appendThrowableString(String, Throwable))。
    • 修复了以下 Kotlin 兼容性问题:无法将可为 null 的泛型类型参数和可为 null 的数组元素类型检测为可为 null。示例包括 TrackSelectorResultSimpleDecoder 方法参数 (#6792)。
    • 更改了 Util.shouldShowPlayButton 中的默认界面和通知行为,以便在播放被暂时抑制(例如,由于暂时性音频焦点丢失)时显示“播放”按钮。可以使用 PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) 来维持旧版行为 (#11213)。
    • androidx.annotation:annotation-experimental 升级到 1.3.1 以修复 https://issuetracker.google.com/251172715。
    • ExoPlayer.setAudioAttributes 移到了 Player 接口。
  • ExoPlayer:
    • 修复了因未正确识别仅解码样本而导致的 AC4 流中的跳转问题 (#11000)。
    • 通过 ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput 启用此功能后,系统会在不合适的音频输出设备(例如 Wear OS 设备的内置扬声器)上禁止播放。如果在没有合适的音频输出时尝试播放,或者在播放期间所有合适的输出均断开连接,则播放禁止原因将更新为 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT。连接合适的输出后,系统将移除抑制原因。
    • 添加了 MediaSource.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.continueLoading(LoadingInfo loadingInfo)SequenceableLoader 接口中的 SequenceableLoader.continueLoading(long) 方法。除了现有的 playbackPositionUs 之外,LoadingInfo 还包含其他参数,例如 playbackSpeedlastRebufferRealtimeMs
    • 增强了 ChunkSource 接口中的 ChunkSource.getNextChunk(long, long, List, ChunkHolder) 方法以指向 ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
    • 向通用媒体客户端数据 (CMCD) 日志记录添加了其他字段:缓冲区耗尽 (bs)、截止时间 (dl)、播放速率 (pr) 和启动 (su) (#8699)。
    • ColorInfo 添加了亮度和色度位深 (#491)。
    • 为通用媒体客户端数据 (CMCD) 日志记录添加了其他字段:下一个对象请求 (nor) 和下一个范围请求 (nrr) (#8699)。
    • 添加了使用查询参数传输通用媒体客户端数据 (CMCD) 数据的功能 (#553)。
    • 修复了 ExperimentalBandwidthMeter 中的 ConcurrentModificationException (#612)。
    • CompositeMediaSource.getMediaTimeForChildMediaTime 添加了 MediaPeriodId 参数。
    • 支持 ConcatenatingMediaSource2 中的 ClippingMediaSource(以及具有周期/窗口时间偏移的其他源)。#11226
    • 更改 BaseRenderer.onStreamChanged() 以同时接收 MediaPeriodId 参数。
  • 转换器:
    • 解析了图像输入的 EXIF 旋转数据。
    • 移除了 TransformationRequest.HdrMode 注解类型及其关联的常量。请改用 Composition.HdrMode 及其关联的常量。
    • 简化 OverlaySettings 以解决旋转问题。
    • SampleConsumer.queueInputBitmapframeRatedurationUs 参数更改为了 TimestampIterator
  • 轨道选择:
    • 添加了 DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness,以明确允许或禁止非无缝自适应。默认值会保持其当前行为 true
  • 提取器:
    • MPEG-TS:通过将流的最后一个访问单元传递给样本队列 (#7909),确保最后一帧已呈现。
    • 修复了确定 rotationDegrees 时的拼写错误。将 projectionPosePitch 更改为了 projectionPoseRoll (#461)。
    • 取消了可以使用 instanceof 直接检查 Extractor 实例的假设。如果您希望运行时访问 Extractor 的实现详情,必须先调用 Extractor.getUnderlyingInstance
    • 添加了 BmpExtractor
    • 添加了 WebpExtractor
    • 添加了 HeifExtractor
    • Mp4Extractor 添加了 QuickTime Classic 支持。
  • 音频:
    • 在 MP4 和 Matroska 中添加了对 24/32 位大端 PCM 的支持,并针对 MP4 中的 lpcm 解析 PCM 编码。
    • 添加了对从 MP4 中提取 Vorbis 音频的支持。
    • 添加了 AudioSink.getFormatOffloadSupport(Format),用于检索接收器可通过 DefaultAudioOffloadSupportProvider 为格式提供的分流支持级别。它会返回包含 isFormatSupportedisGaplessSupportedisSpeedChangeSupported 的新 AudioOffloadSupport
    • 添加 AudioSink.setOffloadMode(),用于配置音频接收器上的分流配置。默认值为 AudioSink.OFFLOAD_MODE_DISABLED
    • 分流可通过 TrackSelectionParameters 中的 setAudioOffloadPreference 启用。如果设置的偏好设置为启用,设备支持该格式的分流,并且轨道选择是单个音轨,则将启用音频分流。
    • 如果 audioOffloadModePreference 设置为 AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED,则 DefaultTrackSelector 将仅选择音轨,并且仅当分流中支持该音轨的格式时,才会选择音轨。如果分流不支持任何音轨,则系统不会选择任何音轨。
    • 在 API 级别为 33 之前,由于音轨过渡后的播放位置问题,停用了对分流的无间断支持。
    • DefaultRenderersFactory.buildAudioSink 方法签名中移除了参数 enableOffload
    • 移除 DefaultAudioSink.Builder.setOffloadMode 方法。
    • 移除了 intdef 值 DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
    • 添加了对分流播放期间 Opus 无间断元数据的支持。
    • 如果首次写入失败,可以通过停用分流来允许渲染程序恢复 (#627)。
    • 对于纯音频分流播放,默认启用分流调度。
    • 删除 ExoPlayer.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
    • onExperimentalSleepingForOffloadChanged 已重命名为 onSleepingForOffloadChangedonExperimentalOffloadedPlayback 已重命名为 onOffloadedPlayback
    • 将与音频分流模式相关的 TrackSelectionParameters 接口和定义移至内部 AudioOffloadPreferences 类。
    • AnalyticsListenerAudioRendererEventListenerAudioSink.Listener 添加了 onAudioTrackInitializedonAudioTrackReleased 回调。
    • 修复了 DTS Express 音频缓冲区下溢问题 (#650)。
    • 修复了对 E-AC3-JOC 的功能检查抛出 IllegalArgumentException 的 bug (#677)。
  • 视频:
    • 允许 MediaCodecVideoRenderer 使用自定义 VideoFrameProcessor.Factory
    • 修复了音频流以负时间戳开头时无法渲染第一帧的 bug (#291)。
  • 文本:
    • 移除了 ExoplayerCuesDecoder。包含 sampleMimeType = application/x-media3-cues 的文本轨道现在由 TextRenderer 直接处理,无需 SubtitleDecoder 实例。
  • 元数据:
    • 将不再针对“仅解码”样本调用 MetadataDecoder.decode,因为实现无论如何都必须返回 null。
  • 效果:
    • 添加了 VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>),按时间戳将位图输入加入队列。
    • VideoFrameProcessor.registerInputStream() 更改为非阻塞。 应用必须实现 VideoFrameProcessor.Listener#onInputStreamRegistered()
    • VideoFrameProcessor.queueInputBitmapframeRatedurationUs 参数更改为了 TimestampIterator
  • IMA 扩展程序:
    • 修复了以下 bug:不是播放列表中的第一项的多时段 DASH 直播可能会抛出异常 (#571)。
    • 在调用 AdsLoader.destroy() 之前释放 StreamManager
    • 将 IMA SDK 版本提升至 3.31.0。
  • 会话:
    • DefaultMediaNotificationProvider 中将通知前台服务行为设置为 FOREGROUND_SERVICE_IMMEDIATE (#167)。
    • 请仅使用 API 31 以上的 android.media.session.MediaSession.setMediaButtonBroadcastReceiver(),以避免三星设备上已废弃的 API 出现问题 (#167)。
    • 使用媒体通知控制器作为代理,设置用于填充通知和平台会话的可用命令和自定义布局。
    • 转换 Media3 中 MediaSessionService.onStartCommand() 收到的媒体按钮事件,而不是将它们路由到平台会话并传回 Media3。因此,来电者控制器始终是媒体通知控制器,并且应用可以在所有支持的 API 级别上以同样的方式轻松识别来自通知的来电。
    • 修复了在连接到旧版 MediaSessionCompatMediaController.getCurrentPosition() 不前进的 bug。
    • 为方便起见,添加了 MediaLibrarySession.getSubscribedControllers(mediaId)
    • 替换 MediaLibrarySession.Callback.onSubscribe() 以断言控制器订阅的父 ID 的可用性。如果成功,系统会接受订阅,并立即调用 notifyChildrenChanged() 以通知浏览器 (#561)。
    • 添加了适用于 Automotive OS 的会话演示模块,并为 Android Auto 启用会话演示功能。
    • COMMAND_GET_TIMELINE 不适用于媒体通知控制器时,请勿设置框架会话的队列。将 Android Auto 作为客户端控制器从框架会话读取数据时,Android Auto 界面中的 queue 按钮不会显示 (#339)。
    • 默认情况下使用 DataSourceBitmapLoader 而不是 SimpleBitmapLoader#271#327)。
    • 添加了 MediaSession.Callback.onMediaButtonEvent(Intent),以允许应用替换默认的媒体按钮事件处理。
  • 界面:
    • 为 Wear OS 设备添加了 Player.Listener 实现,以通过启动系统对话框来允许用户连接合适的音频输出(例如蓝牙耳机),处理因 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT 而导致的播放抑制。如果在可配置的超时时限(默认为 5 分钟)内连接了合适的设备,监听器将自动恢复播放。
  • 下载内容:
    • DownloadService 声明“数据同步”前台服务类型,以与 Android 14 兼容。使用此服务时,应用还需要在清单中将 dataSync 添加为 foregroundServiceType,并添加 FOREGROUND_SERVICE_DATA_SYNC 权限 (#11239)。
  • HLS 扩展:
    • 使用从上次加载开始时间(而不是上次加载完成时间)计算的间隔时间刷新 HLS 实时播放列表 (#663)。
  • DASH 扩展:
    • 允许在细分模板网址中使用多个相同的 DASH 标识符。
    • 添加了对在提取过程中解析字幕的实验性支持。这样可以更好地支持合并重叠字幕,包括解决翻译字幕片段之间的闪烁问题。您可以使用 DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 来启用此功能 (#288)。
  • RTSP 扩展:
    • 修复了回退到 TCP 或在某些情况下可能导致播放挂起的竞态条件问题。IndexOutOfBoundsException
    • 返回 RtspMediaPeriod 的加载状态时,在 RTSP 设置中检查状态 (#577)。
    • 忽略选项响应公共标头中的自定义 Rtsp 请求方法 (#613)。
    • 在发送 keep-alive RTSP 选项请求的时间间隔中使用 RTSP 设置响应超时值 (#662)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等):
    • 发布了 MIDI 解码器模块,该模块支持使用 Jsyn 库播放标准 MIDI 文件,以合成音频。
    • 添加了 DecoderOutputBuffer.shouldBeSkipped,可直接标记不需要呈现的输出缓冲区。此方法优于即将废弃的 C.BUFFER_FLAG_DECODE_ONLY
    • 添加了 Decoder.setOutputStartTimeUsSimpleDecoder.isAtLeastOutputStartTimeUs,以允许解码器在开始时间之前丢弃纯解码样本。这应优先于即将弃用的 Buffer.isDecodeOnly
    • 修复了将 MIDI 解码器工件发布到 Maven 制品库的 bug。该工件已重命名为 media3-exoplayer-midi (#734)。
  • Leanback 扩展:
    • 修复了停用 Surface 可能会导致 Leanback 代码中出现 ArithmeticException 的 bug (#617)。
  • 测试实用程序:
    • 使 TestExoPlayerBuilderFakeClock 与 Espresso 界面测试和 Compose 界面测试兼容。这修复了在 Espresso 或 Compose 视图交互期间播放不确定性地推进的 bug。
  • 移除了已废弃的符号:
    • 移除了 TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)。 请改为使用 Composition.Builder.setHdrMode(int) 并将 Composition 传递给 Transformer.start(Composition, String)
    • 移除了已废弃的 DownloadNotificationHelper.buildProgressNotification 方法,请改用接受 notMetRequirements 参数的非废弃方法。

版本 1.2.0-rc01

2023 年 11 月 1 日

使用 1.2.0 稳定版

版本 1.2.0-beta01

2023 年 10 月 19 日

使用 1.2.0 稳定版

版本 1.2.0-alpha02

2023 年 9 月 29 日

使用 1.2.0 稳定版

版本 1.2.0-alpha01

2023 年 8 月 17 日

使用 1.2.0 稳定版

版本 1.1.0

版本 1.1.1

2023 年 8 月 16 日

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

版本 1.1.0

2023 年 7 月 5 日

  • 通用库:
    • 针对不合适的音频路由添加了抑制原因,并在就绪时播放,更改了抑制时间过长的原因。 (#15)。
    • 向播放器添加命令:
      • 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.Builder.setMediaSourceFactory(MediaSource.Factory)。 请改用 ExoPlayerAssetLoader.Factory(MediaSource.Factory)Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
    • 移除了 Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • 修复了以下 bug:在输入帧等待处理时,系统发出了视频流结束信号,转换可能会卡住(导致多路复用器超时)。
    • 通过 MediaCodecList(而不是使用 findDecoder/EncoderForFormat 实用程序)查询编解码器,以扩展支持。
    • 移除了 DefaultEncoderFactory 中的 B 帧配置,因为它不适用于某些设备。
  • 轨道选择:
    • 添加了 DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange(默认处于停用状态)。启用后,DefaultTrackSelector 会在渲染程序功能发生更改时触发新的轨道选择。
  • 提取器:
    • Ogg:修复了在时长较长的文件中跳转时出现的 bug (#391)。
    • FMP4:修复了 TimestampAdjuster 使用 emsg Atom 的元数据采样时间初始化错误的时间戳偏移量的问题 (#356)。
  • 音频:
    • 修复了在启用隧道技术且 AudioProcessors 处于启用状态(例如,进行无间断剪辑)时某些播放失败的 bug (#10847)。
    • 在直接播放(分流)中,将 Opus 帧封装在 Ogg 数据包中。
    • 通过分流调度来推断睡眠期间的当前位置。
    • 添加了 Renderer.release()AudioSink.release(),用于在玩家生命周期结束时释放资源。
    • DefaultAudioSink 中监听音频功能的变化。在 DefaultAudioSink 的构造函数中添加必需的参数 context,供 DefaultAudioSink 注册为 AudioCapabilitiesReceiver 的监听器,并在收到 capability 更改通知时更新其 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 不支持视频或者尚未确定受支持视频轨道的大小时,MediaCodecVideoRenderer 的 ExoPlayer 视频大小的宽度和高度均为 0。
  • DRM:
    • 降低 DefaultDrmSession 上不应从 DRM 软件包外部调用的几种仅限内部使用的方法的可见性:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • 多路复用器:
    • 添加可用于创建 MP4 容器文件的新多路复用器库。
  • IMA 扩展程序:
    • 为 DAI 启用多时段直播 DASH 视频流。请注意,当前的实现尚不支持在直播中使用跳转功能 (#10912)。
    • 修复了由于计算的内容在连续时间轴中的位置略有不同而导致在直播中插入新广告组的 bug。
  • 会话:
    • 添加了辅助方法 MediaSession.getControllerForCurrentRequest,以获取有关当前调用 Player 方法的控制器的信息。
    • 添加了 androidx.media3.session.MediaButtonReceiver,使应用能够利用蓝牙耳机等发送的媒体按钮事件实现继续播放播放 (#167)。
    • MediaSession.Callback.onAddMediaItems 添加了默认实现,以允许将请求的 MediaItems 传递给 Player(如果其具有 LocalConfiguration(例如 URI)(#282)。
    • 对于 Android 12 及更低版本,默认在紧凑型媒体通知视图中添加“跳转至上一个”和“跳转到下一个”命令按钮 (#410)。
    • MediaSession.Callback.onAddMediaItems 添加了默认实现,以允许将请求的 MediaItems 传递给 Player(如果其具有 LocalConfiguration(例如 URI)(#282)。
    • 对于 Android 12 及更低版本,默认在紧凑型媒体通知视图中添加“跳转至上一个”和“跳转到下一个”命令按钮 (#410)。
  • 界面:
    • 添加了 shouldShowPlayButtonhandlePlayPauseButtonAction 实用程序方法,以便编写带播放/暂停按钮的自定义界面元素。
  • RTSP 扩展:
    • 对于 MPEG4-LATM,如果描述响应 SDP 消息中不存在,请使用默认的配置文件级别 ID 值 (#302)。
    • 如果 DESCRIBE 响应标头中存在 RTSP 会话的相对路径解析,请使用基本 URI (#11160)。
  • DASH 扩展:
    • 从多时间段 DASH 流的 MediaLoadData.startTimeMsMediaLoadData.endTimeMs 中移除了媒体时间偏移。
    • 修复了以下 bug:重新准备多时段的实时 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 参数的选项的未废弃构造函数。
    • 移除了已废弃的字符集字符串常量(ASCII_NAMEUTF8_NAMEISO88591_NAMEUTF16_NAMEUTF16LE_NAME),请改用 kotlin.text 软件包中的 Kotlin 字符集,改为 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,改为将 onPositionDiscontinuityDISCONTINUITY_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) 的支持。
  • 会话:
    • 修复了以下问题:在连接到更新其操作的旧版 MediaSessionCompat 时,MediaController 不更新其可用命令。
    • 修复了在 API 30 上使用 params.isRecent == true 从系统界面调用 Callback.onGetLibraryRoot 时,导致 MediaLibraryService 无法返回 null 的 bug (#355)。
    • 修复了 MediaSessionServiceMediaLibraryService 的内存泄漏问题 (#346)。
    • 修复了以下 bug:在 MediaSession 中组合使用 Timeline 和位置更新可能会导致 MediaController 抛出 IllegalStateException

版本 1.0.1

2023 年 4 月 18 日

发布了 androidx.media3:media3-*:1.0.1版本 1.0.1 中包含这些提交内容

此版本与 ExoPlayer 2.18.6 版本相对应。

  • 核心库:
    • 在跳转至默认位置时重置目标直播替换 (#11051)。
    • 修复了媒体中的空样本流可能会导致播放卡住的 bug。
  • 会话:
    • 修复了以下 bug:旧版 MediaSessionCompat 发布多个相同的队列项会导致 MediaController 中出现异常 (#290)。
    • 添加了缺失的 MediaSession.broadcastCustomCommand 到旧版 MediaControllerCompat.Callback.onSessionEvent 的转发 (#293)。
    • 修复了调用 MediaSession.setPlayer 不会更新可用命令的 bug。
    • 修复了以下问题:如果从 MediaController 发送的 TrackSelectionOverride 实例使用 Format.metadata 引用组,则这些实例会被忽略 (#296)。
    • 修复了 Player.COMMAND_GET_CURRENT_MEDIA_ITEM 需要通过旧版 MediaSessionCompat 访问元数据时可用的问题。
    • 修复了如下问题:MediaSession位于后台线程中的实例在 MediaSessionService (#318) 中使用时会导致崩溃。
    • 修复了库在没有应用预期的情况下声明媒体按钮接收器的问题 (#314)。
  • DASH:
    • 修复了对空片段时间轴的处理方式 (#11014)。
  • RTSP:
    • 如果使用 UDP 的 RTSP 设置失败并显示 RTSP 错误 461 不受支持的传输 (#11069),则使用 TCP 重试。

版本 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)。
  • 音频:
    • 修复了 Samsung 设备上的无间断 MP3 播放损坏的问题 (#8594)。
    • 修复了在停用音频后立即设置的播放速度可能会被先前的速度更改替换的 bug (#10882)。
  • 视频:
    • 将 HEVC HDR10 格式映射到 HEVCProfileMain10HDR10,而不是 HEVCProfileMain10
    • 针对 Chromecast(支持 Google TV)和联想 M10 FHD Plus 上出现的设备问题添加了解决方法,该问题会导致 60fps 的 AVC 流被标记为“不受支持”(#10898)。
    • 修复了以远高于屏幕刷新率的帧速率播放媒体时的帧释放性能问题。
  • Cast:
    • 修复了在媒体项之间转换时出现的瞬态 STATE_IDLE (#245)。
  • RTSP:
    • 捕获解析无效的 RTSP 描述响应消息时抛出的 IllegalArgumentException (#10971)。
  • 会话:
    • 修复了通知播放/暂停按钮不随播放器状态更新的错误 (#192)。
  • IMA 扩展程序:
    • 修复了由于未收到第一个(在没有广告的情况下,是唯一的)LOADED 事件而导致的 DAI 串流无法启动的 bug。

版本 1.0.0-rc01

2023 年 2 月 16 日

发布了 androidx.media3:media3-*:1.0.0-rc01版本 1.0.0-rc01 中包含这些提交内容

此版本与 ExoPlayer 2.18.3 版本相对应。

  • 核心库:
    • 调整了渲染程序的解码器排序逻辑,以保持 MediaCodecSelector 的偏好设置,即使解码器报告它可能无法高效地播放媒体也是如此。例如,对于默认选择器,仅提供功能支持的硬件解码器会优先于完全支持该格式的软件解码器 (#10604)。
    • 添加了 ExoPlayer.Builder.setPlaybackLooper,用于为新的 ExoPlayer 实例设置现有的播放线程。
    • 允许清除内容下载管理器帮助程序 (#10776)。
    • BasePlayer.seekTo 添加了参数,以指明用于跳转的命令。
    • 在 API 21 及以上级别加载可绘制对象时使用主题 (#220)。
    • 添加了允许将多个媒体项合并到单个窗口中的 ConcatenatingMediaSource2 (#247)。
  • 提取器:
    • 如果示例表 (stbl) 在解析 trak Atom 时缺少必需的示例说明 (stsd),则抛出 ParserException,而非 NullPointerException
    • 在 fMP4 中直接跳转到同步帧时会正确跳过示例 (#10941)。
  • 音频:
    • 使用压缩音频格式比特率来计算直接播放(直通)中 AudioTrack 的最小缓冲区大小。
  • 文本:
    • 修复了当字幕文件不包含任何提示时,向 Subtitle.getEventTime 传递无效(负数)索引的 TextRenderer
    • SubRip:如果 UTF-16 文件以字节顺序标记开头,请添加对此类文件的支持。
  • 元数据:
    • 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
    • 添加了 MediaMetadata.mediaType,以指示内容类型或元数据描述的文件夹类型。
    • 添加了 MediaMetadata.isBrowsable,以替代 MediaMetadata.folderType。下一个版本中将废弃文件夹类型。
  • DASH:
    • 为图片适配集添加了完整的解析,包括图块计数 (#3752)。
  • 界面:
    • 修复了已废弃的 PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener),以确保将可见性更改传递给已注册的监听器 (#229)。
    • 修复了使用从右到左 (RTL) 布局时 PlayerView 内中心播放器控件的排序问题 (#227)。
  • 会话:
    • 添加了抽象 SimpleBasePlayer,以帮助为自定义播放器实现 Player 接口。
    • 添加了辅助方法,用于将平台会话令牌转换为 Media3 SessionToken (#171)。
    • 使用 onMediaMetadataChanged 来触发平台媒体会话的更新 (#219)。
    • 将媒体会话添加为 DefaultMediaNotificationProvidergetMediaButtons() 的参数;为清楚起见,还使用了不可变列表 (#216)。
    • 添加了 onSetMediaItems 回调监听器,以便修改/设置 MediaItem 列表,同时按会话启动索引和位置,然后再设置到播放器上 (#156)。
    • 避免针对非蓝牙媒体按钮事件执行两次点按检测 (#233)。
    • 提高了 QueueTimeline 在出现可疑的旧版会话状态时的稳健性 (#241)。
  • 元数据:
    • 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
    • 添加了 MediaMetadata.mediaType,以指示内容类型或元数据描述的文件夹类型。
    • 添加了 MediaMetadata.isBrowsable,以替代 MediaMetadata.folderType。下一个版本中将废弃文件夹类型。
  • Cast 扩展程序:
    • 将 Cast SDK 版本升级到 21.2.0。
  • IMA 扩展程序:
    • 移除了应用线程上 ImaServerSideAdInsertionMediaSource 的播放器监听器,以避免出现线程问题。
    • ImaServerSideAdInsertionMediaSource.AdsLoader.Builder 添加 focusSkipButtonWhenAvailable 属性,以请求将 TV 设备上的“跳过”按钮设置为焦点,并将其默认设置为 true。
    • focusSkipButton() 方法添加到 ImaServerSideAdInsertionMediaSource.AdsLoader,以便通过程序化方式请求将“跳过”按钮设置为焦点。
    • 将 IMA SDK 版本提升至 3.29.0。
  • 演示版应用:
    • 在运行时请求下载通知的通知权限 (#10884)。

版本 1.0.0-beta03

2022 年 11 月 22 日

发布了 androidx.media3:media3-*:1.0.0-beta03版本 1.0.0-beta03 中包含这些提交内容

此版本与 ExoPlayer 2.18.2 版本相对应。

  • 核心库:
    • 添加了 ExoPlayer.isTunnelingEnabled 以检查当前所选轨道是否已启用隧道技术 (#2518)。
    • 添加了 WrappingMediaSource 以简化封装单个 MediaSource 的过程 (#7279)。
    • 在播放因可用内存不足而卡住之前舍弃返回缓冲区。
    • 在已启用分流的情况下关闭用于跟踪“doSomeWork”块的功能。
    • 修复了 PlaybackStatsListener 中快速跳转的会话跟踪问题 (#180)。
    • 在单项播放列表中调用 seekToNextseekToPrevious 时,发送缺失的 onMediaItemTransition 回调 (#10667)。
    • 添加了 Player.getSurfaceSize,用于返回呈现视频时所用 Surface 的大小。
    • 修复了在播放器释放期间移除监听器可能会导致 IllegalStateException 的 bug (#10758)。
  • build:
    • 强制执行最低 compileSdkVersion 以避免编译错误 (#10684)。
    • 避免于包含在另一 Gradle build 中时发布块。
  • 轨道选择:
    • 如果显示设备不支持杜比视界,请改选轨道。 (#8944)。
  • 下载内容:
    • 修复了由于使用同一 PriorityTaskManager 同时下载和播放而导致的 ProgressiveDownloader 中潜在的无限循环 (#10570)。
    • 立即显示下载通知 (#183)。
    • 将并行下载移除次数限制为 1 次,以免过度创建线程 (#10458)。
  • 视频:
    • 如果显示设备不支持杜比视界,请尝试改用替代解码器。 (#9794)。
  • 音频:
    • 使用 SingleThreadExecutor 释放 AudioTrack 实例,以免同时释放多个播放器时出现 OutOfMemory 错误 (#10057)。
    • 为 AudioTrack 分流状态添加了 AudioOffloadListener.onExperimentalOffloadedPlayback。 (#134)。
    • AudioTrackBufferSizeProvider 设为公共接口。
    • 添加了 ExoPlayer.setPreferredAudioDevice 以设置首选音频输出设备 (#135)。
    • androidx.media3.exoplayer.audio.AudioProcessor 重命名为 androidx.media3.common.audio.AudioProcessor
    • 在所有 Android 版本上,将 8 声道和 12 声道音频分别映射到 7.1 和 7.1.4 声道掩码 (#10701)。
  • 元数据:
    • 现在可以将 MetadataRenderer 配置为在元数据可用后立即渲染。创建一个具有 MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) 的实例,以指定渲染程序是尽早输出元数据还是与播放器位置同步元数据。
  • DRM:
    • 解决了 Android 13 ClearKey 实现中会返回非空但无效许可网址的 bug。
    • 修复了在播放列表中的 DRM 方案之间切换时(例如从 Widevine 切换为 ClearKey)出现的 setMediaDrmSession failed: session not opened 错误。
  • 文本:
    • CEA-608:确保正确处理字段 2 上的服务切换命令 (#10666)。
  • DASH:
    • 从清单中解析 EventStream.presentationTimeOffset (#10460)。
  • 界面:
    • 使用播放器的当前替换值作为 TrackSelectionDialogBuilder 中的预设值 (#10429)。
  • 会话:
    • 确保命令始终以正确顺序执行,即使某些命令需要异步解析也是如此 (#85)。
    • 添加了 DefaultMediaNotificationProvider.Builder 以构建 DefaultMediaNotificationProvider 实例。构建器可以配置提供程序使用的通知 ID、通知渠道 ID 和通知渠道名称。此外,还添加了方法 DefaultMediaNotificationProvider.setSmallIcon(int) 以设置通知小图标。(#104)。
    • 确保不会丢弃在 MediaController.release() 之前发送的命令 (#99)。
    • SimpleBitmapLoader 可以从 file:// URI 加载位图 (#108)。
    • 修复了阻止 MediaController 在一段时间内查找广告的断言 (#122)。
    • 播放结束后,系统会从前台停止 MediaSessionService,并显示通知以重新开始播放最近播放过的媒体项 (#112)。
    • 不启动具有待处理的暂停 intent 的前台服务 (#167)。
    • 手动隐藏与 DefaultNotificationProvider 在 API 26 和 API 27 上创建的通知关联的“标记”(在 API 28 及更高级别上,标记会自动隐藏)(#131)。
    • 修复了从旧版 MediaSession 到 Media3 MediaController 的第二项 binder 连接导致 IllegalStateException 的 bug (#49)。
  • RTSP:
    • 添加了 H263 碎片化数据包处理机制 (#119)。
    • 添加了对 MP4A-LATM 的支持 (#162)。
  • IMA:
    • 添加了加载广告信息的超时,以处理 IMA SDK 在加载广告时卡住的情况 (#10510)。
    • 阻止在跳转到内容末尾时跳过中贴片广告 (#10685)。
    • 正确计算包含服务器端插入广告的直播(例如 IMA DAI)的窗口时长 (#10764)。
  • FFmpeg 扩展程序:
    • 添加了新的必需标志,以将 FFmpeg 库与 NDK 23.1.7779620 及更高版本关联 (#9933)。
  • AV1 扩展程序:
    • 更新了 CMake 版本,以免与最新的 Android Studio 版本不兼容 (#9933)。
  • Cast 扩展程序:
    • 实现了 getDeviceInfo(),以便能在使用 MediaController 控制播放时识别 CastPlayer (#142)。
  • 转换器:
    • 添加了多路复用器监控定时器,以检测生成输出样本的速度是否过慢。
  • 移除了已废弃的符号:
    • 移除了 Transformer.Builder.setOutputMimeType(String)。此功能已被移除。使用默认多路复用器时,MIME 类型将始终为 MP4 格式。

版本 1.0.0-beta02

2022 年 7 月 21 日

发布了 androidx.media3:media3-*:1.0.0-beta02版本 1.0.0-beta02 中包含这些提交内容

此版本与 ExoPlayer 2.18.1 版本相对应。

  • 核心库:
    • 确保使用 ExoPlayer.setShuffleOrder 更改 ShuffleOrder 后会导致使用 reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGEDPlayer.Listener#onTimelineChanged 进行调用 (#9889)。
    • 对于渐进式媒体,仅在缓冲位置添加所选轨道 (#10361)。
    • 允许将自定义日志记录器用于所有 ExoPlayer 日志输出 (#9752)。
    • 修复了在 DefaultMediaSourceFactory 中实现 setDataSourceFactory 的问题,后者以前在某些情况下无法正常运行 (#116)。
  • 提取器:
    • 修复了解析 H265 短期引用图片集的问题 (#10316)。
    • 修复了解析 esds 框中比特率的问题 (#10381)。
  • DASH:
    • 从清单中解析 ClearKey 许可网址 (#10246)。
  • 界面:
    • 确保 TalkBack 在播放控件菜单中公布当前有效的速度选项 (#10298)。
  • RTSP:
    • 添加了 VP8 碎片化数据包处理机制 (#110)。
  • Leanback 扩展:
    • 监听 LeanbackAdapter 中的 playWhenReady 更改 (10420)。
  • Cast:
    • 把已传递到播放列表方法的 MediaItem 用作 CastTimeline 中的 Window.mediaItem#25#8212)。
    • 使用 CastPlayer 来支持 Player.getMetadata()Listener.onMediaMetadataChanged() (#25)。

版本 1.0.0-beta01

2022 年 6 月 16 日

发布了 androidx.media3:media3-*:1.0.0-beta01版本 1.0.0-beta01 中包含这些提交内容

这与 ExoPlayer 2.18.0 版本相对应。

  • 核心库:
    • 通过 MediaMetricsManager 启用了对 Android 平台诊断信息的支持。ExoPlayer 会将播放事件和性能数据转发到平台,这有助于在设备上提供系统性能和调试信息。如果设备用户启用了使用情况和诊断信息数据分享功能,Google 可能也会收集上述数据。应用可以选择不通过 ExoPlayer.Builder.setUsePlatformDiagnostics(false) 为 ExoPlayer 提供平台诊断信息。
    • 修复了使用 MergingMediaSource 时轨道重置太频繁的 bug,例如侧载 (side-loading) 字幕和播放过程中更改所选字幕时 (#10248)。
    • 停止在 API 29 和 30 上检测 5G-NSA 网络类型。这些播放将假设使用 4G 网络。
    • 禁止将 null 传递给 MediaSource.Factory.setDrmSessionManagerProviderMediaSource.Factory.setLoadErrorHandlingPolicy。如果需要,可以显式传递 DefaultDrmSessionManagerProviderDefaultLoadErrorHandlingPolicy 的实例。
    • 添加了 MediaItem.RequestMetadata 来表示在确切 LocalConfiguration 未知的情况下播放媒体所需的元数据。此外,还移除了 MediaMetadata.mediaUrl,因为它现在已包含在 RequestMetadata 中。
    • 添加了 Player.Command.COMMAND_SET_MEDIA_ITEM,使播放器允许设置单个媒体项。
  • 轨道选择:
    • 已将 TrackSelectionOverrides 类扁平化为 TrackSelectionParameters,并将 TrackSelectionOverride 提升为顶级类。
    • 已将 TracksInfo 重命名为 Tracks,并将 TracksInfo.TrackGroupInfo 重命名为 Tracks.GroupPlayer.getCurrentTracksInfoPlayer.Listener.onTracksInfoChanged 也已重命名为 Player.getCurrentTracksPlayer.Listener.onTracksChanged。这包括“取消废弃” (un-deprecating) Player.Listener.onTracksChanged 方法名称,但使用的是不同的参数类型。
    • 更改了 DefaultTrackSelector.buildUponParametersDefaultTrackSelector.Parameters.buildUpon 以返回 DefaultTrackSelector.Parameters.Builder,而不是已废弃的 DefaultTrackSelector.ParametersBuilder
    • 添加了 DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities(默认处于启用状态)。启用后,DefaultTrackSelector 会优先选用声道数不超过设备输出功能的音轨。在手持设备上,DefaultTrackSelector 会优先选用立体声/单声道,而非多声道音频格式,除非该多声道格式可以空间化(Android 12L 及更高版本)或属于杜比环绕声格式。此外,在支持音频空间化的设备上,DefaultTrackSelector 将监控空间化程序属性的变化,并在出现这些变化时触发新的音轨选择。具有 television 界面模式的设备不受这些限制的约束,系统会优先选用声道数最多的格式。如需启用此功能,必须使用 Context 构建 DefaultTrackSelector 实例。
  • 视频:
    • 已将 DummySurface 重命名为 PlaceholderSurface
    • MediaCodecVideoRenderer.getCodecMaxInputSize 添加了 AV1 支持。
  • 音频:
    • 使用宣传非标准 MIME 类型的 LG AC3 音频解码器。
    • AudioAttributes.getAudioAttributesV21() 的返回值类型从 android.media.AudioAttributes 更改为新的 AudioAttributesV21 封装容器类,以防止 ART 验证速度在级别低于 21 的 API 上变慢。
    • 对平台(级别为 29 及以上的 API)进行查询,或在未设置格式声道数的情况(在启用 HLS 无块准备时会发生)下对音频透传的音频编码声道数进行假设 (10204)。
    • 解码器输出为 12 声道 PCM 音频时使用声道掩码 AudioFormat.CHANNEL_OUT_7POINT1POINT4 来配置 AudioTrack (#10322)。
  • DRM
    • 确保格式更改后始终能够立即正确更新 DRM 会话 (10274)。
  • 文本:
    • 更改了 Player.getCurrentCues() 以返回 CueGroup,而不是 List<Cue>
    • SSA:支持 BorderStyle == 3(即 OutlineColour 设置 cue 文件的背景)时的 OutlineColour 样式设置 (#8435)。
    • CEA-708:将数据解析为多个服务块,并忽略与当前所选服务号码无关的块。
    • 移除了过去仅用于处理 Google 内部字幕格式的 RawCcExtractor
  • 提取器:
    • 添加了对 AVI 的支持 (#2092)。
    • Matroska:解析了 Opus 轨道的 DiscardPadding
    • MP4:解析了 esds 框中的比特率。
    • Ogg:允许重复的 Opus ID 和注释标头 (#10038)。
  • 界面:
    • 修复了 useController=false 时将事件传递给 PlayerView 上设置的 OnClickListener 的问题 (#9605)。此外,还修复了针对所有视图配置将事件传递给 OnLongClickListener 的问题。
    • 修复了将 ACTION_UP 之前退出 PlayerView 边界的一系列触摸事件错误处理为点击的问题 (#9861)。
    • 修复了点按操作可能会切换播放,而不是隐藏控件的 PlayerView 无障碍功能问题 (#8627)。
    • 重写了 TrackSelectionViewTrackSelectionDialogBuilder,以使用 Player 接口(而不是 ExoPlayer)。这样做将允许视图与其他 Player 实现一起使用,并移除界面模块对 ExoPlayer 模块的依赖关系。这是一项重大变更。
    • 不在 PlayerView 轨道选择器中显示强制文字轨道;如果选择了“None”,则保留一个合适的强制文字轨道 (#9432)。
  • DASH:
    • 解析了 DTS AudioChannelConfiguration 元素中的声道数。这会为 DTS 流重新启用音频透传 (#10159)。
    • 禁止将 null 传递给 DashMediaSource.Factory.setCompositeSequenceableLoaderFactory。如果需要,可以显式传递 DefaultCompositeSequenceableLoaderFactory 的实例。
  • HLS:
    • 如果播放列表 CODECS 属性不包含音频编解码器,则回退到分块准备 (#10065)。
    • 禁止将 null 传递给 HlsMediaSource.Factory.setCompositeSequenceableLoaderFactoryHlsMediaSource.Factory.setPlaylistParserFactoryHlsMediaSource.Factory.setPlaylistTrackerFactory。如果需要,可以显式传递 DefaultCompositeSequenceableLoaderFactoryDefaultHlsPlaylistParserFactory 或对 DefaultHlsPlaylistTracker.FACTORY 的引用。
  • 流畅的流式传输:
    • 禁止将 null 传递给 SsMediaSource.Factory.setCompositeSequenceableLoaderFactory。如果需要,可以显式传递 DefaultCompositeSequenceableLoaderFactory 的实例。
  • RTSP:
    • 添加了适用于 H263 的 RTP 读取器 (#63)。
    • 添加了适用于 MPEG4 的 RTP 读取器 (#35)。
    • 添加了适用于 HEVC 的 RTP 读取器 (#36)。
    • 添加了适用于 AMR 的 RTP 读取器。目前仅支持单声道非交错 AMR 流。不支持复合 AMR RTP 载荷。 (#46)。
    • 添加了适用于 VP8 的 RTP 读取器 (#47)。
    • 添加了适用于 WAV 的 RTP 读取器 (#56)。
    • 修复了 RTSP 基本授权标头。 (#9544)。
    • 停止检查必填 SDP 字段,因为 ExoPlayer 不需要这些字段 (#10049)。
    • 解析 RTSP 时间时会抛出受检异常 (#10165)。
    • 添加了适用于 VP9 的 RTP 读取器 (#47)。
    • 添加了适用于 OPUS 的 RTP 读取器 (#53)。
  • 数据源:
    • 已将 DummyDataSource 重命名为 PlaceholderDataSource
    • 添加了 OkHttp 中断处理的解决方法。
  • 会话:
    • MediaSession.MediaItemFiller 替换为 MediaSession.Callback.onAddMediaItems,以允许异步解析请求。
    • MediaController 连接到旧版媒体会话时,支持 setMediaItems(s) 方法。
    • 移除了 MediaController.setMediaUriMediaSession.Callback.onSetMediaUri。使用 MediaController.setMediaItemMediaSession.Callback.onAddMediaItems 可实现相同的功能。
    • 转发旧版 MediaController 调用,以便将媒体播放到 MediaSession.Callback.onAddMediaItems(而非 onSetMediaUri)。
    • 添加了 MediaNotification.ProviderDefaultMediaNotificationProvider,以支持通知自定义。
    • 添加了 BitmapLoaderSimpleBitmapLoader,用于下载海报图片。
    • 添加了 MediaSession.setCustomLayout(),以向后兼容旧版会话。
    • 添加了 MediaSession.setSessionExtras(),以提供与旧版会话相当的功能。
    • 已将 MediaSession.MediaSessionCallback 重命名为 MediaSession.Callback,并将 MediaLibrarySession.MediaLibrarySessionCallback 重命名为 MediaLibrarySession.Callback,将 MediaSession.Builder.setSessionCallback 重命名为 setCallback
    • 修复了 MediaControllerImplLegacy 中的 NPE (#59)。
    • 在时间轴发生更改时会更新会话位置 (#51)。
    • 修复了释放控制器后 MediaControllerImplBase 中的 NPE (#74)。
  • 广告播放/IMA:
    • 将广告轮询频率从每 100 毫秒减少到每 200 毫秒,以便与美国媒体评定委员会 (MRC) 建议保持一致。
  • FFmpeg 扩展程序:
    • 将 CMake 版本更新为 3.21.0+,以避免 CMake bug 导致 Android Studio 的 Gradle 同步失败 (#9933)。
  • 移除了已废弃的符号:
    • 移除了 Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)。改用 Player.Listener.onTracksChanged(Tracks)
    • 移除了 Player.getCurrentTrackGroupsPlayer.getCurrentTrackSelections。改用 Player.getCurrentTracks。您也可以继续使用 ExoPlayer.getCurrentTrackGroupsExoPlayer.getCurrentTrackSelections,尽管这些方法已废弃。
    • 移除了 DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTDEFAULT_TRACK_SELECTOR_PARAMETERS 常量。尽可能改用 getDefaultTrackSelectorParameters(Context),或者使用 DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
    • 移除了构造函数 DefaultTrackSelector(ExoTrackSelection.Factory)。 改用 DefaultTrackSelector(Context, ExoTrackSelection.Factory)
    • 移除了 Transformer.Builder.setContext。改为将 Context 传递给 Transformer.Builder 构造函数。

版本 1.0.0-alpha03

2022 年 3 月 14 日

发布了 androidx.media3:media3-*:1.0.0-alpha03版本 1.0.0-alpha03 中包含这些提交内容

这与 ExoPlayer 2.17.1 版本相对应。

  • 音频:
    • 修复了 HLS 中杜比全景声 (E-AC3-JOC) 音频检查功能的错误。
  • 提取器:
    • FMP4:修复了包含 v0 和 v1 emsg Atom 的数据流 emsg 示例元数据可能会以错误的顺序输出的问题 (#9996)。
  • 文本:
    • 修复了 SingleSampleMediaSource.Factory.setTrackIdMediaItem.SubtitleConfiguration.Builder.setId 的互动以优先处理 SubtitleConfiguration 字段,如果未设置,回退到 Factory 值 (#10016)。
  • 广告播放:
    • 修复了直播 HLS SSAI 数据流中广告时段之间的音频欠载问题。

版本 1.0.0-alpha02

2022 年 3 月 2 日

发布了 androidx.media3:media3-*:1.0.0-alpha02版本 1.0.0-alpha02 中包含这些提交内容

这与 ExoPlayer 2.17.0 版本相对应。

  • 核心库:
    • 添加了受保护的方法 DefaultRenderersFactory.getCodecAdapterFactory(),这样,替换 buildVideoRenderers()buildAudioRenderers()DefaultRenderersFactory 子类就可以访问编解码器适配器工厂,并将其传递给它们创建的 MediaCodecRenderer 实例。
    • 将 ICY 标头字段 namegenre 分别传播到 MediaMetadata.stationMediaMetadata.genre,以便它们通过 Player.Listener.onMediaMetadataChanged() 到达应用 (#9677)。
    • DefaultHttpDataSource#getResponseHeaders 中移除了 null 键。
    • 在创建 MediaCodec 实例失败时会休眠并重试。这可解决在将 Surface 从一个安全的编解码器切换到另一个编解码器时,某些设备上会出现的问题 (#8696)。
    • 添加了 MediaCodecAdapter.getMetrics() 以允许用户从 MediaCodec 获取指标数据。(#9766)。
    • 修复了 Maven 依赖项解析 (#8353)。
    • 如果直播既没有低延迟功能也没收到要设置速度的用户请求,则停用直播的自动速度调整功能 (#9329)。
    • 已将 DecoderCounters#inputBufferCount 重命名为 queuedInputBufferCount
    • SimpleExoPlayer.renderers 设为了不公开。可通过 ExoPlayer.getRenderer 访问渲染程序。
    • 更新了一些 AnalyticsListener.EventFlags 常量值,以与 Player.EventFlags 中的值匹配。
    • AnalyticsCollector 拆分为一个接口和默认实现,以允许它在不为应用所需时由 R8 去掉。
  • 轨道选择:
    • 支持在轨道选择中使用首选视频角色标志 (#9402)。
    • 将视频轨道选择逻辑更新为:在选择多个视频轨道用于自适应调整时,考虑首选的 MIME 类型和角色标志 (#9519)。
    • 将视频和音频轨道选择逻辑更新为:仅为解码器和硬件支持的级别相同的自适应选择项选择格式 (#9565)。
    • 将视频轨道选择逻辑更新为:如果主要的硬件加速解码器支持多个编解码器,则优先选用效率较高的编解码器 (#4835)。
    • 相较于技术轨道选择约束(例如,首选的 MIME 类型或频道数量上限),优先选用音频内容偏好设置(例如,“默认”音轨或某个与系统语言区域的语言相匹配的轨道)。
    • 修复了以下轨道选择问题:替换一个轨道组不会停用同一类型的其他轨道组 (#9675)。
    • 修复了以下轨道选择问题:同时存在非空和空轨道替换时无法正确应用 (#9649)。
    • 禁止 TrackGroupArray 中有重复的 TrackGroup。始终可通过在 TrackGroup 构造函数中设置 id 而使 TrackGroup 可区分开。这修复了以下问题:通过活跃轨道替换使应用转入后台再继续播放时会发生崩溃 (#9718)。
    • 修正了 AdaptiveTrackSelection 中的逻辑,在网络带宽足够的情况下允许提高质量,即使播放质量已非常接近当时的极限时也是如此 (#9784)。
  • 视频:
    • 修复了杜比视界的解码器回退逻辑,以在需要时使用兼容的 H264/H265 解码器。
  • 音频:
    • 修复了杜比全景声 (E-AC3-JOC) 的解码器回退逻辑,以在需要时使用兼容的 E-AC3 解码器。
    • AudioCapabilities API 更改为要求明确传递 AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES 而不是 null
    • 允许通过将 AudioTrackBufferSizeProvider 注入 DefaultAudioSink 来自定义 AudioTrack 缓冲区空间的计算。(#8891)。
    • 在请求的缓冲区空间大于 1 MB 时重试创建 AudioTrack。(#9712)。
  • 提取器:
    • WAV:添加了对 RF64 流的支持 (#9543)。
    • 修复了对 H.265 SPS NAL 单元的解析错误 (#9719)。
    • 会解析 Ogg Opus 和 Ogg Vorbis 文件中的 Vorbis 注释(包括 METADATA_BLOCK_PICTURE)。
  • 文本:
    • 添加了一个 MediaItem.SubtitleConfiguration.id 字段,该字段会传播到通过配置创建的字幕轨道的 Format.id 字段 (#9673)。
    • 在 Matroska 容器中添加了对 WebVTT 字幕的基本支持 (#9886)。
    • 防止 Cea708Decoder 的读取量多于相应服务块声明的量。
  • DRM:
    • DrmSessionManager.(pre)acquireSession 中移除了 playbackLooper。 当自定义的 MediaSource 中的应用使用 DrmSessionManager 时,需要改为将 playbackLooper 传递给 DrmSessionManager.setPlayer
  • 广告播放/IMA:
    • 添加了对 IMA 动态广告插播 (DAI) 的支持 (#8213)。
    • AdPlaybackState 中添加了一个允许重置广告组的方法,以便广告组可以再次播放 (#9615)。
    • 在广告播放期间强制保持 1.0 的播放速度 (#9018)。
    • 修复了以下问题:未能加载广告组导致播放立即重置 (#9929)。
  • 界面:
    • 修复了使用某些主题时 StyledPlayerView 快退按钮和快进按钮中数字的颜色 (#9765)。
    • 正确解析播放速度字符串 (#9811)。
  • DASH:
    • 将解析出来的基本属性和补充属性添加到 Representation (#9579)。
    • 支持 forced-subtitle 轨道角色 (#9727)。
    • 停止将 main 轨道角色解读为 C.SELECTION_FLAG_DEFAULT
    • 修复了未声明 DVB 命名空间的清单的基本网址排除逻辑 (#9856)。
    • 支持相对 MPD.Location 网址 (#9939)。
  • HLS:
    • 为仅音频的 HLS 流正确地填充 Format.label (#9608)。
    • 默认使用无块准备来缩短启动时间。如果您的呈现内容包含在主播放列表中声明的多路复用字幕轨道,您应该将其添加到主播放列表中以供播放,或使用 HlsMediaSource.Factory.setAllowChunklessPreparation(false) 关闭无块准备。
    • 支持在 HLS 中进行关键帧精确定位 (#2882)。
  • RTSP:
    • 提供客户端 API 以替换用于任何服务器连接的 SocketFactory (#9606)。
    • 如果基本和摘要式身份验证方式都有,优先选用摘要式身份验证方式 (#9800)。
    • 当 RTSP 轨道时间不可用时及时应对 (#9775)。
    • 忽略无效的 RTP-Info 标头值 (#9619)。
  • 转换器:
    • 将要求的最低 API 版本提高到 21。
    • TransformationException 现已用于描述转换期间发生的错误。
    • 添加了 TransformationRequest 以指定转换选项。
    • 允许注册多个监听器。
    • 修复了当读取了部分编解码器输出内容时转换器卡住的问题。
    • 修复了在释放多路复用器抛出项时 Transformer.getProgress 中潜在的 NPE 问题。
    • 添加了用于应用转换的演示版应用。
  • MediaSession 扩展程序:
    • 默认情况下,MediaSessionConnector 现会在停止时清除播放列表。希望保留播放列表的应用可以在连接器上调用 setClearMediaItemsOnStop(false)
  • Cast 扩展程序:
    • 修复了导致 CastPlayer 无法正确调用 onIsPlayingChanged 的 bug (#9792)。
    • 支持音频元数据,包括带有 DefaultMediaItemConverter 的海报图片 (#9663)。
  • FFmpeg 扩展程序:
    • build_ffmpeg.sh 依赖于 LLVM(而非 GNU)的 bin utils (#9933)。
  • Android 12 兼容性:
    • 将 Cast 扩展程序升级为依赖于 com.google.android.gms:play-services-cast-framework:20.1.0。早期版本的 play-services-cast-framework 与以 Android 12 为目标平台的应用不兼容,会在创建 PendingIntent 时崩溃并产生 IllegalArgumentException (#9528)。
  • 移除了已废弃的符号:
    • 移除了 Player.EventListener。改用 Player.Listener
    • 移除了 MediaSourceFactory#setDrmSessionManagerMediaSourceFactory#setDrmHttpDataSourceFactoryMediaSourceFactory#setDrmUserAgent。改用 MediaSourceFactory#setDrmSessionManagerProvider
    • 移除了 MediaSourceFactory#setStreamKeys。改用 MediaItem.Builder#setStreamKeys
    • 移除了 MediaSourceFactory#createMediaSource(Uri)。改用 MediaSourceFactory#createMediaSource(MediaItem)
    • DashMediaSourceHlsMediaSourceSsMediaSource 中移除了 setTag。改用 MediaItem.Builder#setTag
    • 移除了 DashMediaSource#setLivePresentationDelayMs(long, boolean)。使用 MediaItem.Builder#setLiveConfigurationMediaItem.LiveConfiguration.Builder#setTargetOffsetMs 替换清单,或使用 DashMediaSource#setFallbackTargetLiveOffsetMs 提供回退值。
    • 移除了 (Simple)ExoPlayer.setThrowsWhenUsingWrongThread。无法再选择停用线程强制执行。
    • 移除了 ActionFileActionFileUpgradeUtil。使用 ExoPlayer 2.16.1 或更低版本,以利用 ActionFileUpgradeUtil 将旧版操作文件合并到 DefaultDownloadIndex 中。
    • 移除了 ProgressiveMediaSource#setExtractorsFactory。改用 ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory) 构造函数。
    • 移除了 ProgressiveMediaSource.Factory#setTagProgressiveMediaSource.Factory#setCustomCacheKey。改用 MediaItem.Builder#setTagMediaItem.Builder#setCustomCacheKey
    • 移除了 DefaultRenderersFactory(Context, @ExtensionRendererMode int)DefaultRenderersFactory(Context, @ExtensionRendererMode int, long) 构造函数。改用 DefaultRenderersFactory(Context) 构造函数、DefaultRenderersFactory#setExtensionRendererModeDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
    • 移除了所有公开的 CronetDataSource 构造函数。改用 CronetDataSource.Factory
  • 将以下 IntDefs 更改为仅限 @Target(TYPE_USE)。这可能会破坏相应 Kotlin 代码的编译,解决方法是将注解更改为对类型 (Int) 进行注解。
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags(在 com.google.android.exoplayer2.ext.flac 软件包中)
    • @FlacExtractor.Flags(在 com.google.android.exoplayer2.extractor.flac 软件包中)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

版本 1.0.0-alpha01

2021 年 10 月 27 日

发布了 androidx.media3:media3-*:1.0.0-alpha01版本 1.0.0-alpha01 中包含这些提交内容

新功能

Media3 是面向媒体支持库(包括 ExoPlayer)的新平台。首个 Alpha 版包含用于实现媒体用例的库的早期功能实现,包括:

  • ExoPlayer - 一种适用于 Android 的应用级媒体播放器,可轻松自定义和扩展。
  • 用于公开和控制播放的媒体会话功能。这一新的会话模块使用与 ExoPlayer 相同的 Player 接口。
  • 用于构建媒体播放界面的界面组件。
  • 其他库中用于 ExoPlayer 的模块封装功能,例如通过 IMA SDK 插入广告。

如需了解详情,请参阅 Media3 GitHub 项目

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