Media3
| 最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
|---|---|---|---|---|
| 2026 年 10 月 21 日 | 1.11.1 | - | - | 1.12.0-alpha01 |
声明依赖项
如需添加 Media3 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle 文件中添加所需工件的依赖项:
Groovy
dependencies { def media3_version = "1.11.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 Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Jetpack Compose with Material Design 3 implementation "androidx.media3:media3-ui-compose-material3:$media3_version" // For building media playback UIs using Views 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 inspecting media files implementation "androidx.media3:media3-inspector:$media3_version" // For extracting and processing video frames implementation "androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames implementation "androidx.media3:media3-effect-lottie:$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.11.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 inspecting media files implementation("androidx.media3:media3-inspector:$media3_version") // For extracting and processing video frames implementation("androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames implementation("androidx.media3:media3-effect-lottie:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。您可以使用 Media3 问题跟踪器来查找问题的答案、已知问题和功能请求,以及提交新问题。
1.12.0 版
版本 1.12.0-alpha01
2026 年 10 月 21 日
版本 1.12.0-alpha01 包含以下提交内容。
- 通用库:
- 添加了
C.COLOR_SPACE_DISPLAY_P3,并在MediaFormatUtil和ColorInfoISO 颜色映射中支持 Display P3 色彩空间。 - 添加了中央
Flags注册表,用于管理实验性功能标志和分阶段发布 (Flags.setCanaryModeEnabled)。迁移了许多现有@ExperimentalApi方法,以使用新的标志 API。 - 添加
MediaMetadata.playlistId、MediaMetadata.Builder.setPlaylistId(String)、MediaMetadata.categories和MediaMetadata.Builder.setCategories(List<String>)。 - 将
androidx.media3.common.util.NonNullApi替换为 JSpecifyorg.jspecify.annotations.NullMarked。
- 添加了
- ExoPlayer:
- 修复了以下问题:当下一个时段的第一个分块加载失败时,DASH 多时段播放会卡住 (#3396)。
- 在加载重试次数用尽时,在
AnalyticsListener.onLoadError和MediaSourceEventListener.onLoadError中报告wasCanceled = true。 - 支持使用
ExoPlayer.addVideoFrameMetadataListener和ExoPlayer.removeVideoFrameMetadataListener注册多个VideoFrameMetadataListener实例,弃用ExoPlayer.setVideoFrameMetadataListener和ExoPlayer.clearVideoFrameMetadataListener。 - 通过拆分和偏移每个时段的
AdPlaybackState,添加对多时段内容(例如 DASH)中广告的支持。 - 修复了
PreCacheHelper中的竞态条件,即取消正在进行的准备请求仍可能启动后台下载。 ProgressiveMediaSource和DefaultMediaSourceFactory上的setLoadOnlySelectedTracks(true)限制为仅滤除未选择的视频和图片轨道。音频和文本轨道始终处于加载状态,以便在不重新缓冲的情况下无缝切换轨道。- 默认在
ProgressiveMediaSource和DefaultMediaSourceFactory上启用setLoadOnlySelectedTracks(true)。这样可以节省内存,并让DefaultLoadControl缓冲区分配计算在未选择所有轨道时更准确地运行。请注意,如果在播放过程中新启用了未选择的视频或图片轨道,这可能会导致额外的缓冲。 - 修复了启用动态调度时
Player.getCurrentPosition()可能会返回过时值(每秒仅更新几次)的问题 (#3286)。 - 修复了以下问题:
AudioTrack播放头位置意外减少或重置可能会被错误地视为整数溢出,从而导致播放因缓冲而停止 (#3407)。 - 移除实验性
DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean)。 - 避免在从插页式广告或广告返回到末尾被剪辑的内容时,不必要地重新启用渲染器和出现故障 (#3371)。
- 修复了以下问题:启用
Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION时,即将播放的播放列表项上的渲染器错误可能会过早中断当前播放。 - 修复了在启用
Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION时,如果ExoPlayer将渲染程序转换为未准备好的媒体时段,可能会发生的NullPointerException。 - 修复了在启用
Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS的情况下,动态调度期间视频帧可能会意外跳过或丢弃的问题。 - 修复了在直播期间播放广告时停止播放会导致分析监听器中出现
ArrayIndexOutOfBoundsException的问题 (#3423)。 - 修复了以下问题:在从未调用
preload()的情况下,PreloadMediaSource可能会意外发布预加载事件 (#3408)。 - 修复了以下问题:元数据轨道会忽略
Format.subsampleOffsetUs,导致解码后的 SCTE-35 拼接命令中的播放时间戳不正确 (#3413)。 - 修复了在同一来源上多次调用
preload()时PreloadMediaSource和DefaultPreloadManager中发生内存泄漏的问题 (#3445)。 - 修复了在内容时间轴刷新处于待处理状态时释放
AdsMediaSource导致的NullPointerException(#3442)。 - 修复了以下问题:在跳转后(或在非零位置开始播放时)加载失败并重试时,渐进式媒体的播放可能会跳转到错误的位置 (#3440)。
- 添加了针对小米电视棒 4K (MiTV-AYFR0) H.264 解码器在无缝分辨率更改时冻结的问题的权宜解决方法 (#3457)。
- 修复了在执行已发布的加载完成或错误回调之前停止跟踪器时,
SteeringManifestTracker中出现NullPointerException的问题 (#3443)。 - 支持从 MP4 文件中的
mebx盒式元数据轨道播放 HAGC (ST 2094-50) 定时元数据。 - 修复了播放列表中准备缓慢的媒体时段可能会被跳过的问题。
- CompositionPlayer:
- 支持使用
Composition.Builder.setVideoFrameAggregationParameters为播放工作流配置视频帧聚合的帧速率。 - 修复了多序列合成中因时间戳量化或舍入不匹配而导致的丢帧问题,方法是在帧聚合期间选择时间戳最接近的帧。此功能仅从 API 29 开始启用,因为它需要在每个视频序列中额外保留一个正在处理的帧。
- 支持使用
- 转换器:
- 支持使用
Composition.Builder.setVideoFrameAggregationParameters为导出工作流配置视频帧聚合的帧速率。 - 修复了多序列合成中因时间戳量化或舍入不匹配而导致的丢帧问题,方法是在帧聚合期间选择时间戳最接近的帧。此功能仅从 API 29 开始启用,因为它需要在每个视频序列中额外保留一个正在处理的帧。
- 使用
AudioProcessors时,遵循Transformer#setAudioMimeType(AUDIO_RAW)。在此修复之前,请求MimeTypes.AUDIO_RAW并应用AudioProcessor会导致输出被压缩。
- 支持使用
- 轨道选择:
- 修复了以下问题:在某些设备上,SDR 轨道被错误地优先于受支持的 Dolby Vision 轨道 (#3135)。
- 提取器:
- Mp4Extractor:修复了 MP4 中 Opus 的
dOps框解析问题,其中PreSkip、InputSampleRate和OutputGain未从大端序转换为小端序,导致在没有修改列表时前 ~299 毫秒的音频被丢弃 (#3431)。 - 移除
Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES、Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265、FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES和FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265,因为默认情况下会为 H.264 和 H.265 启用 GOP 内样本依赖项解析。 - Mp4Extractor:修复了从包含海拔坐标的
xyz框中解析位置元数据以填充Mp4LocationData的问题。 - 添加了
ExtractorUtil.getFramesPerEncodedSample,用于计算编码音频格式的每个样本的音频帧数 (#3367)。 - 向
Mp4Extractor添加了FLAG_READ_XMP_METADATA,以便从顶级 UUID 框中提取 XMP 元数据。 - 通过在将载荷传递到音频读取器之前,从
PsExtractor中每个 PES 数据包中剥离private_stream_1子流标头,修复播放 DVD 样式 MPEG-PS 内容时损坏的 AC-3、DTS 和 LPCM 音频 (#3327)。 - 修复了当版本 1
tfdt框对负baseMediaDecodeTime进行编码时FragmentedMp4Extractor失败的问题 (#3412)。 - MPEG-TS:支持解析 H.264 和 H.265 帧打包排列 SEI 消息,以填充
Format.stereoMode(#3419)。 - 解析杜比视界配置文件 20 配置数据,并拒绝不受支持的杜比视界配置文件,而不是以颜色不正确的标准 HEVC 格式播放 (#3427)。
- MP3:还原 LAME/Xing 编码器延迟和填充元数据调整,因为它与许多
MediaCodecMP3 解码器不兼容 (#3425)。 - Matroska:修复了解析嵌套
ChapterAtom元素时的NullPointerException问题 (#3438)。 - Ogg:修复了以下 bug:大小为 255 字节的倍数且在页面边界处结束的数据包会与后续数据包合并。
- MP4:解析了
Mp4Extractor和FragmentedMp4Extractor中的mebx盒装定时元数据轨道。带有it35键的轨道会公开为MimeTypes.APPLICATION_ITUT_T35(启用 HAGC 播放)。除非设置了FLAG_EMIT_RAW_MEBX_DATA,否则系统会忽略其他mebx轨道,在这种情况下,所有mebx轨道都会作为原始MimeTypes.APPLICATION_MEBX发出。 - Ogg:支持提取 Opus 结尾填充以实现无缝播放 (#2576),并修复了在跳转到以连续数据包开头的页面后出现的样本时间戳问题。
- Ogg:通过忽略流中 Opus ID 和注释标头数据包,修复了链式 Ogg Opus 流中的解码错误和约 1 秒的时间戳跳跃问题。
- Mp4Extractor:修复了 MP4 中 Opus 的
- 检查器:
- 支持使用
MetadataRetriever从 MP4 文件中检索 XMP 元数据。 - 支持将
MediaExtractorCompat中mebx封装的定时元数据轨道提取为MimeTypes.APPLICATION_MEBX。
- 支持使用
- 检查器框架:
- 修复了使用
FrameExtractor提取 Ultra HDR 帧时 SDR 基础图片中广色域 BT.2020 颜色被剪裁的问题。现在,色域外的颜色会柔和地压缩到 sRGB 色域中,而不是被限制。
- 修复了使用
- 音频:
- 针对在错误线程上调用
android.media.AudioDeviceCallback的设备添加了权宜解决方法 (#3386)。 - 修复了在通过压缩分流进行曲目转换后可能出现的播放卡顿问题。
- 解决了 Amazon Fire TV Stick 上 AC-3 音频在时段转换期间可能会卡住的问题 (#3448)。
- 支持针对 Ogg 和 WebM/Matroska Opus 无缝播放剪裁流末尾编码器填充 (#2576)。
- 修复了轨道转换期间动态分流无缝延迟和内边距更新问题,以便它们应用于传入轨道,而不是播放轨道。
- 除了播放列表中的无缝过渡之外,还可剪裁单个串流和播放列表中最终串流的编码器末尾内边距 (#2576)。
- 在数据流开头编码器延迟修剪完成后,如果不需要修剪数据流结尾填充,请避免在
TrimmingAudioProcessor中进行不必要的音频缓冲区复制。
- 针对在错误线程上调用
- 视频:
- 修复了具有相同释放时间戳的延迟视频帧的报告,以便将其报告为丢弃而不是跳过。
- 文本:
- 效果:
- 使用 StudioSound GMSCore 模块实现
SoundSeparationAudioProcessor,以进行音频源分离。
- 使用 StudioSound GMSCore 模块实现
- 多路复用器:
- 修复了
Mp4Muxer和FragmentedMp4Muxer中 Opus 的dOps框写入问题,其中PreSkip、InputSampleRate和OutputGain是以小端序而非大端序写入的 (#3431)。 - 支持使用
Mp4Muxer在Mp4LocationData中写入 GPS 海拔高度。 - 添加了
Muxer.Factory.create(ParcelFileDescriptor),以允许直接多路复用到ParcelFileDescriptor。 - 默认情况下,在分段 MP4 文件的
traf框中写入tfdt(轨道片段基本媒体解码时间)框,以提供媒体解码时间戳。 - 支持在
Mp4Muxer中写入 E-AC-3 和 E-AC-3 JOC(杜比全景声)dec3容器框。 - 为
MediaMuxerCompat添加了 WebM 格式支持。 - 在分段 MP4 文件的末尾写入
mfra(影片片段随机访问)框,以便在FragmentedMp4Extractor中使用FLAG_READ_MFRA_FOR_SEEK_MAP进行跳转。 - 修复了在写入任何其他样本之前写入 EOS 样本时
Mp4Writer和FragmentedMp4Writer中发生的崩溃问题。 - 通过在容器标头中通告
dby1兼容品牌,修复将杜比内容多路复用到 MP4 或分段 MP4 文件时的容器合规性问题 (#3369)。 - 在
Mp4Muxer和FragmentedMp4Muxer中支持 32 位浮点 PCM 音轨 (#3389)。 - 添加轨道时,拒绝
Mp4Muxer和FragmentedMp4Muxer中不受支持的杜比视界配置文件。 - 支持
Mp4Muxer和FragmentedMp4Muxer中的 24 位和 32 位整数 PCM 音轨。
- 修复了
- IMA 扩展程序:
- 在
ImaServerSideAdInsertionMediaSource中将播放器暂停和恢复事件转发到 IMA SDK。
- 在
- 会话:
- 添加
MediaConstants.EXTRAS_KEY_PLAYLIST_ID、MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE、MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI和MediaConstants.EXTRAS_KEY_CATEGORIES,以便根据旧版元数据和说明填充播放列表和内容项元数据,并添加MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE和MediaConstants.EXTRAS_KEY_TTL_SECONDS,以便提供建议LibraryParams.extras。 - 修复了在强制执行严格
PendingIntent限制的设备上创建或释放MediaSession时发生的SecurityException崩溃问题。 - 修复了以下问题:在 Android 12(API 31 和 32)上,当
MediaSessionService尚未在前台运行时,MediaSession.getControllerForCurrentRequest()会在播放请求期间返回null。 - 修复了当
MediaController连接到报告负最大音量的旧版会话时IllegalArgumentException崩溃的问题。 - 修复了以下问题:在暂停的旧版
MediaSessionCompat上调用MediaController.setMediaItem或setMediaItems,然后调用play(),可能会分派不受支持的onPrepareFrom*回调(而不是onPlayFrom*),或者分派onPlay()而不重新初始化请求的媒体文件。 - 修复了在收到自定义命令响应时旧版
MediaBrowser中的NullPointerException问题 (#3432)。 - 修复了在底层
Bundle中接收具有重复键的旧版元数据时IllegalArgumentException崩溃的问题。 - 控制旧版
MediaSessionCompat时,合并在同一Looper迭代中发出的传出MediaControllerCompat.TransportControls调用(例如,现在同时调用setMediaItem、prepare和play会调度单个onPlayFrom*回调)。
- 添加
- 界面:
- 修复了启用双向文本换行时 RTL 字幕标点符号定位和 span 范围保留问题 (#3454、#3455)。
- 将
TrackSelectionState和TrackSelectionParametersState类及其对应的可组合状态 remember 函数添加到media3-ui-compose模块。 - 引入
PresentationState.videoAspectRatio,并使Modifier.resizeWithContentScale采用aspectRatio: Float?而非sourceSizeDp: Size?。 - 将
CuesState类和rememberCuesState可组合项添加到media3-ui-compose模块,以便监听播放器的当前提示。 - 如果
ProgressSlider基于ExoPlayer或CompositionPlayer,请为其添加拖动模式支持。 - 向
PresentationState添加showArtwork支持,并使用它来对ContentFrame和Player中提供的可选artwork可组合项进行渲染计时。添加Artwork可组合项,用作artwork槽位的默认值。 - 向
PlayPauseButtonState添加新字段(showBuffering、showRetry、showReplay),并在PlayPauseButton中使用这些字段来呈现更多图标和缓冲指示器。 - 添加了
PlaybackState类,以允许自定义播放状态观察,并引入了BufferingIndicator作为独立于按钮的组件。 - 修复了以下问题:在多时段直播中,
PlayerView和PlayerControlView会在时段边界处显示直播后贴片广告占位符的广告标记。 Player、ContentFrame、PlayerDefaults和MiniController的可组合槽不再接收播放器或控件可见性作为参数。改为从调用范围捕获它们(例如,topControls现在为@Composable BoxScope.() -> Unit)。这是对不稳定 API 的一项破坏性更改。- 向
ContentFrame、Player和Modifier.resizeWithContentScale添加alignment参数,以便将经过缩放的内容放置在其容器中,并将ContentFrame的内容剪辑到其边界,这样使用ContentScale.Crop缩放的视频就不会再在其外部绘制。 - 通过公开
isLive和liveOffsetMs,为ProgressSlider、ProgressStateWithTickCount和ProgressStateWithTickInterval添加了直播界面支持。向media3-ui-compose-material3添加了LiveButton可组合项 (#2213)。
- Ktor 扩展程序:
- 修复了
KtorDataSource可能会将流中连接失败视为输入结束,而不是抛出HttpDataSourceException的问题 (#3460)。
- 修复了
- HLS 扩展程序:
- 将
EXT-X-STREAM-INF和EXT-X-I-FRAME-STREAM-INF上的VIDEO-RANGE(PQ和HLG)解析为Format.colorInfo(#3441)。 - 修复了解析包含 PES 媒体样本的 MPEG-TS
EXT-X-MAP初始化片段时出现的NullPointerException问题 (#3456)。 - 修复了以下回归问题:对于公开的 HLS 轨道,
Format.id和Format.metadata为null(#3402)。 - 将素材资源列表广告剪辑为
X-PLAYOUT-LIMIT,并跳过完全超出限制的广告;当插页式广告省略X-RESUME-OFFSET且其时长未知时,即使设置了X-PLAYOUT-LIMIT,也将内容恢复偏移量默认设置为 0。 - 修复了以下问题:解析
X-ASSET-LIST插页式广告会覆盖同一广告组中其他插页式广告的内容恢复偏移量贡献。
- 将
- DASH 扩展程序:
- 支持在
DashManifestParser中解析 Alternative MPD Insertion (urn:mpeg:dash:event:alternativeMPD:insert:2025) 和 Replacement (urn:mpeg:dash:event:alternativeMPD:replace:2025) 事件,并在Period.alternativeMpdEvents中将其公开为AlternativeMpdEvent实例。对于子类化DashManifestParser的应用,这是一项破坏性更改:DashManifestParser.buildPeriod现在会采用额外的List<AlternativeMpdEvent>参数,并且之前的重载已被移除。替换DashManifestParser.parseEventStream(XmlPullParser)的应用必须改为替换DashManifestParser.parseEventStream(XmlPullParser, String),因为前者已废弃,并将在未来的版本中设为 private。 - 将 CICP 颜色信息(
ColourPrimaries、TransferCharacteristics、MatrixCoefficients和VideoFullRangeFlag)从EssentialProperty和SupplementalProperty描述符解析为Format.colorInfo(#3426)。 - 支持在特技模式 (
http://dashif.org/guidelines/trickmode) 描述符@value属性中使用以空格分隔的@id值列表 (#3315)。 - 支持在
DashManifestParser中解析<ProducerReferenceTime>,在AdaptationSet.producerReferenceTimes中公开它,并使用它来填充 VOD 视频流的Timeline.Window.presentationStartTimeMs和Timeline.Window.windowStartTimeMs。 - 添加了对 DASH 内容控制的支持 (#1689)。
- 修复了在解析
<UTCTiming>元素中缺少属性的 DASH 清单时可能发生的NullPointerException(#3436)。
- 支持在
- RTSP 扩展程序:
- 修复了在 RTSP 客户端关闭后处理延迟的网络响应时发生的
IllegalStateException崩溃问题。 - 修复了快速拖动进度条可能会错误地触发 TCP 协议回退机制的问题。
- 修复了在 RTSP 客户端在曲目重新选择、会话拆解或 URI 重定向期间重置状态后,处理延迟的网络响应时可能发生的
IllegalStateException崩溃问题。 - 修复了在播放重启之前再次跳转可能会导致
IllegalStateException崩溃的问题。 - 修复了以下问题:在跳转操作已处于待处理状态时向后跳转可能会导致音频中断和视频播放卡顿。
- 修复了以下问题:以聚合或非 IDR 数据包结尾的 H.264 和 H.265 关键帧访问单元未被标记为关键帧,导致播放一直卡在缓冲状态 (#3434)。
- 修复了在 RTSP 客户端关闭后处理延迟的网络响应时发生的
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- Opus 扩展程序:修复了解码无效 Opus 数据时发生的 JNI 崩溃问题。
- Opus 扩展程序:修复了当预跳过和舍弃填充位于同一数据包时,舍弃填充被忽略的问题 (#2576)。
- Cast 扩展程序:
- 引入
SessionAvailabilityListener.SessionUnavailableReason来表示会话不可用的原因,并为SessionAvailabilityListener.onCastSessionUnavailable提供重载方法来公开该原因。 - 修复了停止投放会话后,播放会在本地意外恢复的问题。
- 当
RemoteMediaClient操作(例如播放、暂停、速度更改、循环模式、音量、静音或曲目选择)在RemoteCastPlayer中失败时,记录错误 (#3373)。 - 修复了在跳转操作处于待处理状态时,如果 Cast 接收器队列发生更改或缩减,
RemoteCastPlayer中会出现ArrayIndexOutOfBoundsException的问题 (#3372)。 - 修复了默认 Cast 接收器的一个问题:时间轴仅填充紧邻活动媒体文件周围的媒体文件,而不是整个播放列表 (#3129)。
- 在修改播放列表(
setMediaItems、addMediaItems、moveMediaItems、removeMediaItems)或在RemoteCastPlayer中跳转时,立即更新时间轴和播放位置,并将连续的播放列表操作加入队列,以便它们按顺序可靠地执行(#2639、#3272)。 - 修复了以下问题:在
RemoteCastPlayer中的空队列上调用addMediaItems无法在 Cast 接收器上加载媒体文件 (#2402)。 - 修复了
RemoteCastPlayer中的一个问题:到达 Cast 接收器队列末尾时,会清除时间轴,而不是保留播放列表。 - 修复了以下问题:在加载媒体内容之前(例如,在
CastPlayer中从本地播放切换到远程播放期间),在RemoteCastPlayer上设置的playWhenReady、repeatMode和playbackParameters未传输或应用 (#889)。
- 引入
- 演示版应用:
- 为会话演示应用目录添加了对受 DRM 保护的媒体文件和额外 HLS 示例串流的支持。
- 在会话演示应用中使用
CastTrackSelector配置RemoteCastPlayer,以便在投射时选择字幕和音轨。
- 移除了已废弃的符号:
- 移除了
DashUtil.buildDataSpec(Representation, RangedUri, int)和DashUtil.buildDataSpec(Representation, String, RangedUri, int)。请改用DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>)。
- 移除了
- build:
- 将 Gradle
minSdk提高到 24。
- 将 Gradle
版本 1.11.0
1.11.1
2026 年 9 月 10 日
- ExoPlayer:
- 将用于为渐进式媒体启用/停用 HAGC 元数据的标志从
MediaSource.Factory移至ExtractorsFactory。之前的setExperimentalEnableHagcPlayback方法已被移除,取而代之的是ExtractorsFactory.setParseHagcMetadata。此版本还解决了停用功能不适用于 Matroska/WebM 容器的问题。 - 修复了在预热非过渡辅助渲染程序时导致播放停滞的问题。
- 修复了以下预热问题:当跳转重置并停用两个渲染器时,
Surface应返回到主渲染器。 - 修复了以下问题:当直播时间轴刷新将默认位置移过当前正在播放的服务器端插入广告时,
ArrayIndexOutOfBoundsException会发生崩溃 (#3348)。 - 修复了拖动模式问题:在启用
ScrubbingModeParameters.allowSkippingMediaCodecFlush的情况下拖动进度条时,可能会短暂显示过时的视频帧。
- 将用于为渐进式媒体启用/停用 HAGC 元数据的标志从
- 提取器:
- Matroska:修复了以下问题:在集群后放置的轨道不会导致可跳转的时间轴 (#3377)。
- 音频:
- 会话:
- HLS 扩展程序:
- DASH 扩展程序:
- 修复了具有
presentationTimeOffset的图片轨道的错误样本时间戳计算问题 (#3334)。
- 修复了具有
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- Opus:修复了同时初始化多个
OpusDecoder实例时出现的内存损坏问题。 - MPEG-H:修复了向
MpeghUiManager发送命令时,在内存不足的情况下发生的内存泄漏、非 ASCII 字符截断和潜在的原生代码崩溃问题 (#3365)。
- Opus:修复了同时初始化多个
版本 1.11.0
2026 年 8 月 5 日
- 通用库:
- 添加
Format.channelMask以明确表示音频声道掩码,并添加新的Util.getAudioTrackChannelConfig(Format)重载以安全地解析它。 - 将 Kotlin 从 2.0.20 升级到 2.2.0。
- 添加
- ExoPlayer:
- 修复了可能导致 ExoPlayer 中出现
IllegalStateException或IndexOutOfBoundsException的时间相关并发 bug。 - 放宽
AdsMediaSource中的广告组数量检查,以便在广告组完全处理完毕(hasUnplayedAds()为false)时允许广告组数量减少,从而在重置工作流期间适应动态广告组大小调整。 - 将
getFlags()和FLAG_STRICT_DURATION添加到SampleStream,以允许数据流报告标记,并更新渲染程序以动态检查这些标记。 - 当数据流格式未提供有效值时,回退到
MediaCodecVideoRenderer中的帧速率估算器和MediaCodecAudioRenderer中的编解码器输出格式,以计算编解码器运行速率,并避免不必要的编解码器重置。 - 移除了核心播放器中客户端植入广告的内容剪辑。而是由
AdsMediaSource负责剪裁逻辑。 需要更新自定义客户端植入广告来源,以便在内部实现内容剪辑。 - 将具有格式正确但无法识别的编解码器配置文件或级别的轨道标记为
supported=NO_EXCEEDS_CAPABILITIES,而不是supported=YES(这是缺少配置文件或级别信息或配置文件或级别信息格式不正确的轨道的标记方式)。这样可以确保在有支持效果更好的替代轨道时,不会选择这些轨道(设备不太可能支持这些轨道)。 - 添加
DefaultPreloadManager.SimpleRankingDataComparator,这是一个RankingDataComparator,用于根据媒体文件与当前播放媒体文件的索引之间的距离来比较媒体文件的排名。如果需要更精细的比较逻辑,应用可以替换其compare(Integer, Integer)方法。可以通过DefaultPreloadManager.Builder的新构造函数注入自定义SimpleRankingDataComparator。 - 如果可用堆内存似乎不足,则回退到缓冲区字节大小限制,从而降低
DefaultLoadControl.prioritizeTimeOverSizeThresholds的 OOM 风险。 - 统一了未设置
MediaItem.imageDurationUs时静态图片的处理方式:JPEG 和 HEIC 静态图片现在会以非常短的默认时长“播放”(与 PNG 和其他图片之前的行为相同)。 - 添加
MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter)以将BandwidthMeter传递到MediaSource。不过,默认情况下,系统仍会调用具有自定义实现的已废弃方法,因此建议您实现新方法并使用BandwidthMeter.getTransferListener()来实现与旧方法等效的功能。 - 在
DefaultBandwidthMeter中,添加了对自定义InitialBitrateSupplier的支持。这样,应用就可以提供自己的逻辑来确定初始比特率估算值,该估算值将在创建DefaultBandwidthMeter以及网络类型发生变化时使用。可通过DefaultBandwidthMeter.Builder.setInitialBitrateSupplier()设置供应商。 - 默认启用动态调度。
ExoPlayer播放工作循环将动态运行,而不是按静态间隔运行。 - 移除了在将带有预卷样本的轨道加入到活跃播放时可能发生的不必要重置。
- 在
DefaultBandwidthMeter中,优化getInitialBitrateCountryGroupAssignment以返回打包到 32 位整数(而不是数组)中的国家/地区组分配,从而缩减代码大小并避免分配。 - 通过确保在其他重试(将缓冲区大小减半)不成功时,重试逻辑始终尝试至少 1 秒的缓冲区空间,修复了某些设备上的
AudioTrack初始化失败问题 (#3207)。 - 修复了某些设备上的编解码器问题:如果之前在收到输入缓冲区之前已刷新,编解码器会吞噬所有样本。
- 添加了实验性
ExoPlayer.Builder.enablePerStreamMediaProgression(),以便按数据流推进媒体处理。这可以减少播放列表项之间的启动延迟,并避免播放内容非常短时出现“卡顿”的情况 (#3122)。 - 修复了与音频会话 ID 使用相关的竞态条件,其中会使用由
ExoPlayer自动生成的初始音频会话 ID,而不是由setAudioSessionId设置的值 (#3241)。 - 为渐进式媒体(例如 MP4、Matroska)添加了实验性 HAGC (ST 2094-50) 定时元数据播放支持。播放器会自动将 HAGC 元数据轨道与关联的视频轨道合并,并在搭载 API 37+ 的设备上将元数据带外传递给解码器。此行为可通过
DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false)停用。 - 添加了
Format.selectionPriority,用于表示Format在轨道选择中的相对偏好 (#3236)。 - 修复了潜在的拖动模式问题:在拖动到“流末尾”时,拖动可能会停滞。
- 修复了可能导致 ExoPlayer 中出现
- CompositionPlayer:
- 修复了
TrackSelector实例未释放的问题。
- 修复了
- 转换器:
- 修复了
ExportResult.fileSizeBytes可能会被过度报告的问题。
- 修复了
- 轨道选择:
- 公开
BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR并添加AdaptiveTrackSelection.Factory.setTrackFormatComparator,以允许自定义格式排序和 ABR 选择优先级,而不仅仅是按比特率排序。 - 修复了与时间相关的并发问题,即快速连续更新轨道选择参数可能会导致某些更新丢失或被覆盖。
- 公开
- 提取器:
- MP4、MP3 和 FLAC:添加了
FLAG_DISABLE_ARTWORK_METADATA,以便在容器解析期间舍弃附加图片和封面图片元数据,从而减少运行时内存消耗 (#2077)。您也可以通过DefaultExtractorsFactory.setDisableArtworkMetadata集中启用此功能。 - MP4:添加了对提取 ITU-T T.35 (
it35) 定时元数据轨道的支持。 - MP4:添加了对提取章节元数据(Nero 和 QuickTime 格式)的支持。如果两者都存在,则首选 QuickTime 章节。提取的章节信息会作为
Chapter条目在轨道的Metadata中公开,从而允许在 MP4、M4A 和 M4B 文件(例如有声读物和播客)中进行原生章节导航 (#2803)。 - WAV、Matroska 和 MP4:添加了对 64 位浮点 PCM 音频的支持 (#3090)。
- Matroska:使用编解码器比特流元数据填充准确的
ColorInfo。 - MP4:添加了对在没有
sidx框时使用mfra框在分段 MP4 文件中进行跳转的支持。如需启用此功能,请向FragmentedMp4Extractor提供FLAG_READ_MFRA_FOR_SEEK_MAP,现在默认在DefaultExtractorsFactory中完成此操作 (#3088)。 - 忽略版本不受支持的
av1C数据。 - MP4:在
fpcm框中添加了对大端序浮点 PCM 的支持。 - Matroska:将章节信息解析为曲目
Metadata中的Chapter条目。 - MPEG-TS:通过将核心和扩展子流合并到单个样本中,改进了 DTS-HD 和 DTS Express 流的提取,修复了之前将两者作为单独样本输出时的播放问题 (#3147)。
- MP4:防止在解析空
ilst元数据标记项时出现无限循环和越界读取 (#3191)。 - MPEG-TS:确保为最后一个 PES 数据包长度已知的串流渲染最后一帧 (#3206)。
- MP3:修复了包含 Xing 和 VBRI 标头的文件比特率报告问题。
- Matroska:处理了在最后一个集群中定义的轨道 (#3250)。
- Matroska:添加了对 ALAC 的支持 (#3268)。
- MP4:允许在分段 MP4 文件中使用可变长度
sgpd框 (#3243)。 - AVI:修复了播放音轨上没有关键帧标志的文件会导致音频丢失和
OutOfMemoryError的问题。 - MP3:使用 Xing/Info 标头中支持无缝播放的时长 (#3183)。
- MP3:调整 LAME/Xing 编码器延迟和填充元数据,以匹配解码后的 PCM 剪裁 (#3200)。
- MP4、MP3 和 FLAC:添加了
- 音频:
- 在 ExoPlayer 的音频渲染器中,从就绪状态过渡到未就绪状态时,添加了 100 毫秒的宽限期,以消除瞬时欠载并避免在主动播放期间出现意外缓冲状态 (#3210)。
- 更改了
DefaultAudioTrackBufferSizeProvider中的默认 PCM 缓冲区大小逻辑,以使用固定的 500 毫秒缓冲区,从而减少对设备的依赖。 - 更新
MediaCodecAudioRenderer,以从平台解码器中提取空间 channelMask,从而允许DefaultAudioSink使用此显式掩码,而不是根据声道数推断掩码。 - 将
AudioSink.configure的参数转换为数据类。ForwardingAudioSink.configure的自定义替换项需要迁移到新的方法签名。 - 添加了对使用
EditedMediaItem.Builder#setSpeed(SpeedParameters)对音频串流进行时间拉伸时保持音高的支持。 - 增强了
ToFloatPcmAudioProcessor,以支持将 8 位 PCM、16 位大端序 PCM 和 64 位浮点 PCM 转换为 32 位浮点 PCM (#3090)。 - 将
DecoderAudioRenderer.getChannelMapping的返回值更改为ImmutableIntArray。 - 修复了在压缩分流模式下播放无缝音频播放列表时播放卡住的 bug。
- 将
Timeline和时间段 UID 转发到AudioSink.configure和AudioProcessor.StreamMetadata,以便向音频处理器提供播放列表上下文 (#418)。 - 设置正确的
AudioProcessor.StreamMetadata.positionOffsetUs以允许基于时间的音频处理 (#418)。 - 添加了对大端序 32 位和 64 位浮点 PCM 的支持。
- 移除了 EAC3-JOC 到 EAC3 的回退路径,以便在 Google Pixel 设备上播放,因为其标准 EAC3 解码器无法解码 EAC3-JOC 流 (#3257)。
- 视频:
- 修复了视频联接逻辑,以便将联接期间丢弃的缓冲区计为跳过,而不是丢弃。
- 修复了设置新 Surface 时的即时渲染决策,以避免在不支持占位 Surface 的设备上出现丢帧。
- 通过考虑丢弃或跳过的帧,修正
MediaCodecVideoRenderer中的帧速率估算,使其更加准确。 - 允许配置用于提前调度帧的阈值。默认值为 50 毫秒,但您可以通过
MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold()自定义该值。 - 修复了
VideoFrameReleaseHelper中的一个 bug,该 bug 导致显示更改可能会在主线程上触发冗余Choreographer回调和过多的 CPU 唤醒。
- 文本:
- 元数据:
- 添加
MediaMetadata.discSubtitle字段,并从 ID3v2.4TSST和 VorbisDISCSUBTITLE数据中解析该字段。 - 从 ID3
TPOS帧中解析光盘编号和数量。
- 添加
- 效果:
- 在刷新时清除
FinalShaderProgramWrapper中的重绘状态,以防止播放器在跳转时卡住。
- 在刷新时清除
- 多路复用器:
- 通过新的
addTrackReferenceAPI,在Mp4Muxer中添加了对轨道引用(tref框)的支持。这样就可以在轨道之间建立关系,例如将元数据轨道与其描述的视频轨道相关联。 - 添加
OggMuxer,以允许将OPUS或VORBIS媒体流多路复用到ogg文件格式中。 - 添加了
WavMuxer以生成 WAV 文件(支持整数和浮点 PCM)。 - 将
setAttemptStreamableOutputEnabled添加到InAppMp4Muxer.Factory,以便在没有预留空间的情况下写入较小的不可流式传输文件。 - 在
Mp4Muxer和FragmentedMp4Muxer中添加了对 IAMF 音频的支持。
- 通过新的
- IMA 扩展程序:
- 添加
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot,以允许提供用于暂停时广告的广告位。 - 修复了以下 bug:连续播放的可跳过 VAST 广告会在第二个广告上立即显示“跳过”按钮 (#3165)。
- 添加
- 会话:
- 修复了在将会话与后台线程播放器 Looper 搭配使用时,
MediaNotificationManager内部可能发生的死锁和IllegalStateException崩溃问题。 - 对
MediaSession方法强制执行更严格的线程要求。Void 方法现在会自动将执行发布到应用 Looper 线程,如果从应用 Looper 以外的线程调用状态访问器(getter),则会明确抛出IllegalStateException。 - 通过在会话端跟踪每个控制器的状态一致性,修复了越界时间轴合并崩溃问题(
MediaUtils.mergePlayerInfo中的IllegalStateException)。 - 添加了
androidx.media3.session.MediaSessionManager,以支持查询活跃媒体会话并返回 Media3SessionToken实例。 - 如果未替换该方法,则更改
MediaSession.Callback.onConnect的默认行为,以便仅向不受信任的控制器提供读取权限。 - 添加了对在通过新 API
MediaSession.Builder#setPackageNameOverride创建MediaSession时替换软件包名称的支持。调用方必须具有android.permission.OVERRIDE_MEDIA_SESSION_OWNER权限才能替换会话的软件包名称。 - 添加了
MediaSession.Callback.onConnectAsync()。新方法允许异步处理控制器的连接尝试。应用可以返回一个带有Futures.immediateFuture(ConnectionResult)的即时Future,以实现之前的行为。建议您改用新方法,因为Callback.onConnect可能会被弃用。 - 修复了蓝牙 AVRCP 浏览无法在 API 36 和 37 上识别
MediaLibraryService的问题。 - 修复了当图片大小接近平台限制时,
MediaSession中图片两次缩减的问题,从而解决了通知中的模糊问题 (#3134)。 - 修复了以下问题:当应用在后台运行时,异步封面图片位图加载回调尝试启动前台服务,导致
MediaNotificationManager中发生ForegroundServiceStartNotAllowedException崩溃 (#3270)。 - 修复了
MediaController接收的PositionInfo对象缺少其原始TimelineUID 的问题。现在,会话可在状态更新期间可靠地转换和传播这些 UID。 - 通过在
MediaSessionService.stopSelfSafely()中捕获ForegroundServiceStartNotAllowedException来修复崩溃问题 (#3310)。 - 修复了在同一媒体文件内跳转时,
MediaController上出现意外onMediaItemTransition()回调的问题 (#3248)。
- 修复了在将会话与后台线程播放器 Looper 搭配使用时,
- 界面:
- 修复了在播放过程中重组
ContentFrame时第一帧以错误大小呈现的问题 (#3238)。 - 将
CurrentMediaItemState类和相应的rememberCurrentMediaItemState可组合项添加到media3-ui-compose模块。此状态容器在demo-compose中用于显示有关当前播放的MediaItem的各种元数据信息。 - 将
PlaylistState类和对应的rememberPlaylistState可组合项添加到media3-ui-compose模块。此状态容器在demo-compose中用于显示有关在播放器上设置的MediaItems的各种元数据信息。 - 向
PlaybackSpeedState添加了快进/慢动作 API。在demo-compose中使用此功能,以展示长按快进。 - 将
MiniController可组合项添加到media3-ui-compose-material3模块。 它提供了一个紧凑的控件来控制Player,同时显示当前媒体文件的标题、音乐人、封面和进度。 - 将
ErrorState类和对应的rememberErrorState可组合项添加到media3-ui-compose模块。将ErrorText可组合项添加到media3-ui-compose-material3,并将其设为Player上的默认叠加层。 - 发布
PlayerDefaults对象,其中包含TopControls、CenterControls、BottomControls和ErrorOverlay的可组合项。 - 向
Player可组合项及其内容槽添加FocusRequester。 - 发布
PlayerPool(common-ktx) 和rememberPooledPlayer(ui-compose),以支持在滑动窗口界面环境中预加载MediaItems。使用新的ShortFormPlayerScreen在demo-compose中展示此功能。 - 修复了
PlayerView和 ComposePresentationState中的快门抑制 bug,该 bug 会导致在不支持时间段 UID 查找的时间轴上发生崩溃 (#3264)。
- 修复了在播放过程中重组
- 下载内容:
- 在提取媒体播放列表以供下载时,解析其中的 HLS 变量 (#3258)。
- Ktor 扩展程序:
- HLS 扩展程序:
- 添加了对 HLS 内容控制和路径克隆的支持 (#1689)。
- 向
HlsInterstitialsAdsLoader添加了setWithAssetListReset,以便应用将已完全处理的素材资源列表插页式广告重置回不可用状态,以便按需重新解析。 - 解析
EXT-X-STREAM-INF和EXT-X-I-FRAME-STREAM-INF的SCORE属性,并将其填充到Format.selectionPriority(#3236)。 - 修复了以下 bug:即使 HLS 播放列表不再是主要播放列表或活跃播放列表,系统仍会继续按计划刷新该播放列表 (#3254)。
- 修复了解析插页式广告素材资源列表时内容恢复偏移量的计算问题 (#3322)。
- 修复了在播放列表请求失败后恢复低延迟直播播放时,音频轨道时间戳意外不连续的问题 (#3311)。
- 修复了
HlsMediaPeriod.getStreamKeys()中的 bug,该 bug 会导致音频呈现中的 ID3 轨道被视为字幕 (#3333)。
- DASH 扩展程序:
- RTSP 扩展程序:
- 修复了在 RTSP 播放准备期间因 UDP 端口绑定错误而导致的暂时性播放卡顿或失败问题。
- Cast 扩展程序:
- 添加了新的
CastParams类,以便通过调用Cast.initialize(CastParams)来配置 Cast。 - 添加了新的
CastParams.getShowSystemOutputSwitcherOnCastIconClick()选项,该选项会在可用时触发使用 SystemUI 输出切换器,而不是应用内投放设备选择器。 - 添加了
MediaRouteButtonState和rememberMediaRouteButtonState,以支持观察媒体路线选择器的可见性状态,并向MediaRouteButton添加了state参数 (#3172)。 - 修复了以下 bug:
RemoteCastPlayer在选择轨道后可能会永久卡在轨道遮盖状态,导致其忽略来自 Cast 接收器的后续轨道更新 (#3237)。 - 修复了以下 bug:当尝试加入从非 Media3 发送器启动的投射会话时,
DefaultMediaItemConverter会抛出NullPointerException。 - 防止
CastPlayer在更改活跃播放器时传输无法播放的MediaItems(#3199)。 - 修复了未配置的直播 (
liveConfiguration == UNSET) 会作为STREAM_TYPE_BUFFERED排队的 bug (#3318)。
- 添加了新的
- 测试实用程序:
- 扩展
DataSourceContractTest,以支持带有标头和正文的POST请求,向HttpDataSourceTestEnv添加一些POST资源,并在WebServerDispatcher中为预期的 HTTP 方法、标头和正文添加断言。 - 在
DataSourceContractTest中收紧针对DataSource.open()返回的长度的断言。可能导致C.LENGTH_UNSET的资源应使用TestResource.Builder.setMayResolveToUnknownLength(boolean)指示这一点。 - 将
setPlaybackLooper添加到TestExoPlayerBuilder中。
- 扩展
- 移除了已废弃的符号:
- 移除了
androidx.media3.exoplayer.MetadataRetriever。改用androidx.media3.inspector.MetadataRetriever。 - 移除了
androidx.media3.exoplayer.MediaExtractorCompat。改用androidx.media3.inspector.MediaExtractorCompat。 - 移除了
Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA。请改用HeifExtractor从 HEIC 文件中提取动态照片元数据。 - 移除了
androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata。改用androidx.media3.extractor.metadata.MotionPhotoMetadata。 - 移除了
androidx.media3.extractor.DummyTrackOutput。改用androidx.media3.extractor.DiscardingTrackOutput。 - 移除了
androidx.media3.extractor.DummyExtractorOutput。改用androidx.media3.extractor.NoOpExtractorOutput。 - 移除了
androidx.media3.common.C.generateAudioSessionIdV21。改用androidx.media3.common.util.Util.generateAudioSessionId。
- 移除了
- build
- 更新了
README.md说明,以便在本地依赖 Media3 时使用 Gradle 复合 build (includeBuild)。core_settings.gradle脚本已被移除,androidxMediaModulePrefix和androidxMediaEnableMidiModule属性不再使用。
- 更新了
1.11.0-rc01
使用 1.11.0 稳定版。
1.11.0-beta01
2026 年 7 月 7 日
使用 1.11.0 稳定版。
1.11.0-alpha01
2026 年 6 月 24 日
使用 1.11.0 稳定版。
版本 1.10.0
1.10.1
2026 年 5 月 12 日
- 通用库:
- 修复了
SimpleBasePlayer和ForwardingSimpleBasePlayer中onAudioSessionIdChanged的处理方式。
- 修复了
- ExoPlayer:
- 轨道选择:
- 调整
VideoTrackInfo中的轨道选择逻辑,以解析后备 MIME 类型,并将 HDR 和编解码器评分偏好设置移至画质偏好设置 (#3135)。
- 调整
- 提取器:
- MP3:如果 Xing 数据长度大于已知数据流长度,则忽略 Xing 数据长度 (#3117)。
- 修复了以下问题:在设置了
FLAG_OMIT_TRACK_SAMPLE_TABLE且轨道缺少同步样本 (stss) 框时,Mp4Extractor中出现ArrayIndexOutOfBoundsException。
- 音频:
- 修复了以下 bug:如果向播放器添加了多个音频渲染器,音频事件可能会被错误地路由。
- 视频:
- 调整了在 API 级别低于 30 的设备上帧速率发生变化时编解码器重用的逻辑,以避免在没有益处的情况下重置编解码器 (#3120)。
- 针对 API 31+ 停用了
queueSecureInputBuffer中的强制同步解决方法。该解决方法是一个人为瓶颈,会强制解密串行运行,从而防止因 API 31 之前存在的框架问题而导致视频乱码。
- 图片:
- 修复了在拖动模式下,图片更新仅在用户“停止拖动”时才会生效的问题 (#2815)。
- 会话:
- 修复了以下 bug:如果应用线程不是主线程,
ForegroundServiceStartNotAllowedException不会跨线程边界传播 (#2499)。 - 修复了以下 bug:在连接到仅支持跳转到其他内容但不支持修改播放列表的平台专用会话时,
COMMAND_SEEK_TO_MEDIA_ITEM在MediaController中不可用。 - 修复了以下问题:
MediaController无法在不允许PREPARE_FROM操作的平台媒体会话中设置媒体文件。 - 修复了以下 bug:在 API 27 或更低版本上,通过平台控制器连接时,自己的进程未标记为
Controller.isTrusted()。
- 修复了以下 bug:如果应用线程不是主线程,
- HLS 扩展程序:
- DASH 扩展程序:
- 修复了在跳转到当前正在取消的块时
SampleQueue中发生崩溃的问题。
- 修复了在跳转到当前正在取消的块时
1.10.0
2026 年 3 月 26 日
- 通用库:
- 将
Player.mute()和Player.unmute()从UnstableApi升级为稳定版。 - 将
Format.pcmEncoding和C.PcmEncoding从UnstableApi升级为稳定版。 - 添加
Format.primaryTrackGroupId以标识嵌入式Format实例的主组 (#294)。
- 将
- ExoPlayer:
- 为
AdsMediaSource添加了剪辑功能。 - 在
MediaCodecVideoRenderer中添加了对动态调度的支持,以便更好地使调度工作和 CPU 唤醒周期与视频帧的处理时间保持一致。您可以使用DefaultRenderersFactory中的experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs()启用此功能。 - 允许在
DefaultPreloadManager.Builder中设置自定义DataSource.Factory。 - 通过将一些默认常量移至
ExoPlayer.Builder,允许在不使用 Robolectric 的情况下模拟ExoPlayer。通常不建议模拟此复杂接口,除非其使用场景极少、简单或偶然 (#2985)。- 这需要将
DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS从ExoPlayer移至ExoPlayer.Builder(不弃用)。
- 这需要将
- 修复了以下 bug:
ProgressiveMediaSource将过时的时间轴信息传播到播放器,导致已加入队列的时段意外被移除 (#3016)。 - 修复了以下问题:在通话期间请求播放时,ExoPlayer 不会请求延迟的音频焦点。
- 修复了从点播内容过渡到直播内容可能会导致在点播内容结束时重新缓冲的 bug (#3052)。
- 添加了对 Dolby Vision Profile 10 的支持 (#2830)。
- 修复了未初始化的前贴片广告会产生
ArrayIndexOutOfBoundsException的 bug (#3125)。
- 为
- CompositionPlayer:
- 添加了对
EditedMediaItem.removeVideo的支持。
- 添加了对
- 转换器:
EditedMediaItem.Builder.setFrameRate()现在可以为视频设置最大输出帧速率,这在使用setSpeed()提高媒体速度时特别有用。
- 轨道选择:
- 更改
DefaultTrackSelector.selectAllTracks的签名,以将输出数组作为形参包含在内,并预先填充轨道替换。 - 修复了以下问题:无论是否选择了相应的主轨道,都会选择嵌入式元数据轨道 (#294)。
- 稳定
preferredVideoLanguages、preferredVideoLabels、preferredAudioLabels、preferredTextLabels和selectTextByDefault的TrackSelectionParameters选项。
- 更改
- 提取器:
- MP4:支持在其他框(如
moov)之前具有大型uuid框的文件 (#3046)。 - MP4:添加了对 MP4 容器中多功能视频编码 (VVC) 轨道的支持。
- MP4:支持在其他框(如
- 检查器:
- 破坏性更改:移除了
FrameExtractor。用户现在应依赖于新的:media3-inspector-frame模块,并将导入更新为androidx.media3.inspector.frame.FrameExtractor。 - 引入了一个新模块,用于提取和处理解码后的视频帧。
- 破坏性更改:移除了
- 音频:
- 将 IAMF 解码器扩展程序的底层解码库从
libiamf更改为iamf_tools。 - IAMF 解码支持通过解码器(使用 IAMF 解码器扩展程序时)或通过 Android Spatializer 实现双耳输出。
- 在汽车场景中评估 AC-4 解码器支持时,正确移除对
AC4Profile22和其他旧版配置文件的支持 (#2609)。 - 改进了
DefaultAudioSink中AudioOutput初始化的重试逻辑 (#2905)。 - 在解码 IAMF 时,尝试匹配扬声器(或空间化器,如果适用)的输出布局,同时使用 IAMF 扩展程序和媒体编解码器解码器,并由 AudioCapabilities 和 AudioCapabilitiesReceiver 中的新字段和逻辑提供支持。
- 修复了在压缩分流模式下播放无缝音频播放列表时播放卡住的 bug。
- 将 IAMF 解码器扩展程序的底层解码库从
- 文本:
- VobSub:使用
START和STOPSPU 控制命令来推导提示时长,而不是始终默认为 5 秒 (#2935)。
- VobSub:使用
- 元数据:
- 将元数据渲染程序的默认数量增加到 4 个,以涵盖 HLS 变体和演绎版本发布的所有潜在元数据轨道 (#3043)。
- 效果:
- 将
LottieOverlay移至新的:media3-effect-lottie模块(其中还涉及将其从androidx.media3.effect.LottieOverlay重命名为androidx.media3.effect.lottie.LottieOverlay)。
- 将
- 效果 Lottie:
- 引入了新的
:media3-effect-lottie模块,该模块提供了将 Lottie 效果应用于视频帧的功能。
- 引入了新的
- IMA 扩展程序:
- 将 IMA SDK 版本更新至 3.39.0,以便使用最新的广告媒体信息 API。
- 修复了广告 MIME 类型与 IMA LOADED 事件中提供的 MIME 类型不匹配的 bug。现在,此修复会使用 IMA 提供的广告媒体信息来映射广告 MIME 类型。
- 向
ImaAdsLoader和ImaServerSideAdInsertionMediaSource添加了setEnableCustomTabs,让用户可以控制是否使用自定义标签页启动广告点击后到达网址。 - 添加
ImaAdTagUriBuilder,该类提供了另一种构造adTagUri的方法。它包含setPreferredLinearOrientationAPI。这是一个处于 Alpha 版测试阶段的 API,可让您设置线性广告的首选屏幕方向。如果您想加入 Alpha 版测试群组,请与您的客户合作伙伴联系。
- 会话:
- 修复了
MediaMetadata.artworkData中的大型数组可能导致应用崩溃的 bug。 - 在
ActionFactory接口中对@Player.Command参数使用 int 类型 (#2933)。 - 将
MediaSessionService和MediaLibraryService设为LifecycleService,以便将生命周期感知型操作附加到服务的生命周期 (#187)。 - 停止支持通过
MediaController和MediaBrowser发出的设备音量更改命令,以进行本地播放。应用不应更改本地设备音量,如果需要,可以使用AudioManagerAPI 来实现此目的。 - 检测将服务作为前台服务启动的过时
Intent实例。这样可以防止系统抛出ForegroundServiceDidNotStartInTimeException。对于实现自定义MediaNotification.Provider的应用,这是一项针对不稳定 API 的破坏性更改,因为其中包含一个必需的新方法。 - 添加了用于主屏幕 widget 的
PendingIntent实例的构建器 (#2933)。 - 添加了用于为基于 Compose 的主屏幕微件创建
Intent实例的静态方法 (#2933)。 - 修复了以下 bug:当播放从给定媒体文件索引过渡到具有相同媒体文件的另一个索引时,由于不连续性原因“AUTO”和“SEEK”,媒体文件过渡未报告给控制器 (#2997)。
- 修复了以下问题:系统界面按钮放置权宜解决方法会对其他界面(例如 Android Auto 或不需要该权宜解决方法的制造商)产生负面影响 (#3041)。
- 修复了订阅访问权限未同步的问题 (#3056)。
- 针对 API 29 上的 SysUI bug 提供了权宜解决方法,该 bug 会导致特定大小的媒体会话封面图片使 SysUI 崩溃并强制设备重启 (#3118)。
- 修复了 Android Q 上的通知封面图标缩放问题 (#3084)。
- 修复了
- 界面:
- 将
PlaybackSpeedControl可组合项添加到media3-ui-compose,以显示和修改播放速度。 - 向
media3-ui-compose-material3添加PlaybackSpeedToggleButton可组合项,以控制播放速度。 - 向
media3-ui-compose-material3添加了ProgressSlider可组合项,用于显示播放器进度以及通过拖动和点按执行跳转 (#2288)。 - 避免在为 PlayerControlView 添加动画效果时使用大型屏幕外缓冲区。
- 向
media3-ui-compose-material3添加了Player可组合项,该可组合项将ContentFrame与可自定义的控件相结合,这些控件可与顶部、中心和底部对齐。 - 向无障碍服务隐藏播放位置,以防止在
PlayerControlView可见时持续更新通知。
- 将
- HLS 扩展程序:
- DASH 扩展程序:
- RTSP 扩展程序:
- 修复了 H.264 和 H.265 流式传输中的回归问题,该问题会导致错误地解析跨多个 RTP 数据包的同一访问单元的样本。 这会导致视频中出现视觉伪影和损坏 (#3121)。
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- 为 MPEG-H 解码器扩展程序添加了 MPEG-H 界面管理器支持 (#3066)。
- Cast 扩展程序:
- 添加了
RemoteCastPlayer.Builder#setTrackSelector方法,用于实现 Cast 播放的轨道选择。
- 添加了
- 移除了已废弃的符号:
- 移除了
ExperimentalFrameExtractor。改用androidx.media3.inspector.frame.FrameExtractor。 - 移除了
ChannelMixingMatrix.create()。改用ChannelMixingMatrix.createForConstantGain()。 - 移除了
androidx.media3.extractor.metadata.flac.VorbisComment。改用androidx.media3.extractor.metadata.vorbis.VorbisComment。 - 移除
MediaSource.prepareSource(MediaSourceCaller, TransferListener)。 请改用MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId)。
- 移除了
1.10.0-rc03
2026 年 3 月 25 日
使用 1.10.0 稳定版。
1.10.0-rc02
2026 年 3 月 16 日
使用 1.10.0 稳定版。
1.10.0-rc01
2026 年 3 月 10 日
使用 1.10.0 稳定版。
1.10.0-beta01
2026 年 2 月 25 日
使用 1.10.0 稳定版。
1.10.0-alpha01
2026 年 2 月 6 日
使用 1.10.0 稳定版。
版本 1.9.0
1.9.4
2026 年 5 月 16 日
版本 1.9.4 包含以下提交内容。
- 效果:
- 从无 surface 上下文转换时,明确设置
GL_DRAW_BUFFER和GL_READ_BUFFER。
- 从无 surface 上下文转换时,明确设置
1.9.3
2026 年 3 月 16 日
- 音频:
- 修复了在压缩分流模式下播放无缝音频播放列表时播放卡住的 bug。
1.9.2
2026 年 2 月 6 日
版本 1.9.2 包含以下提交内容。
- ExoPlayer:
- 修复了以下 bug:
ProgressiveMediaSource将过时的时间轴信息传播到播放器,导致已加入队列的时段意外被移除 (#3016)。
- 修复了以下 bug:
- 会话:
- 修复了以下问题:系统界面按钮放置权宜解决方法会对其他界面(例如 Android Auto 或不需要该权宜解决方法的制造商)产生负面影响 (#3041)。
- Cast 扩展程序:
- 修复了从投屏切换到本地播放时出现故障的 bug。
1.9.1
2026 年 1 月 26 日
版本 1.9.1 包含这些提交内容。
- 通用库:
- 支持时区偏移量中仅包含小时的日期时间字符串 (#2929)。
- ExoPlayer:
- 仅在音频开始后,才允许动态调度减慢
doSomeWork间隔,以便在播放开始时支持更流畅的 A/V 同步。 - 修复了
DefaultLoadErrorHandlingPolicy中的 bug,该 bug 会导致FileNotFoundException和类似异常类型被重试多次。 - 修复了动态调度中的一个 bug,该 bug 会导致下一次
doSomeWork的计算时间被错误地缩短了当前doSomeWork迭代的经过时间。解决此问题有望延长 CPU 空闲时间并节省电量。 - 修复了在尝试使用后备 AVC 或 HEVC 编解码器时,杜比视界文件无法播放的问题。
- 修复了以下问题:从播放列表中移除当前播放的内容时,播放结束后仍会继续加载 (#2873)。
- 避免在同一项上重复使用
ExoPlayer.replaceMediaItem时泄露MediaItem实例 (#2993)。 - 防止因紧急唤醒锁定释放而导致潜在 ANR (#2979)。
- 仅在音频开始后,才允许动态调度减慢
- 提取器:
- MP3:解析 LAME ReplayGain 数据 (#2840)。
- 音频:
- 在汽车场景中评估 AC-4 解码器支持时,正确移除对
AC4Profile22和其他旧版配置文件的支持 (#2609)。
- 在汽车场景中评估 AC-4 解码器支持时,正确移除对
- 视频:
- 在 API 级别低于 30 的设备上,当内容帧速率发生变化时,丢弃视频编解码器,以避免播放卡顿 (#2941)。
- 文本:
- VobSub:通过正确处理仅包含单个控制序列或关键信息分散在多个控制序列中的 SPU,修复了一些字幕缺失的问题 (#2935)。
- IMA 扩展程序:
- 问题修复:修正了广告 MIME 类型与 IMA LOADED 事件中提供的 MIME 类型不匹配的问题。现在,该修复程序会使用广告连播索引和广告排名来映射广告 MIME 类型。
- 在访问
getAdsManager()和AdEvent.getAd()的结果之前添加了 null 检查。
- 会话:
- 修复了以下 bug:如果停止操作发生在广告播放期间,则停止连接到平台会话的
MediaController会导致应用崩溃 (#2948)。 - 在各种类中对
extrasBundle实例添加了额外的验证,以防范从其他进程发送的格式错误的Bundle实例。 - 修复了以下问题:缺少
COMMAND_SEEK_NEXT或COMMAND_SEEK_BACK的命令可能会导致系统媒体通知中出现间隙 (#2976)。 - 将通知图标的位图缩放移出主线程 (#2829)。
- 修复了从旧版
MediaMetadataCompat和MediaDescriptionCompat转换时,作者、撰稿人和作曲家未用作后备的 bug (#3018)。
- 修复了以下 bug:如果停止操作发生在广告播放期间,则停止连接到平台会话的
- 下载内容:
- 修复了
SegmentDownloader处理PriorityTooLowException时可能出现的无限循环问题(对于 DASH、HLS 和 SmoothStreaming)。使用受保护的execute方法对SegmentDownloader进行自定义替换时,需要提供封装在Supplier中的任务,以便重新创建该任务 (#2931)。
- 修复了
- HLS 扩展程序:
- 将原始资产列表 JSON 文档传递给
Listener.onAssetListLoadCompleted回调。这是不稳定 API 中的一项破坏性更改,需要实现此回调的应用添加JSONObject类型的额外参数 (#2950)。
- 将原始资产列表 JSON 文档传递给
- RTSP 扩展程序:
- 正确处理具有回绕时间戳的 RTP 数据包 (#2930)。
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- 修复了在处理第一帧视频之前进行跳转时可能发生的潜在
NullPointerException(#2965)。
- 修复了在处理第一帧视频之前进行跳转时可能发生的潜在
- Cast 扩展程序:
- 修复了在替换播放列表时导致
RemoteCastPlayer时间轴无法正确更新的 bug。
- 修复了在替换播放列表时导致
1.9.0
2025 年 12 月 17 日
- 通用库:
- 将
minSdk更新为23,以便与其他 AndroidX 库保持一致。 - 添加了
PlayerTransferState,以便在Player实例之间传输播放状态。 - 向 Player 添加
void mute()和void unmute()方法,以便在将 Player 的音量设置为零之前和之后保留并恢复其音量。 - 发布之前由
ExoPlayer在内部使用的实用程序类WakeLockManager、WifiLockManager、AudioFocusManager、AudioBecomingNoisyManager和StuckPlayerDetector,以便其他播放器重复使用 (#1893)。 - 修复了底层委托播放器使用引用相等性比较监听器实例时的
ForwardingPlayer监听器处理问题 (#2675)。 - 在
media3-common-ktx库中添加一个Player.listenTo挂起扩展函数,用于指定应执行操作的特定Player.Events。 - 修复了
BasePlayer.getBufferedPercentage中因整数溢出而导致的崩溃问题,该问题会在报告的缓冲位置远大于报告的时长时发生 (#2750)。 - 修复了
TrackGroup轨道类型的自动检测问题,方法是不忽略自定义样本 MIME 类型,并回退到使用容器 MIME 类型中可能错误的轨道类型 (#2860)。
- 将
- ExoPlayer:
- 添加卡顿播放器检测功能,如果播放器似乎卡顿,则会触发
StuckPlayerException播放器错误。在以下情况下会发生这种情况,如有需要,可在ExoPlayer.Builder中配置每个默认超时:- 尝试播放 10 分钟后出现
STATE_BUFFERING,且没有缓冲进度。 - 尝试播放 10 秒后,
STATE_READY仍未开始播放。 STATE_READY超出声明时长 1 分钟后,仍未到达内容结尾。- 在尝试播放时,播放抑制原因持续了 10 分钟。
- 尝试播放 10 分钟后出现
- 默认启用唤醒锁定处理,以解决后台播放期间的缓冲问题。这相当于将
ExoPlayer.Builder.setWakeMode设置为C.WAKE_MODE_LOCAL。 - 添加监听逻辑,以便在向最初传递给
ExoPlayer.Builder的Context报告更改时自动更新虚拟设备 ID。 - 添加
ExoPlayer.setVirtualDeviceId,以手动更新从传递给ExoPlayer.Builder的Context获取的虚拟设备 ID。 - 确保渲染程序在当前内容结束前 10 秒内不会使用下一个播放列表内容的数据。
- 向
ExoPlayer添加了setSeekBackIncrementMs、setSeekForwardIncrementMs和setMaxSeekToPreviousPositionMs,以便在构建后更新这些设置 (#2736)。 - 在
DefaultPreloadManager中添加预缓存功能。应用现在可以通过TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)返回DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)或DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs),以指示需要预缓存媒体文件。 - 在短视频演示应用中使用
DefaultPreloadManager的预缓存功能。 - 为本地播放添加
DefaultLoadControl.Buildersetter,并调整DefaultLoadControl的默认值,以便与各种本地文件完美配合。 - 修复了以下 bug:设置空播放列表可能会使播放器处于
STATE_READY或STATE_BUFFERING状态。 - 增强了预加载管理器 API:
- 添加
addMediaItems(List<MediaItem>, List<T>)和addMediaSources(List<MediaSource>, List<T>),以便批量添加媒体内容或媒体来源,并在之后自动调用invalidate()。 - 添加
removeMediaItems((List<MediaItem>)和removeMediaSources(List<MediaSource>),以批量移除媒体文件或媒体源,并确保预加载管理器在移除后不会开始预加载或继续预加载其中任何一项。 - 允许
DefaultPreloadManager.setCurrentPlayingIndex(int)自动失效。在更新当前播放索引后,应用不再需要显式调用invalidate()。
- 添加
- 添加了在拖动模式下跳过同一组图片中向前跳转的关键帧重置的功能。
- 添加了
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int),以便应用为具有指定playerName的播放器设置目标缓冲区字节值。现在,DefaultLoadControl可以根据自身分配的字节数和目标缓冲区字节数,分别为每个播放器做出决策。 - 将
SkipInfo添加到AdPlaybackState.AdGroup,以传递广告组中每个广告的跳过信息。 - 修复了在播放后贴片广告期间调用
removeMediaItems(List)会导致崩溃的 bug (#2746)。 - 修复了播放列表播放中的一些卡顿问题,这些问题是由于帧被错误地始终设置为最后一个样本并进行渲染而导致的。
- 如果播放器无法生成音频会话 ID,则启用重试路径 (#2382、#2678)。
- 添加了对控制
DefaultPreloadManager中来源的总缓冲区字节数的支持,以避免预加载的总缓冲区字节数任意增长。如需使用默认控制逻辑,应用可以通过DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)为PlayerId.Preload.name(“预加载”)的playerName设置预加载的目标缓冲区字节数,并通过DefaultPreloadManager.Builder.setLoadControl(LoadControl)注入创建的DefaultLoadControl。 - 向
ShuffleOrder添加了具有默认实现的cloneAndSet(int, int)(#2834)。 - 在跳转调整或自动转换后跳过广告播放时,附加内容恢复偏移量 (#2484)。
- 添加了用于设置和观察音频和视频轨道编解码器参数的 API。
此功能是针对基于
MediaCodec的渲染程序实现的,需要 API 29 或更高级别。- 使用
ExoPlayer.setAudioCodecParameters()和ExoPlayer.setVideoCodecParameters()应用参数。 - 使用
ExoPlayer.addAudioCodecParametersChangeListener()和ExoPlayer.addVideoCodecParametersChangeListener()监听更改。观察供应商专用键需要 API 31+。
- 使用
- 修复了以下问题:在跳转到非零位置,然后使用非空媒体源准备播放器后,设置空媒体源会导致
IllegalStateException。 - 修复了在拖动模式下跳转到其他媒体文件可能会导致
IllegalStateException的 bug。 - 修复了
DefaultPlaybackSessionManager中潜在的NullPointerException(#2885)。 - 为符合条件的视频启用快进/快退性能改进。
- 在 API 36+ 上重新启用 MediaCodec 中的异步解密功能,此平台 API 的超时问题已得到修复 (#1641)。
- 将
MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs的默认值更改为 15 毫秒,并针对符合条件的视频,在解码前更高效地丢弃视频帧。 - 在
DefaultLoadControl中为自动内存计算添加了内存上限。这应该只在选择了过多轨道时生效 (#2860)。 - 修复了以下 bug:在播放列表或循环播放模式下播放时,在拖动模式下快进到接近结尾的位置可能会导致快进到下一个媒体文件。
- 添加卡顿播放器检测功能,如果播放器似乎卡顿,则会触发
- CompositionPlayer:
- 在新的
@ExperimentalApi注解下发布CompositionPlayer,以表明它可用于实验,但仍处于开发阶段。某些 API 可能会在未来版本中发生重大变化,并且某些用例存在已知问题和限制(有些未记录)。 - 在
CompositionPlayer中添加了对COMMAND_SET_AUDIO_ATTRIBUTES和音频焦点处理的支持。 - 在
CompositionPlayer中添加了对次要序列中速度变化的支持。 - 添加了对
EditedMediaItem.removeVideo的支持。
- 在新的
- 转换器:
- 使用
InAppMp4Muxer作为默认多路复用器。 - 添加
EditedMediaItem.Builder#setSpeed()并弃用Effects#createExperimentalSpeedChangingEffects()。 - 将
EditedMediaItemSequence中的forceAudioTrack和forceVideoTrack替换为trackTypes。
- 使用
- 轨道选择:
- 添加
TrackSelectionParameters.selectTextByDefault可优先选择任何文本轨道,而无需指定其他更具体的偏好设置。 - 在
TrackSelectionParameters中添加了preferredVideoLabels、preferredAudioLabels和preferredTextLabels,用于指定对具有特定标签的曲目的偏好,例如从 HLS NAME 标记中读取的曲目 (#1666)。
- 添加
- 提取器:
- FLAC:加强文件头检测,以减少在编码的 FLAC 数据中发现虚假文件头的几率,从而避免解码错误 (#558)。
- MP3:允许在 MP3 文件开头的 ID3 标记之间(和之前)存在间隙(#811、#5718)。
- MP3:将嗅探限制提高到 128kB,以匹配同步字节的现有搜索限制 (#2713)。
- MP3:更改了
FLAG_ENABLE_INDEX_SEEKING,以便在可用时优先从元数据标头(如 Xing 和 VBRI)中查找信息,如果没有其他查找信息,则回退到基于索引的查找。这可以提高具有跳转元数据的文件性能 (#2839)。 - MP3:更改
Mp3Extractor,使其在未找到跳转元数据(例如 Xing、VBRI)时默认采用恒定比特率 (CBR) 假设,即使设置了FLAG_ENABLE_INDEX_SEEKING也是如此。这是基于 MP3 规范历史记录,其中 CBR 是标准,而 VBR 需要显式标头。这提高了没有元数据的文件立即跳转到指定位置的能力,但可能会影响缺少标头的 VBR 文件的准确性。如果 CBR 假设不可跳转(例如,对于未知长度的串流),现在会将索引跳转用作后备 (#2848)。 - MP4:在从提取器发出轨道格式之前,通过查看第一个样本的层值,消除
audio/mpeg(MP3)、audio/mpeg-L1和audio/mpeg-L2MIME 类型之间的歧义 (#2683)。 - MP4:通过假设大于 1MB 的
stbl框意味着文件必须是非分段的,从而提高超大文件的嗅探效率 (#2650)。 - MP4:添加了对
©mvn(乐章名称)和©mvi(乐章索引)元数据的支持,这些元数据现在会作为TextInformationFrame对象在Format.metadata中发出,其 ID 分别为MVNM和MVIN(#2754)。 - MP4:忽略缺少
stsd框的轨道(而不是无法解析整个文件)。 - Matroska:添加了对 DTS-HD 检测的支持 (#6225)。
- 修复了
MatroskaExtractor中的一个问题,该问题会导致对具有多个曲目的文件进行跳转时可能不准确。提示点现在可以正确地与其各自的曲目相关联,从而实现更精确的跳转。 - MPEG-TS:修复了由不含时间戳的 PES 数据包导致的
ReorderingBufferQueue中的IllegalArgumentException(#2764)。 - 添加了对提取 HEIC 动态照片的支持。
HeifExtractor现在可以解析包含嵌入式视频和音频轨道的 HEIC 文件。
- 检查器:
- 引入了新的
:media3-inspector模块,作为媒体检查实用程序的专用位置。此模块现在包含一个新的androidx.media3.inspector.MetadataRetriever,它将为元数据和帧提取提供统一的 API。现有的androidx.media3.exoplayer.MetadataRetriever现已弃用,取而代之的是这个新版本。 - 引入了
androidx.media3.inspector.FrameExtractor,这是一个用于帧提取的新公共 API。此AutoCloseable类提供了一种提取帧的方法,支持 HDR 视频、视频效果和自定义解码器选择。应通过其Builder为特定MediaItem创建。 - FrameExtractor:添加了
getThumbnail(),用于从媒体文件中提取代表性的缩略图帧,而无需指定时间戳。 - 添加了
androidx.media3.inspector.MediaExtractorCompat,它是平台android.media.MediaExtractor的直接替代项,提供了一种从媒体文件中提取原始编码媒体样本的方法。 现有的androidx.media3.exoplayer.MediaExtractorCompat现已废弃,取而代之的是这个新类。
- 引入了新的
- 音频:
- 让
AudioProcessor实例感知到跳转。 - 允许将新的
AudioOutputProvider接口注入DefaultAudioSink.Builder,以支持自定义音频输出路径。默认值为AudioTrackAudioOutputProvider。 - 处理
GainProcessor中的跳转。 - 在轨道格式支持评估中利用 AC-4 解码器配置文件和级别功能 (#2580)。
- 避免在播放开始时处理路由更改回调而导致潜在延迟 (#2646)。
- 允许对 EAC3、EAC3-JOC 和 AC-4 格式重复使用编解码器 (#1346)。
- 在
Sonic中添加了对浮点 PCM 样本的支持。 - 在
ToFloatPcmAudioProcessor中添加了对 16 位 PCM 样本的支持。
- 让
- 视频:
- 针对具有不同配置文件的杜比视界内容停用编解码器重复使用。
- 重新启用针对安全编解码器错误报告的性能点的权宜解决方法 (#2856)。
- 文本:
- 修复了 Dolby Vision 内容中 CEA-6/708 字幕的解析问题 (#2775)。
- 图片:
- 修复了 ScrubbingMode 问题:播放器在拖动 DASH 缩略图轨道时卡住 (#2815)。
- DRM:
- 将
MediaDrmCallback方法的返回值类型从byte[]更改为新的MediaDrmCallback.Response类型,以便返回额外的可选信息。这是一项源代码破坏性更改,但只需在返回之前使用new Response封装之前的byte[]返回值,即可轻松解决破坏问题。 - 向
AnalyticsListener.onDrmKeysLoaded添加了网址和延迟时间等密钥请求信息 (#1001)。 - 将配置请求数据从网址参数移至 POST 正文。
- 将
- 效果:
- 添加了
Presentation.copyWithUnsetSideRoundedTo,以便在创建Presentation时,如果只指定了一个边长,则对未设置的输出边长进行四舍五入。
- 添加了
- 多路复用器:
- 添加了
MediaMuxerCompat,可直接替代框架MediaMuxer。 - 添加了
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo()以允许创建动态照片。 - 添加
WebmMuxer,以便将OPUS、VORBIS、VP8和VP9媒体流多路复用到webm文件格式中。
- 添加了
- IMA 扩展程序:
- 移除了自定义 ProGuard 规则,以便应用可以改用 IMA Android 归档中发布的规则。
- 添加了
ImaServerSideAdInsertionUriBuilder.setNetworkCode,这是一个新 API,用于设置 Google Ad Manager 广告资源网代码,以便 IMA SDK 按照 Google Ad Manager 设置中的指定方式处理广告标识符。对于全方位服务直播请求,网络代码是可选的,但建议提供。如需查找广告资源网代码,请参阅这篇文章。 - 将 IMA 依赖项提升至 3.37.0,这需要启用核心库脱糖。依赖应用也必须启用此功能。请参阅 IMA 的配置说明。 * 在 SSAI URI 构建器中支持 IMA DAI 自定义界面选项。服务器端广告插播的自定义界面选项包括“可跳过”和“关于此广告”呈现支持。此功能目前仅面向列入许可名单的部分发布商提供。此更改还会将 IMA SDK 版本升级到 3.38.0(版本说明),以便访问自定义界面选项 API。
- 修复了以下问题:广告后内容的准备错误会被错误地报告为广告播放错误 (#2656)。
- 会话:
- 向
MediaSession.Callback.onPlaybackResumption添加了新参数,用于指示调用是仅用于收集信息还是用于开始播放 (#1764)。 - 更新了
MediaSession.ControllerInfo.isTrusted,以便将来自应用本身的控制器也声明为可信 (#2542)。 - 添加了
MediaSessionService.triggerNotificationUpdate以手动触发通知更新 (#1833)。 - 向自定义命令方法添加
ProgressListener。 - 将
MediaLibrarySession.Builder.setLibraryErrorReplicationMode的默认值更改为非严重。 - 向
MediaButtonReceiver.onForegroundServiceStartNotAllowedException添加了Context参数 (#2625)。 - 从平台
PlaybackInfo读取音量控制 ID,而不是通过 binder 提取。这可确保播放类型和音量控制 ID 以原子方式读取,并且彼此匹配。 - 修复了以下 bug:
ACTION_UP按键事件在传递给回调进行自定义处理之前被过滤掉。这使得该库与 media1 和平台的功能保持一致 (#2637)。 - 修复了即使命令不可用,
PlayerWrapper也会调用getCurrentTimeline()的 bug (#2665)。 - 修复了以下 bug:主 Looper 的消息队列中留有一条消息,导致服务终止后发生内存泄漏 (#2692)。
- 连接到具有
MediaBrowser的旧版会话应用时,只有在自定义操作在旧版会话的PlaybackStateCompat中作为自定义操作进行通告时,自定义命令才会发送到会话。所有其他自定义操作都会发送到服务。 - 实现了
onAudioSessionIdChanged,以便在会话设置音频会话 ID 时通知媒体控制器 (#244)。 - 修复了以下 bug:
KEYCODE_HEADSETHOOK未在媒体键事件Intent到达onStartCommand()时启动播放器。此问题已通过像处理KEYCODE_MEDIA_PLAY_PAUSE一样处理“KEYCODE_HEADSETHOOK”得到解决 (#2816)。 - 修复了以下 bug:Surface 大小未在会话和控制器之间传递,导致无法在 demo-session 中应用视频效果。如果您使用的是控制器,并且播放器无法处理
setVideoSurfaceHolder调用,这可能会是一项破坏性更改。 - 修复了非
StringCharSequence元数据值(例如 span 样式的字符串)的传播问题 (#2853)。 - 添加
CommandButton.executeAction,以便控制器可以更轻松地触发预期操作。此外,还允许为某些播放器和会话命令指定参数,以定义要触发的操作。 - 为使用
Player.Command或非自定义SessionCommand定义其操作的CommandButton实例添加向后兼容性。现在,这些内容会在平台媒体会话(例如系统界面或 Android Auto)中正确呈现。 - 修复了在将
MediaController连接到平台媒体会话时,同一Bitmap会被多次压缩的问题。
- 向
- 界面:
- 将
ProgressStateWithTickInterval类和相应的rememberProgressStateWithTickInterval可组合项添加到media3-ui-compose模块。此状态容器在demo-compose中用于以文本形式显示当前位置和时长。 - 向
ui-compose添加MuteButtonState,用于处理Player音量的静音。此状态容器在demo-compose中用于显示静音/取消静音切换按钮。 - 将
ProgressStateWithTickCount类和相应的rememberProgressStateWithTickCount可组合项添加到media3-ui-compose模块。此状态容器在demo-compose中用于以水平只读进度条的形式显示进度。 - 向
media3-ui-compose添加了ContentFrame可组合项,该可组合项将PlayerSurface管理与宽高比调整和快门遮盖相结合。 - 解决了一个已知的 API 34 平台 bug,该 bug 会导致在 Compose
AndroidView中使用SurfaceView时视频被拉伸/剪裁,从而影响具有SURFACE_TYPE_SURFACE_VIEW的ContentFrame和PlayerSurface可组合项(#1237、#2811)。 - 创建一个新的
media3-ui-compose-material3模块,并向其中添加 Material3 主题的可组合项(PlayPauseButton、NextButton、PreviousButton、SeekBackButton、SeekForwardButton、RepeatButton、ShuffleButton、MuteButton)。 - 将
TimeText可组合项添加到media3-ui-compose-material3,以文本形式显示玩家进度。可以将其配置为显示当前位置、时长或剩余时间。 - 添加了对在
PlayerView中放置媒体路线按钮的支持。 - 使用
BidiFormatter在 RTL 文本字幕中正确显示标点符号 (#11214)。
- 将
- HLS 扩展程序:
- 解析 HLS 插页式广告跳过属性。
- 将 HLS 播放列表和素材资源列表文档中的跳过控制属性映射到
AdPlaybackState,以便公开访问。 - 修复了以下 bug:从播放列表中移除定义开始时间的 EXT-X-PROGRAM-START-DATE 标记时,播放列表的开始时间会被丢弃 (#2760)。
- 使用二分查找来查找播放列表中给定位置的片段索引 (#2826)。
- 添加了
HlsInterstitialsAdsLoader.skipCurrentAd()和skipCurrentAdGroup()以及相应的方法,以便按索引跳过广告和广告组。 - 添加了
HlsInterstitialsAdsLoader.Listener.onAdStarted以报告广告时段的开始 (#2859)。 - 在 ISO 8601 日期时间字符串中接受空格作为日期/时间分隔符。
- 正确处理为没有片段的
HlsMediaPlaylist提取下一个分块的操作 (#2821)。 - 为直播中的前贴片广告使用默认开始位置。
- DASH 扩展程序:
- RTSP 扩展程序:
- 处理 H264 和 H265 的碎片化 NAL 单元时,处理 RTP 数据包缺失错误 (#2613)。
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- AV1 扩展程序:AV1 软件解码器现在使用高性能
dav1d库,取代了之前的libgav1实现,从而提高了 A/V 解码速度。 - FFmpeg 扩展程序:通过确保正确解析
STREAMINFO块并将其传递给解码器,修复了导致某些 FLAC 文件无法播放的问题 (#2887)。
- AV1 扩展程序:AV1 软件解码器现在使用高性能
- Cast 扩展程序:
- 添加
CastPlayer.Builder,使CastPlayer能够同时进行本地播放和 Cast 播放。如需保留仅支持 Cast 播放的旧CastPlayer行为,您可以使用RemoteCastPlayer。预先存在的CastPlayer构造函数会保留其旧行为,但已废弃,取而代之的是使用CastPlayer或RemoteCastPlayer构建器。 - 停止在
DefaultMediaItemConverter中强制执行非 null MIME 类型。 - 使用
MediaItem.mediaMetadata.mediaType推断要在DefaultCastOptionsProvider#toMediaQueueItem中使用的 Cast MEDIA_TYPE(如果可用)。 - 在
DefaultCastOptionsProvider中启用远程到本地传输。 - 在 Session 演示中添加了对 Cast 的支持。
- 添加了对在可组合界面上显示媒体路由按钮的支持。
- 添加了对在操作栏菜单上显示媒体路由按钮的支持。
- 添加了对将媒体路由按钮显示为 View 界面的支持。
- 添加
- 测试实用程序:
- 为
FakeClock的自动推进功能添加了最大时间差。默认值为 1 秒,但可通过FakeClock.Builder进行配置。 - 为
RobolectricUtil.runMainLooperUntil(和runLooperUntil)添加了消息之间的最大时间差。默认值为 1 秒,但可通过这些方法的新重载进行配置。 - 将
CapturingRenderersFactory从test-utils移动到test-utils-robolectric。
- 为
- 移除了已废弃的符号:
- 移除了已废弃的
DefaultPreloadManager构造函数。改用DefaultPreloadManager.Builder。 - 移除了已废弃的
EditedMediaItemSequence构造函数。改用EditedMediaItemSequence.Builder。 - 移除了
BitmapFactoryImageDecoder.BitmapDecoder。改用ExternallyLoadedImageDecoder。 - 移除了已废弃的
ShadowMediaCodecConfig.forAllSupportedMimeTypes()。 请改用ShadowMediaCodecConfig.withAllDefaultSupportedCodecs()。 - 移除了已废弃的
ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes()。改用ShadowMediaCodecConfig.withNoDefaultSupportedCodecs()。
- 移除了已废弃的
1.9.0-rc01
2025 年 12 月 1 日
使用 1.9.0 稳定版。
1.9.0-beta01
2025 年 11 月 20 日
使用 1.9.0 稳定版。
1.9.0-alpha01
October 22, 2025
使用 1.9.0 稳定版。
版本 1.8.0
1.8.1
2026 年 5 月 21 日
版本 1.8.1 包含以下提交内容。
- 效果:
- 从无 surface 上下文转换时,明确设置
GL_DRAW_BUFFER和GL_READ_BUFFER。
- 从无 surface 上下文转换时,明确设置
版本 1.8.0
2025 年 7 月 30 日
版本 1.8.0 包含这些提交内容。
- 通用库:
- 添加了对在
ForwardingSimpleBasePlayer中替换播放器的支持。
- 添加了对在
- ExoPlayer:
- 向
ExoPlayer接口添加了随机播放模式的 getter (#2522)。 - 如果从多个线程访问
DefaultAudioSink,则更明确地抛出异常。如果这是由于在播放器外部调用RendererCapabilities.getFormatSupport导致的,请务必在与 ExoPlayer 的播放线程相同的线程上调用此方法,或使用与播放所用实例不同的实例 (#1191)。 - 修复了以下 bug:电视上的非立体声音频格式可能会被
DefaultTrackSelector标记为不受支持。 - 确保在使用 MediaCodec 的
DECODE_ONLY标志(在拖动模式下默认启用)时正确渲染最后一帧。 - 添加了对使用从
Context传递到ExoPlayer.Builder的虚拟设备 ID 的支持。 - 在清理模式下默认启用动态调度。
- 避免在跳转到内容末尾时对来源进行不必要的重新加载。
- 在拖动模式下默认使用
MediaCodec.BUFFER_FLAG_DECODE_ONLY。 - 当
PreloadMediaSource由ExoPlayer播放,且播放线程与预加载线程不同时,抛出IllegalStateException(#2495)。 - 向
ShuffleMode添加了cloneAndMove,并提供了默认实现 (#2226)。 - 更改
Renderer.getMinDurationToProgressUs的默认行为,以便在不需要调用render时返回更大的值。 - 修复了以下 bug:在暂停状态下跳转到末尾时,内部调度会延迟最后一帧。目前,只有在
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled处于启用状态时,此 bug 修复才会生效。 - 添加了
ExoPlayer.setScrubbingModeEnabled(boolean)方法。这会针对许多频繁的跳转(例如,用户拖动进度条)优化播放器。您可以使用ExoPlayer和ExoPlayer.Builder上的setScrubbingModeParameters(..)来自定义拖动模式的行为。 - 允许在拖动模式下自定义分数跳转容差。
- 提高拖动模式下的编解码器运行速率。
- 修复了
AdsMediaSource内容中的准备错误可能永远不会报告的 bug (#2337)。 - 修复了
MergingMediaSource中的内存泄漏问题,例如侧载字幕时使用的内存泄漏问题 (#2338)。 - 允许
CmcdConfiguration.Factory返回null,以停用特定媒体文件的 CMCD 日志记录 (#2386)。 - 将默认图片缓冲区空间从 128kB(文本轨道中的复制粘贴错误)增加到 26MB,这足以容纳 50MP Ultra HDR 图片 (#2417)。
- 添加了
PreCacheHelper,允许应用预缓存具有指定起始位置和时长的单个媒体。 - 在
DefaultPreloadManager中添加了对从指定位置预加载的支持。
- 向
- 转换器:
- 添加
CodecDbLite,以便对视频编码设置进行特定于芯片组的优化。 - 向
DefaultEncoderFactory添加setEnableCodecDbLite标志,以启用 CodecDB Lite 设置优化。此标志默认设置为 false。 - 现在,如需使用静音音频填充初始间隙(通过
addGap()添加),需要在EditedMediaItemSequence.Builder中明确设置experimentalSetForceAudioTrack(true)。如果间隙位于序列中间,则不需要此标志。 - 将
Muxer接口从media3-transformer移至media3-muxer。 - 将设置
MediaItem.Builder().setImageDuration(long)设为必需,以便将媒体文件作为图片导入。 - 添加
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean),其中包含剪辑时的 MP4 编辑列表,以指示播放器忽略剪辑起点之前的关键帧与剪辑起点之间的样本。 - 更新 Composition Demo 应用,以使用 Kotlin 和 Jetpack Compose,并添加自定义
VideoCompositorSettings,以便将序列排列成 2x2 或画中画布局。
- 添加
- 提取器:
- 从分段 MP4 文件中解析元数据 (#2084)。
- JPEG:支持开头没有 Exif 段的动态照片 (#2552)。
- 添加了对在具有多个
sidxatom 的分段 MP4 中进行跳转的支持。 您可以使用FragmentedMp4Extractor上的FLAG_MERGE_FRAGMENTED_SIDX标志启用此行为 (#9373)。 - 忽略 FLAC 文件中的空跳转表(包括仅包含占位跳转点的跳转表),并在文件时长已知的情况下回退到二分搜索跳转 (#2327)。
- 修复了 H.265 SEI 单元的解析问题,以完全跳过无法识别的 SEI 类型 (#2456)。
- 更新
WavExtractor,以便在解析WAVE_FORMAT_EXTENSIBLE类型文件时,使用标头扩展程序的 SubFormat 数据作为音频格式。 - MP4:添加了对定义原始 PCM 音轨的
ipcm和fpcm框的支持(不支持 64 位浮点 PCM)。 - MP4:处理
tkhd转换矩阵中同时旋转和反射视频的旋转部分。这可确保 iPhone 前置摄像头拍摄的镜像视频能够正确显示,但会在 Y 轴上错误地镜像 (#2012)。 - MP3:由于
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS),在回退到恒定比特率跳转时,使用不可跳转的 Xing、VBRI 和类似可变比特率元数据中的时长和数据大小 (#2194)。
- 音频:
- 修复了以下 bug:当音频播放在非常接近媒体结尾的位置开始时,系统不会调用
AnalyticsListener.onAudioPositionAdvancing。 - 在
ChannelMappingAudioProcessor和TrimmingAudioProcessor中添加了对所有线性 PCM 采样格式的支持。 - 添加了对
CompositionPlayer中音频间隙的支持。 - 从
BaseAudioProcessor#reset()中移除了对BaseAudioProcessor#flush()的虚假调用。 - 允许在 DefaultAudioMixer 中进行恒定功率上混/下混。
- 将
ChannelMappingAudioProcessor、TrimmingAudioProcessor和ToFloatPcmAudioProcessor设为公开 (#2339)。 - 使用
AudioTrackPositionTracker中的AudioTrack#getUnderrunCount()检测DefaultAudioSink中的欠载,而不是尽力估算。 - 改进音频时间戳平滑处理,以应对音频输出设备出现意外位置偏移的情况。
- 修复了连接到蓝牙设备时,从暂停状态恢复后前 10 秒内音视频同步中断的 bug。
- 修复了以下 bug:
AnalyticsListener.onAudioPositionAdvancing报告的不是音频开始推进的时间,而是首次测量的时间。 - 修复了在某些设备上回退到立体声音频后恢复到多声道音频的问题 (#2258)。
- 修复了以下 bug:当音频播放在非常接近媒体结尾的位置开始时,系统不会调用
- 视频:
- 将分离式 Surface 权宜解决方法扩展到“lenovo”和“motorola”设备 (#2059)。
- 改进了音频样本未在请求的确切位置开始时,启动时视频帧的流畅释放。
- 将分离表面解决方法扩展到“realme”设备 (#2059)。
- 添加了实验性
ExoPlayerAPI,以便在将仅解码输入缓冲区加入队列时包含MediaCodec.BUFFER_FLAG_DECODE_ONLY标志。此标志会指示解码器跳过仅解码缓冲区,从而加快跳转速度。使用DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag启用。 * 改进了软件视频编解码器的编解码器性能检查。这可能会导致一些额外的轨道被标记为EXCEEDS_CAPABILITIES。 - 修复了某些设备上的 VP9 Widevine 播放错误 (#2408)。
- 文本:
- 添加了对 MP4 文件中 VobSub 轨道的支持 (#2510)。
- 修复了以下问题:当字幕片段最初加载失败,随后加载成功,接着出现多个空字幕片段时,播放会停滞 (#2517)。
- 修复了 SSA 和 SubRip,以便在启用字幕时显示正在进行的提示 (#2309)。
- 修复了从存在字幕错误的直播切换到字幕轨道为空的直播时播放卡住的问题 (#2328)。
- 修复了播放包含 B 帧的 H.262 流时 CEA-608 字幕乱码的问题 (#2372)。
- 在 Matroska 文件中添加了对具有
CodecId = S_TEXT/SSA的 SSA 字幕的支持。以前,MatroskaExtractor仅支持CodecId = S_TEXT/ASS,它代表 SubStation Alpha 字幕的“高级”(v4+) 变体(但 ExoPlayer 的解析逻辑对于这两种变体是相同的)(#2384)。 - 在 SubStation Alpha (SSA) 字幕文件中添加对
layer属性的支持,该属性用于在屏幕上同时显示多个 cue 文件时定义其 Z 轴顺序 (#2124)。
- 元数据:
- 向
MetadataRetriever添加了对检索媒体时长和Timeline的支持,并将其迁移到了基于实例的AutoCloseableAPI。使用新的Builder为MediaItem创建实例,然后调用retrieveTrackGroups()、retrieveTimeline()和retrieveDurationUs()以获取元数据的ListenableFuture。 之前的静态方法现已废弃 (#2462)。
- 向
- 图片:
- 将解码后的位图限制为
BitmapFactoryImageDecoder中的显示大小,以避免应用在尝试显示非常大(例如 50MP)的图片时因PlayerView抛出Canvas: trying to draw too large bitmap.而崩溃。 - 更改
DefaultRenderersFactory.getImageDecoderFactory()的签名,使其接受Context参数。 - 将
CompositionPlayer中使用的最大位图输出大小与Transformer中已使用的大小保持一致(这意味着,与ExoPlayer不同,CompositionPlayer在解码位图时不会考虑显示大小)。
- 将解码后的位图限制为
- DRM:
- 添加了接受
MediaItem.DrmConfiguration的OfflineLicenseHelper.newWidevineInstance的新重载,以便正确应用 HTTP 请求标头 (#2169)。
- 添加了接受
- 效果:
- 添加
Presentation.createForShortSide(int),以创建Presentation,确保最短边始终与给定值匹配,无论输入方向如何。
- 添加
- 多路复用器:
- 修复了以下 bug:未在分段 MP4 中为音频样本设置正确的样本标志。
writeSampleData()API 现在使用多路复用器专用的BufferInfo类,而不是MediaCodec.BufferInfo。- 添加
Muxer.Factory#supportsWritingNegativeTimestampsInEditList,其默认值为 false。
- IMA 扩展程序:
- 修复了以下 bug:一个广告中的加载错误可能会意外导致另一个广告组失效。
- 修复了 VOD 窗口结束后广告组导致播放停滞的 bug。
开始时间晚于该时间范围的广告组不会再加入
MediaPeriodQueue的队列 (#2215)。
- 会话:
- 修复了来自第三方非特权 Media3 控制器的连接被忽略的 bug。
- 移除了在向旧版
MediaBrowserServiceCompat发送自定义命令时检查可用命令的步骤。这与旧版控制器/浏览器连接到旧版应用时的行为一致。 - 修复了导致播放器的第一个播放错误被错误地视为永久性自定义异常的 bug。这会导致应用无法恢复。
- 修复了以下 bug:会话未处理的某些控制器更改可能会导致
IllegalStateExceptions。 - 修复了以下 bug:未由会话处理的控制器操作可能会使控制器处于无效状态。
- 修复了 StrictMode 不安全启动违规警告 (#2330)。
- 修复了以下 bug:从与主线程不同的应用线程运行播放器时,从主线程调用
setSessionExtras会导致IllegalStateException(#2265)。 - 如果玩家设置了媒体内容,但未准备或播放这些内容,请勿自动显示通知 (#2423https://github.com/androidx/media/issues/2423)。此行为可通过
MediaSessionService.setShowNotificationForIdlePlayer进行配置。 - 为所有或所选控制器添加自定义
PlaybackException。 - 修复了在
MediaController上跳转到直播中的某个位置可能会导致IllegalArgumentException的 bug。 - 对于直播,停止发布播放位置以及在当前内容中跳转的功能,以避免 Android Auto 界面(以及使用平台媒体会话中的这些信息的其他控制器)中出现位置伪影 (#1758)。
- 修复了以下 bug:将 null 传入连接到旧版
MediaBrowserServiceCompat的MediaBrowser的getLibraryRoot会产生NullPointerException。 - 修复了以下 bug:发送自定义操作、搜索结果或 getItem 请求会导致旧版会话应用崩溃,并显示
ClassNotFoundException。 - 修复了以下 bug:
MediaItem.LocalConfiguration.uri会共享到平台会话的MediaMetadata。如需有意共享 URI 以允许控制器重新请求媒体,请改为设置MediaItem.RequestMetadata.mediaUri。
- 界面:
- 修复了可重用组件(例如
LazyColumn)内的PlayerSurface无法正常运行的 bug (#2493)。 - 修复了 Compose bug,该 bug 导致在设置初始按钮状态与观察状态变化(例如图标形状或启用状态)之间存在时间差。现在,在观察期之外对 Player 所做的任何更改都会被检测到 (#2313)。
- 向
media3-ui-compose模块添加SeekBackButtonState和SeekForwardButtonState的状态容器和可组合项。 - 为
PlayerControlView添加了对 ExoPlayer 拖动模式的支持。启用后,当用户开始拖动拖动条时,播放器会进入拖动模式,每次移动都会发出player.seekTo调用,然后在触摸离开屏幕时退出拖动模式。您可以通过 XML 中的time_bar_scrubbing_enabled = true或 Java/Kotlin 中的setTimeBarScrubbingEnabled(boolean)方法启用此集成。 - 使
PlayerSurface接受可为 null 的Player实参。
- 修复了可重用组件(例如
- 下载内容:
- 添加了对渐进式视频流的部分下载支持。应用可以使用
DownloadHelper准备渐进式串流,并向辅助程序请求DownloadRequest,同时指定下载应涵盖的基于时间的媒体开始和结束位置。返回的DownloadRequest包含解析后的字节范围,可用于创建ProgressiveDownloader并相应地下载内容。 - 添加用于替换静态
DownloadHelper.forMediaItem()方法的DownloadHelper.Factory。 - 为
SegmentDownloader实现添加Factory。 - 添加了对自适应串流的部分下载支持。应用可以使用
DownloadHelper准备自适应串流,并向辅助程序请求DownloadRequest,同时指定下载应涵盖的基于时间的媒体开始和结束位置。返回的DownloadRequest包含解析的时间范围,可用于创建具体的SegmentDownloader并相应地下载内容。
- 添加了对渐进式视频流的部分下载支持。应用可以使用
- Cronet 扩展程序:
- 添加了自动 Cookie 处理机制 (#5975)。
- HLS 扩展程序:
- 修复了以下 bug:当缓冲区中没有可用的分块时,
HlsSampleStreamWrapper尝试在缓冲区内进行跳转 #2598。 - 修复了以下 bug:在加载低延迟部分和预加载提示后,轨道选择发生变化可能会导致播放卡住或冻结 (#2299)。
- 当服务器不遵循
CAN-BLOCK-RELOAD=YES时,等待目标时长的一半,以防止过度重新加载 (#2317)。 - 修复了以下 bug:在尝试为错误的广告解析中贴片广告和素材资源列表之前,启动插页式广告流时播放会停滞 (#2558)。
- 修复了播放列表解析问题,以接受带引号的字符串属性值中的
\f(换页符)(#2420)。 - 支持更新具有相同 ID 的插页式广告 (#2427)。
- 修复了以下 bug:当直播流没有可加载的片段时,播放列表加载错误有时不会传播 (#2401https://github.com/androidx/media/issues/2401)。
- 按 NAME 标记对字幕呈现进行分组,类似于音频呈现的分组方式 (#1666)。
- 支持 X-ASSET-LIST 和
HlsInterstitialsAdsLoader直播。
- 修复了以下 bug:当缓冲区中没有可用的分块时,
- DASH 扩展程序:
- RTSP 扩展程序:
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- 修复了
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange对音频解码器扩展没有影响的 bug (#2258)。
- 修复了
- Cast 扩展程序:
- 测试实用程序:
- 向
TestPlayerRunHelper添加了advance(player).untilPositionAtLeast和untilMediaItemIndex,以便将播放器快进到指定位置。在大多数情况下,这些方法比现有的untilPosition和untilStartOfMediaItem方法更可靠。 - 将
FakeDownloader移至test-utils-robolectric模块,以便在其他测试中重复使用。 - 移除了
transformer.TestUtil.addAudioDecoders(String...)、transformer.TestUtil.addAudioEncoders(String...)和transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)。请改用ShadowMediaCodecConfig配置影子编码器和解码器。 - 在
ShadowMediaCodecConfig报告的编解码器名称中,将“exotest”前缀替换为“media3”。
- 向
- 移除了已废弃的符号:
- 移除了已废弃的
SegmentDownloader构造函数SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)及其子类DashDownloader、HlsDownloader和SsDownloader中的相应构造函数。 - 移除了已废弃的
Player.hasNext()、Player.hasNextWindow()。请改用Player.hasNextMediaItem()。 - 移除了已废弃的
Player.next()。请改用Player.seekToNextMediaItem()。 - 移除了已废弃的
Player.seekToPreviousWindow()。改用Player.seekToPreviousMediaItem()。 - 移除了已废弃的
Player.seekToNextWindow()。改用Player.seekToNextMediaItem()。 - 移除了
exoplayer模块中已废弃的BaseAudioProcessor。使用common模块下的BaseAudioProcessor。 - 移除了已废弃的
MediaCodecVideoRenderer构造函数MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)。
- 移除了已废弃的
版本 1.8.0-rc02
2025 年 7 月 24 日
使用 1.8.0 稳定版。
版本 1.8.0-rc01
2025 年 7 月 16 日
使用 1.8.0 稳定版。
版本 1.8.0-beta01
2025 年 7 月 2 日
使用 1.8.0 稳定版。
版本 1.8.0-alpha01
2025 年 5 月 19 日
使用 1.8.0 稳定版。
版本 1.7.0
版本 1.7.1
2025 年 5 月 16 日
此版本具有与 1.6.1 相同的代码,发布此版本是为了确保它显示为比 1.7.0“更新”的版本,1.7.0 是一个意外标记为稳定版的 Alpha 版(见下文)。
版本 1.7.0
2025 年 5 月 16 日
此版本本应为 1.7.0-alpha01,但在 maven.google.com 上被意外标记为 1.7.0(即稳定版)。请勿使用。请继续使用 1.6.1 或升级到 1.7.1(其代码与 1.6.1 相同)。
版本 1.6.0
1.6.1
2025 年 4 月 14 日
发布了 androidx.media3:media3-*:1.6.1。版本 1.6.1 包含这些提交内容。
- 通用库:
- 添加了
PlaybackParameters.withPitch(float)方法,以便轻松复制具有新pitch值的PlaybackParameters(#2257)。
- 添加了
- ExoPlayer:
- 修复了以下问题:在初始化下一个媒体文件期间,由于可恢复的渲染器错误,媒体项转换失败 (#2229)。
- 修复了以下问题:
PreloadMediaSource尝试在getBufferedDurationUs()准备就绪之前调用它,导致ProgressiveMediaPeriod抛出IllegalStateException(#2315)。 - 修复了在 DASH、HLS 和 SmoothStreaming 的清单请求中发送
CmcdData的问题 (#2253)。 - 确保在移除广告组后仍可使用
AdPlaybackState.withAdDurationsUs(long[][])。用户仍需要为已移除的广告组传入时长数组,该数组可以为空或 null (#2267)。
- 提取器:
- MP4:从
tkhd框中解析alternate_group,并将其作为Mp4AlternateGroupData条目在每个轨道的Format.metadata中公开 (#2242)。
- MP4:从
- 音频:
- 修复了在播放短内容播放列表时位置可能会卡住的分流问题 (#1920)。
- 会话:
- 将平台
MediaSession回调的聚合超时时间从 500 毫秒缩短至 100 毫秒,并添加了一个实验性 setter,以便应用配置此值。 - 修复了通知在被用户关闭后重新出现的问题 (#2302)。
- 修复了以下 bug:当封装的播放器实际上为空时,会话会返回单项时间轴。当封装的播放器没有可用的
COMMAND_GET_TIMELINE,但有可用的COMMAND_GET_CURRENT_MEDIA_ITEM且封装的播放器为空时,就会发生这种情况 (#2320)。 - 修复了在与服务进行其他互动(例如
setForegroundServiceTimeoutMs)后,调用MediaSessionService.setMediaNotificationProvider会被静默忽略的 bug (#2305)。
- 将平台
- 界面:
- 启用
PlayerSurface以便与ExoPlayer.setVideoEffects和CompositionPlayer配合使用。 - 修复了无法使用新
Player重组PlayerSurface的 bug。
- 启用
- HLS 扩展程序:
- 修复了以下问题:未在
CmcdData中为 HLS 媒体设置分块时长,导致在处理加密媒体片段时出现断言失败 (#2312)。
- 修复了以下问题:未在
- RTSP 扩展程序:
- 添加了对采用 RTSPT 架构的 URI 的支持,以便将 RTSP 会话配置为使用 TCP (#1484)。
- Cast 扩展程序:
- 添加了对播放列表元数据的支持 (#2235)。
1.6.0
2025 年 3 月 26 日
发布了 androidx.media3:media3-*:1.6.0。版本 1.6.0 包含这些提交内容。
- 通用库:
- 添加了
AudioManagerCompat和AudioFocusRequestCompat,以替换androidx.media中的等效类。 - 将 Kotlin 从 1.9.20 升级到 2.0.20,并使用 Compose 编译器 Gradle 插件。将 KotlinX 协程库从 1.8.1 升级到 1.9.0。
- 移除了
Format.toBundle(boolean excludeMetadata)方法,请改用Format.toBundle()。 - 修复了
SimpleBasePlayer中的 bug:在setPlaylist之后,使用nullMediaMetadata在State中设置新的currentMediaItemIndex不会重新评估元数据 (#1940)。 - 将
SimpleBasePlayer.State访问权限从受保护更改为公开,以便更轻松地处理其他类中的更新 (#2128)。
- 添加了
- ExoPlayer:
- 添加了
MediaExtractorCompat,这是一个提供与平台MediaExtractor相同功能的新类。 - 添加了对使用
MediaCodecVideoRenderer进行播放的实验性“ExoPlayer”预热支持。您可以配置DefaultRenderersFactory到experimentalSetEnableMediaCodecVideoRendererPrewarming,以便为ExoPlayer提供辅助MediaCodecVideoRenderer。如果启用,ExoPlayer会在播放期间预处理连续媒体文件的视频,以减少媒体文件过渡延迟时间。 - 将
DefaultLoadControl中bufferForPlaybackMs和bufferForPlaybackAfterRebufferMs的默认值分别降低到 1000 毫秒和 2000 毫秒。 - 异步初始化
DeviceInfo和设备音量(如果使用setDeviceVolumeControlEnabled启用)。这些值在ExoPlayer.Builder.build()之后不会立即可用,Player.Listener会通过onDeviceInfoChanged和onDeviceVolumeChanged通知更改。 - 创建播放器后,初始音频会话 ID 不再立即可用。如果需要,您可以使用
AnalyticsListener.onAudioSessionIdChanged监听初始更新。 - 选择视频轨道时,请考虑语言。默认情况下,选择与所选音轨的语言相匹配的“主”视频轨道(如果有)。可以使用
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)表达明确的视频语言偏好设置。 - 向
DefaultTrackSelector.selectVideoTrack()方法添加了selectedAudioLanguage参数。 - 向
MediaSourceEventListener.onLoadStarted和相应的MediaSourceEventListener.EventDispatcher方法添加了retryCount参数。 - 修复了以下 bug:在多时段 DASH 流中,如果播放列表项或时段的时长与实际内容不符,可能会导致内容末尾出现画面冻结 (#1698)。
- 将
BasePreloadManager.Listener移至顶级PreloadManagerListener。 RenderersFactory.createSecondaryRenderer可用于提供辅助渲染程序,以便进行预热。预热功能可在播放期间更快地切换媒体文件。- 在自适应流式传输格式 DASH、HLS 和 SmoothStreaming 中,允许为清单请求发送
CmcdData(#1951)。 - 提供将在
MediaCodecRenderer.onReadyToInitializeCodec中初始化的编解码器的MediaCodecInfo(#1963)。 - 更改
AdsMediaSource,以允许通过附加广告组来扩大AdPlaybackStates。检测到无效修改并抛出异常。 - 修复了以下问题:在中贴片广告播放完毕后过渡到内容媒体时,可能会快速连续显示额外的仅解码帧。
- 让
DefaultRenderersFactory添加两个MetadataRenderer实例,以便应用默认接收两种不同架构的元数据。 - 重新评估在播放暂停时是否应取消正在进行的分块加载 (#1785)。
- 向
ClippingMediaSource添加了选项,以允许在不可跳转的媒体中进行剪辑。 - 修复了以下 bug:在预热状态下跳转可能会阻止后续媒体文件转换。
- 修复了
ExoPlayer.isLoading()在已转换为STATE_IDLE或STATE_ENDED时仍保持true的 bug (#2133)。 - 在
LoadControl.Parameter中添加了lastRebufferRealtimeMs(#2113)。
- 添加了
- 转换器:
- 添加了对转复用为向后兼容的替代格式的支持。
- 添加了对杜比视界(配置文件 8)格式的转码和转复用支持。
- 更新
VideoFrameProcessor.registerInputStream和VideoFrameProcessor.Listener.onInputStreamRegistered的参数以使用Format。 - 使用
DefaultEncoderFactory时生成 HDR 静态元数据。 - 使用
MediaMetricsManager启用了对 Android 平台诊断信息的支持。Transformer 会将编辑事件和性能数据转发到平台,这有助于在设备上提供系统性能和调试信息。如果设备用户启用了使用情况和诊断信息数据分享功能,Google 可能也会收集上述数据。应用可以选择退出不通过Transformer.Builder.setUsePlatformDiagnostics(false)为 Transformer 提供平台诊断信息。 - 将
InAppMuxer拆分为InAppMp4Muxer和InAppFragmentedMp4Muxer。 您可以使用InAppMp4Muxer生成非分段 MP4 文件,而使用InAppFragmentedMp4Muxer生成分段 MP4 文件。 - 将
Muxer接口从media3-muxer移至media3-transformer。 - 添加了
MediaProjectionAssetLoader,用于从MediaProjection提供媒体内容以进行屏幕录制,并为 Transformer 演示版应用添加了屏幕录制支持。 - 向
Codec接口添加了#getInputFormat()。 - 尽可能将释放
GlObjectsProvider的责任转移到DefaultVideoFrameProcessor和DefaultVideoCompositor中的调用方。
- 提取器:
- AVI:修复了对具有恒定比特率压缩音频的文件的处理,其中数据流标头存储的是字节数,而不是数据块数。
- 修复了对长度以 1 或 2 个字节(而非 4 个字节)表示的 NAL 单元的处理。
- 修复了 MP4 修改列表中当修改列表从非同步帧开始且前面没有同步帧时出现的
ArrayIndexOutOfBoundsException问题 (#2062)。 - 修复了 TS 流可能会在某些设备上卡住的问题 (#2069)。
- FLAC:添加了对 32 位 FLAC 文件的支持。之前,这些内容无法使用
IllegalStateException: Playback stuck buffering and not loading播放 (#2197)。
- 音频:
- 修复了在播放恢复时调用
onAudioPositionAdvancing的问题(之前是在播放暂停时调用)。 - 如果
SpeedChangingAudioProcessor配置了默认参数,请勿绕过SonicAudioProcessor。 - 修复了
Sonic#getOutputSize()中可能导致DefaultAudioSink停止运行的下溢问题。 - 修复
MediaCodecAudioRenderer.getDurationToProgressUs()和DecoderAudioRenderer.getDurationToProgressUs(),以便跳转操作正确重置提供的时长。 - 将
androidx.media3.common.audio.SonicAudioProcessor设为最终版本。 - 为
ChannelMappingAudioProcessor和TrimmingAudioProcessor添加了对浮点 PCM 的支持。
- 修复了在播放恢复时调用
- 视频:
- 将
MediaCodecVideoRenderer.shouldUsePlaceholderSurface更改为受保护,以便应用可以替换为阻止使用占位符 Surface (#1905)。 - 添加了实验性
ExoPlayerAV1 样本依赖项解析,以加快跳转速度。使用新的DefaultRenderersFactory.experimentalSetParseAv1SampleDependenciesAPI 启用。 - 添加了实验性
ExoPlayerAPI,用于丢弃不依赖的延迟MediaCodecVideoRenderer解码器输入缓冲区。使用DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs启用。 * 修复了以下问题:没有 Surface 的播放器会立即准备就绪,并且解码任何待处理帧的速度非常慢 (#1973)。 - 将小米和 OPPO 设备从分离式 Surface 模式中排除,以避免屏幕闪烁 (#2059)。
- 将
- 文本:
- 添加了对 VobSub 字幕的支持 (#8260)。
- 停止预先加载使用
MediaItem.Builder.setSubtitleConfigurations配置的所有字幕文件,改为仅加载通过轨道选择功能选择的一个字幕文件 (#1721)。 - TTML:添加了对使用
style引用tts:origin和tts:extent的支持 (#2953)。 - 将 WebVTT 和 SubRip 时间戳限制为恰好 3 位小数。 以前,我们错误地解析了任意数量的小数位,但始终假定该值以毫秒为单位,从而导致时间戳不正确 (#1997)。
- 修复了当播放列表包含带有 CEA-608 或 CEA-708 字幕的剪辑内容时播放挂起的问题。
- 修复了当 SSA 文件包含时长为零(开始时间和结束时间相同)的 cue 文件时出现的
IllegalStateException问题 (#2052)。 - 当字幕与音频和视频多路复用到同一容器中时,抑制(并记录)字幕解析错误 (#2052)。
- 修复了在使用 CR 行尾的 WebVTT 文件中处理多字节 UTF-8 字符的问题 (#2167)。
- DRM:
- 修复了在 API < 27 的设备上播放 ClearKey 内容时出现的
MediaCodec$CryptoException: Operation not supported in this configuration错误 (#1732)。
- 修复了在 API < 27 的设备上播放 ClearKey 内容时出现的
- 效果:
- 将
OverlaySettings的功能移至StaticOverlaySettings。可以为OverlaySettings创建子类,以允许动态叠加层设置。
- 将
- 多路复用器:
- 将
MuxerException移出了Muxer接口,以避免出现非常长的完全限定名称。 - 在
Mp4Muxer.Builder和FragmentedMp4Muxer.Builder中,将setSampleCopyEnabled()方法重命名为setSampleCopyingEnabled()。 Mp4Muxer.addTrack()和FragmentedMp4Muxer.addTrack()现在会返回int轨道 ID,而不是TrackToken。Mp4Muxer和FragmentedMp4Muxer不再实现Muxer接口。- 默认停用
Mp4Muxer样本批处理和复制。 - 修复了
FragmentedMp4Muxer中的一个 bug,该 bug 会在仅写入音轨时创建大量片段。
- 将
- 会话:
- 在播放暂停、停止或失败时,将前台服务状态再保留 10 分钟。这样,用户就可以在此超时时间内恢复播放,而不会在各种设备上受到前台服务限制。请注意,在替换
onTaskRemoved时,仅调用player.pause()已无法再用于在stopSelf()之前停止前台服务,请改用MediaSessionService.pauseAllPlayersAndStopSelf()。 - 当播放进入错误或停止状态时,让通知保持可见。只有在播放列表被清除或播放器被释放时,通知才会被移除。
- 改进了对 Android 平台 MediaSession 操作 ACTION_PLAY 和 ACTION_PAUSE 的处理,以便根据可用命令仅设置其中一个,并且在仅设置其中一个时也接受。
- 将
Context作为参数添加到MediaButtonReceiver.shouldStartForegroundService(#1887)。 - 修复了以下 bug:在连接到旧版会话的
MediaController上调用Player方法会丢弃待处理更新中的更改。 - 使
MediaSession.setSessionActivity(PendingIntent)接受 null (#2109)。 - 修复了以下 bug:在播放列表被清除后,过时的通知仍保持可见 (#2211)。
- 在播放暂停、停止或失败时,将前台服务状态再保留 10 分钟。这样,用户就可以在此超时时间内恢复播放,而不会在各种设备上受到前台服务限制。请注意,在替换
- 界面:
- 向
media3-ui-compose模块添加状态容器和可组合项,以支持PlayerSurface、PresentationState、PlayPauseButtonState、NextButtonState、PreviousButtonState、RepeatButtonState、ShuffleButtonState和PlaybackSpeedState。
- 向
- 下载内容:
- 修复了
CacheWriter中的 bug,该 bug 会导致在数据源抛出IOException以外的Exception时,数据源保持打开状态,缓存区域保持锁定状态 (#9760)。
- 修复了
- HLS 扩展程序:
- 添加
HlsInterstitialsAdsLoader的第一个版本。广告加载器会读取 HLS 媒体播放列表的 HLS 插页式广告,并将其映射到传递给AdsMediaSource的AdPlaybackState。此初始版本仅支持具有X-ASSET-URI属性的 HLS VOD 视频流。 - 添加了
HlsInterstitialsAdsLoader.AdsMediaSourceFactory。应用可以使用它以方便、安全的方式创建使用HlsInterstitialsAdsLoader的AdsMediaSource实例。 - 从 HLS 播放列表中解析
SUPPLEMENTAL-CODECS标记,以检测 Dolby Vision 格式 (#1785)。 - 放宽了在 HLS 流中跳转到同步位置的条件 (#2209)。
- 添加
- DASH 扩展程序:
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- 添加了 MPEG-H 解码器模块,该模块使用内置 MPEG-H 解码器来解码 MPEG-H 音频 (#1826)。
- MIDI 扩展程序:
- 将自定义
AudioSink和AudioRendererEventListener实例连接到MidiRenderer。
- 将自定义
- Cast 扩展程序:
- 将
play-services-cast-framework依赖项升级到 21.5.0,以修复在安装了 Google Play 服务但已停用的设备上,以 API 34+ 为目标平台的应用中发生的FLAG_MUTABLE崩溃问题 (#2178)。
- 将
- 演示版应用:
- 通过额外的按钮扩展
demo-compose,并通过缩放和快门支持增强PlayerSurface集成。
- 通过额外的按钮扩展
- 移除了已废弃的符号:
- 移除了已废弃的
AudioMixer.create()方法。改用DefaultAudioMixer.Factory().create()。 - 移除了以下已废弃的
Transformer.Builder方法:setTransformationRequest(),请改用setAudioMimeType()、setVideoMimeType()和setHdrMode()。setAudioProcessors(),请在EditedMediaItem.Builder.setEffects()中设置音频处理器,并将其传递给Transformer.start()。setVideoEffects(),请改为在EditedMediaItem.Builder.setEffects()中设置视频效果,并将其传递给Transformer.start()。setRemoveAudio(),请改用EditedMediaItem.Builder.setRemoveAudio()从传递给Transformer.start()的EditedMediaItem中移除音频。setRemoveVideo(),请改用EditedMediaItem.Builder.setRemoveVideo()从传递给Transformer.start()的EditedMediaItem中移除视频。setFlattenForSlowMotion(),请改用EditedMediaItem.Builder.setFlattenForSlowMotion()来展平传递给Transformer.start()的EditedMediaItem。setListener(),请改用addListener()、removeListener()或removeAllListeners()。
- 移除了以下已废弃的
Transformer.Listener方法:- 废弃了
onTransformationCompleted(MediaItem),改用onCompleted(Composition, ExportResult)。 - 废弃了
onTransformationCompleted(MediaItem, TransformationResult),改用onCompleted(Composition, ExportResult)。 - 废弃了
onTransformationError(MediaItem, Exception),改用onError(Composition, ExportResult, ExportException)。 - 废弃了
onTransformationError(MediaItem, TransformationException),改用onError(Composition, ExportResult, ExportException)。 - 废弃了
onTransformationError(MediaItem, TransformationResult, TransformationException),改用onError(Composition, ExportResult, ExportException)。 - 废弃了
onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest),改用onFallbackApplied(Composition, TransformationRequest, TransformationRequest)。
- 废弃了
- 移除了已弃用的
TransformationResult类。请改用ExportResult。 - 移除了已弃用的
TransformationException类。请改用ExportException。 - 移除了已废弃的
Transformer.PROGRESS_STATE_NO_TRANSFORMATION。改用Transformer.PROGRESS_STATE_NOT_STARTED。 - 移除了已废弃的
Transformer.setListener()。请改用Transformer.addListener()、Transformer.removeListener()或Transformer.removeAllListeners()。 - 移除了已废弃的
Transformer.startTransformation()。改用Transformer.start(MediaItem, String)。 - 移除了已废弃的
SingleFrameGlShaderProgram。改用BaseGlShaderProgram。 - 移除了
Transformer.flattenForSlowMotion。改用EditedMediaItem.flattenForSlowMotion。 - 移除了
ExoPlayer.VideoComponent、ExoPlayer.AudioComponent、ExoPlayer.TextComponent和ExoPlayer.DeviceComponent。 - 移除了
androidx.media3.exoplayer.audio.SonicAudioProcessor。 - 移除了以下已废弃的
DownloadHelper方法:- 构造函数
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]),请改用DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)。 getRendererCapabilities(RenderersFactory),可以通过创建具有RenderersFactory的DefaultRendererCapabilitiesList并调用DefaultRendererCapabilitiesList.getRendererCapabilities()来实现等效功能。- 移除了
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)方法。请改用PlayerNotificationManager.setMediaSessionToken(MediaSession.Token)并传入(MediaSession.Token) compatToken.getToken()。
- 构造函数
- 移除了已废弃的
1.6.0-rc02
2025 年 3 月 19 日
使用 1.6.0 稳定版。
1.6.0-rc01
2025 年 3 月 12 日
使用 1.6.0 稳定版。
1.6.0-beta01
2025 年 2 月 26 日
使用 1.6.0 稳定版。
版本 1.6.0-alpha03
2025 年 2 月 6 日
使用 1.6.0 稳定版。
版本 1.6.0-alpha02
2025 年 1 月 30 日
使用 1.6.0 稳定版。
版本 1.6.0-alpha01
2024 年 12 月 20 日
使用 1.6.0 稳定版。
版本 1.5
版本 1.5.1
2024 年 12 月 19 日
发布了 androidx.media3:media3-*:1.5.1。版本 1.5.1 包含这些提交内容。
- ExoPlayer:
- 停用 MediaCodec 中的异步解密功能,以避免此平台 API 出现报告的编解码器超时问题 (#1641)。
- 提取器:
- MP3:当
VBRI帧的目录未涵盖文件中的所有 MP3 数据时,不要提前停止播放 (#1904)。
- MP3:当
- 视频:
- 回滚了在处理
onOutputFormatChanged时使用MediaCodecAdapter提供的像素宽高比值 (#1371)。
- 回滚了在处理
- 文本:
- 修复了
ReplacingCuesResolver.discardCuesBeforeTimeUs中的一个 bug,该 bug 会导致在timeUs处处于活动状态的提示(之前已开始但尚未结束)被错误地舍弃 (#1939)。
- 修复了
- 元数据:
- 将 Vorbis 注释中的光盘/曲目编号和流派提取到
MediaMetadata(#1958) 中。
- 将 Vorbis 注释中的光盘/曲目编号和流派提取到
版本 1.5.0
2024 年 11 月 27 日
发布了 androidx.media3:media3-*:1.5.0。版本 1.5.0 包含这些提交内容。
- 通用库:
- 添加了
ForwardingSimpleBasePlayer,以便在确保完全一致性和监听器处理的同时,允许通过细微调整转发到另一个播放器 (#1183)。 - 将
SimpleBasePlayer.State.playlist替换为getPlaylist()方法。 - 为
SimpleBasePlayer.State.Builder.setPlaylist()添加了替换项,以直接指定Timeline以及当前的Tracks和Metadata,而不是构建播放列表结构。 - 将
minSdk提高到 21 (Android Lollipop)。这与所有其他 AndroidX 库一致。 - 添加了
androidx.media3:media3-common-ktx工件,该工件提供基于 Common 库构建的 Kotlin 专用功能 - 向
media3-common-ktx库添加了Player.listen挂起扩展函数,用于启动协程来监听Player.Events。 - 从旨在避免运行时类验证失败的手动外嵌内部类中移除
@DoNotInline注解。 现在,最新版本的 R8 会自动对这类调用进行去内联,以避免运行时失败(因此不再需要手动去内联)。由于compileSdk = 35,该库的所有 Gradle 用户必须已经在使用 Android Gradle 插件版本,该版本使用执行此操作的 R8 版本。使用非 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(),以在各个渲染器允许播放准备就绪时发出信号。 - 修复了在 API 31 及更高版本中,当
MediaCodec以异步模式(默认行为)运行时,MediaCodec.CryptoException有时会被报告为“意外运行时错误”的问题。 - 传递
bufferedDurationUs,而不是传递bufferedPositionUs和PreloadMediaSource.PreloadControl.onContinueLoadingRequested()。此外,还将DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS更改为DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS,然后应用需要传递一个值,该值表示从默认起始位置开始的特定时长,必须使用此 IntDef(而不是位置)预加载相应的媒体来源。 - 添加了
ForwardingRenderer实现,用于将所有方法调用转发到另一个渲染器 (1703)。 - 为播放列表中的下一项添加播放列表预加载功能。应用可以通过相应地调用
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)来启用预加载。默认情况下,预加载功能处于停用状态。选择启用后,为避免干扰播放,DefaultLoadControl会限制预加载,使其仅在播放器未加载播放内容时启动和继续。应用可以通过相应地实现LoadControl.shouldContinuePreloading()(例如在DefaultLoadControl中替换此方法时)来更改此行为。如果应用使用的是LoadControl的自定义实现,则LoadControl的默认实现会停用预加载。 - 添加了方法
MediaSourceEventListener.EventDispatcher.dispatchEvent(),以允许调用子类监听器的事件 (1736)。 - 添加了
DefaultPreloadManager.Builder,用于通过一致的共享配置构建DefaultPreloadManager和ExoPlayer实例。 - 从
LoadControl.onTracksSelected()中移除Renderer[]参数,因为DefaultLoadControl实现可以从ExoTrackSelection[]中检索流类型。 - 废弃了
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]),并将方法标记为 final,以防止替换。 应改用新的DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])。 - 在
MergingMediaSource中报告来自次要来源的MediaSourceEventListener事件。这会导致系统针对旁加载的字幕(使用MediaItem.LocalConfiguration.subtitleConfigurations添加的字幕)报告加载开始/错误/取消/完成事件,这些事件可能会显示为从AnalyticsListener发出的重复加载事件。 - 防止字幕和元数据错误导致播放完全停止。
而是停用有问题的轨道,并继续播放其余轨道 (#1722)。
- 在新的字幕处理(提取期间)中,相关的解析(例如无效的字幕数据)和加载错误(例如 HTTP 404)通过
onLoadError回调发出。 - 在旧版字幕处理(在渲染期间)中,系统只会通过
onLoadError回调发出关联的加载错误,而解析错误会被静默忽略(这是预先存在的行为)。
- 在新的字幕处理(提取期间)中,相关的解析(例如无效的字幕数据)和加载错误(例如 HTTP 404)通过
- 修复了以下 bug:在多时段 DASH 流中,如果播放列表项或时段的时长与实际内容不符,可能会导致内容末尾出现画面冻结 (#1698)。
- 向
SntpClient添加了一个 setter,用于设置自上次更新以来客户端重新初始化的最长经过时间 (#1794)。
- 现在,可以针对每个媒体文件调用
- 转换器:
- 添加
SurfaceAssetLoader,它支持通过Surface将视频数据排入 Transformer 的队列。 ImageAssetLoader通过AssetLoader.onError报告不受支持的输入,而不是抛出IllegalStateException。- 强制要求使用
MediaItem.Builder.setImageDurationMs设置图片时长,以便导出图片。 - 添加了对音频 EditedMediaItem 序列中空隙的导出支持。
- 添加
- 轨道选择:
DefaultTrackSelector:在其他因素相同的情况下,优先选择基于对象的音频,而不是基于声道的音频。
- 提取器:
- 允许
Mp4Extractor和FragmentedMp4Extractor识别后续样本未用作参考的 H264 样本。 - 添加了用于在
AmrExtractor中启用基于索引的跳转的选项。 - 将有效帧之间超过 128kB 的 MP3 文件视为已截断(而非无效)。这意味着,如果文件末尾包含非 MP3 数据,且没有其他元数据来指示 MP3 字节的长度,现在会在 MP3 数据末尾停止播放,而不是失败并显示
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}(#1563)。 - 修复了在 MP4 文件中处理编辑列表时,非关键帧媒体起始位置的前贴片广告样本处理问题 (#1659)。
- 通过使用
Mp4Extractor和FragmentedMp4Extractor中mdhd框的媒体时长,改进了帧速率计算 (#1531)。 - 修复了 MP4 编辑列表中
media_time的缩放比例不正确的问题。虽然segment_duration已经使用影片时间标度正确缩放,但现在media_time会使用轨道时间标度正确缩放,如 MP4 格式标准 (#1792) 所指定。 - 在针对具有修改列表的 MP4 的
endIndices计算中处理无序帧 (#1797)。 - 修复了 MP4 文件
mdhd框中的媒体时长解析问题,以处理-1值 (#1819)。 - 添加了对识别 H.263 视频的 MP4 文件中的
h263框的支持 (#1821)。 - 添加了 AC-4 Level-4 ISO 基本媒体文件格式支持 (#1265)。
- 允许
- DataSource:
- 更新了
HttpEngineDataSource,允许从版本 S 扩展 7(而非 API 级别 34)开始使用 (#1262)。 DataSourceContractTest:断言DataSource.getUri()会返回解析后的 URI(如文档中所述)。如果此 URI 与请求的 URI 不同,测试可以使用新的DataSourceContractTest.TestResource.Builder.setResolvedUri()方法来指明这一点。DataSourceContractTest:断言在对open()的调用失败(由于“未找到”资源)之后以及在后续close()调用之前,DataSource.getUri()和getResponseHeaders()会返回其“打开”值。- 通过替换
DataSourceContractTest.getNotFoundResources(),测试子类可以提供多个“未找到”资源,还可以提供任何预期的标头。这样可以区分 HTTP 404(带有标头)和“未找到服务器”(无标头)。
- 通过替换
- 更新了
- 音频:
- 如果媒体中存在 CTA-2075 响度元数据,则在编解码器上自动配置该元数据。
- 确保在跳转时音量平稳降低。
- 修复了在跳转时可能会出现爆音的问题。
- 修复了 Sonic 的时间拉伸/音高变换算法的截断误差累积问题。
- 修复了
SpeedChangingAudioProcessor中导致输出帧丢失的 bug。
- 视频:
MediaCodecVideoRenderer会避免解码既不渲染也不被其他样本用作参考的样本。- 在 API 35 及更高级别中,
MediaCodecAdapter现在可能会在configure中收到nullSurface,并调用新方法detachOutputSurface来移除之前设置的Surface(如果编解码器支持此操作 [MediaCodecInfo.detachedSurfaceSupported])。 - 在处理
onOutputFormatChanged时,使用MediaCodecAdapter提供的像素宽高比值(如果提供)(#1371)。 - 针对 Galaxy Tab S7 FE 上的设备问题添加了权宜解决方法,该问题会导致 60fps 安全 H264 流被标记为不受支持 (#1619)。
- 针对在最后一个样本后卡住且不返回流结束信号的编解码器添加了权宜解决方法。
- 文本:
- 添加了自定义
VoiceSpan并为 WebVTT 语音 span 填充了该 span (#1632)。 - 确保显示 HLS 中具有非常大的字幕时间戳(以微秒表示并乘以
90,000MPEG 时基时会溢出 64 位long)的 WebVTT (#1763)。 - 支持杜比视界内容中的 CEA-608 字幕 (#1820)。
- 修复了启用 CEA-608 字幕时 DASH 多时段直播播放卡住的问题 (#1863)。
- 添加了自定义
- 元数据:
- 将
C.TRACK_TYPE_METADATA类型分配给包含 icy 或 vnd.dvb.ait 内容的轨道。
- 将
- 图片:
- 添加了
ExternallyLoadedImageDecoder,以便简化与外部图片加载库(如 Glide 或 Coil)的集成。
- 添加了
- DataSource:
- 添加了
FileDescriptorDataSource,这是一种可用于从FileDescriptor中读取数据的新DataSource(#3757)。
- 添加了
- 效果:
- 针对轻微的
SurfaceTexture缩放问题添加了DefaultVideoFrameProcessor解决方法。SurfaceTexture可能包含一个小的缩放比例,用于剪裁掉剪裁缓冲区边缘周围的 1 纹素边框。现在,此问题已得到处理,输出结果更接近预期。 - 加快
DefaultVideoFrameProcessor.queueInputBitmap()。因此,使用Transformer将图片导出为视频的速度更快。
- 针对轻微的
- IMA 扩展程序:
- 修复了以下 bug:清空播放列表可能会导致
ImaServerSideAdInsertionMediaSource中出现ArrayIndexOutOfBoundsException。 - 修复了以下 bug:在播放完最后一个中贴片广告后,不含前贴片广告的服务器端插入 DAI 视频流可能会导致
ArrayIndexOutOfBoundsException(#1741)。
- 修复了以下 bug:清空播放列表可能会导致
- 会话:
- 添加了
MediaButtonReceiver.shouldStartForegroundService(Intent),以允许应用通过替换此方法来抑制传入的用于恢复播放的播放命令。默认情况下,该服务始终处于启动状态,并且无法在系统不因ForegroundServiceDidNotStartInTimeException而使该服务崩溃的情况下抑制播放 (#1528)。 - 修复了以下 bug:在连接到旧版服务时,从
MediaBrowser发送的自定义命令会被分派到MediaSessionCompat.Callback,而不是该方法的MediaBrowserServiceCompat变体。这导致MediaBrowser无法接收旧版服务发回的实际返回值 (#1474)。 - 处理在为媒体按钮 intent 设置广播接收器时由某些制造商的设备抛出的
IllegalArgumentException(#1730)。 - 为媒体文件添加命令按钮。这会添加 Media3 API,用于实现旧版库中名为
Custom browse actions的功能,并使用MediaBrowserCompat。请注意,借助 Media3,MediaBrowser和MediaController均可使用媒体项的命令按钮。请参阅实现自定义浏览操作。 * 修复了以下 bug:在请求play()后,Media3 控制器有时无法让会话应用启动前台服务。 - 限制
CommandButton.Builder.setIconUri仅接受内容 URI。 - 连接到旧版
MediaBrowserCompat时,将 Media3 浏览器的连接提示传递给初始MediaBrowserCompat。 该服务可以在首次调用onGetRoot()时接收作为根提示传入的连接提示。 - 修复了以下 bug:在浏览器订阅
parentid后,连接到旧版浏览器服务的MediaBrowser未收到该服务发送的错误。 - 改进了互操作性行为,使连接到旧版
MediaBrowserService的 Media3 浏览器在订阅父级时不会两次请求parentId的子级。
- 添加了
- 界面:
- 由于基于 XML 的共享过渡存在问题,因此在 Compose 中使用
PlayerView的AndroidView解决方法中,拉伸/剪裁视频功能改为选择启用。在AndroidView中使用PlayerView的应用需要调用PlayerView.setEnableComposeSurfaceSyncWorkaround才能选择启用(#1237、#1594)。 - 向
PlayerView添加了setFullscreenButtonState,以便按需(即带外,而不是对点击互动做出响应)更新全屏按钮的图标(#1590、#184)。 - 修复了以下 bug:如果存在应用定义的文字轨道选择偏好设置,则文字选择中的“None”选项不起作用。
- 由于基于 XML 的共享过渡存在问题,因此在 Compose 中使用
- DASH 扩展程序:
- 添加了对从片段中间开始的周期的支持 (#1440)。
- 流畅的流式传输扩展程序:
- 修复了播放带有文本轨道的 SmoothStreaming 流时出现的
Bad magic number for Bundle错误 (#1779)。
- 修复了播放带有文本轨道的 SmoothStreaming 流时出现的
- RTSP 扩展程序:
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- 添加了 IAMF 解码器模块,该模块支持使用 libiamf 原生库合成音频,从而播放包含 IAMF 轨道的 MP4 文件。
- 支持立体声布局以及 5.1 空间化播放,并可选择启用头部追踪,但目前不支持双声道播放。
- 为 Android 15 上的解码器扩展添加了 16 KB 页面支持 (#1685)。
- 添加了 IAMF 解码器模块,该模块支持使用 libiamf 原生库合成音频,从而播放包含 IAMF 轨道的 MP4 文件。
- Cast 扩展程序:
- 在 CastSession 断开连接后停止清理时间轴,这样发送器应用就可以在断开连接后在本地恢复播放。
- 在提供
Context时填充 CastPlayer 的DeviceInfo。这样可以将MediaSession关联到RoutingSession,这是集成输出切换器所必需的 (#1056)。
- 测试实用程序:
DataSourceContractTest现在包含用于验证以下内容的测试:- 输入流
read position已更新。 - 输出缓冲区
offset已正确应用。
- 输入流
- 演示版应用
- 解决了演示短视频应用中的内存泄漏问题 (#1839)。
- 移除了已废弃的符号:
- 移除了已废弃的
Player.hasPrevious、Player.hasPreviousWindow()。 请改用Player.hasPreviousMediaItem()。 - 移除了已废弃的
Player.previous()方法。改用Player.seekToPreviousMediaItem()。 - 移除了已废弃的
DrmSessionEventListener.onDrmSessionAcquired方法。 - 移除了已废弃的
DefaultEncoderFactory构造函数。改用DefaultEncoderFactory.Builder。
- 移除了已废弃的
版本 1.5.0-rc02
2024 年 11 月 19 日
使用 1.5.0 稳定版。
版本 1.5.0-rc01
2024 年 11 月 13 日
使用 1.5.0 稳定版。
版本 1.5.0-beta01
2024 年 10 月 30 日
使用 1.5.0 稳定版。
版本 1.5.0-alpha01
2024 年 9 月 10 日
使用 1.5.0 稳定版。
版本 1.4.0
版本 1.4.1
2024 年 8 月 27 日
发布了 androidx.media3:media3-*:1.4.1。版本 1.4.1 包含这些提交内容。
- ExoPlayer:
- 提取器:
- MP3:根据
Info帧中的长度字段正确忽略尾随的非 MP3 数据,从而修复Searched too many bytes错误 (#1480)。
- MP3:根据
- 文本:
- TTML:修复了对百分比
tts:fontSize值的处理,以确保它们能从具有百分比tts:fontSize值的父节点正确继承。 - 修复了
LegacySubtitleUtil中因错误处理请求的输出开始时间大于或等于Subtitle中的最终事件时间的情况而导致的IndexOutOfBoundsException问题 (#1516)。
- TTML:修复了对百分比
- DRM:
- 修复了在播放 L1 Widevine 内容时 API 31 及更高版本的设备上出现的
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE错误。此错误是由于框架MediaDrm.requiresSecureDecoder方法 (#1603) 的实现不完整所致。
- 修复了在播放 L1 Widevine 内容时 API 31 及更高版本的设备上出现的
- 效果:
- 向
GlObjectsProvider添加了release()方法。
- 向
- 会话:
- RTSP 扩展程序:
- 在 SDP 解析中跳过无效的媒体说明 (#1087)。
版本 1.4.0
2024 年 7 月 25 日
发布了 androidx.media3:media3-*:1.4.0。版本 1.4.0 包含这些提交内容。
- 通用库:
- 将假定的空操作跳转调用转发到受保护的
BasePlayer.seekTo()和SimpleBasePlayer.handleSeek()方法,而不是忽略它们。如果您要在自定义播放器中实现这些方法,则可能需要使用mediaItemIndex == C.INDEX_UNSET处理这些额外的调用。 - 移除了对增强型 Java 8 脱糖的编译依赖项 (#1312)。
- 确保对于非图片
MediaItem,传递给MediaItem.Builder.setImageDurationMs()的时长会被忽略(如文档中所述)。 - 添加
Format.customData以存储应用提供的有关Format实例的自定义信息。
- 将假定的空操作跳转调用转发到受保护的
- ExoPlayer:
- 添加了
BasePreloadManager,它会根据其rankingData定义的优先级协调多个来源的预加载。您可以通过扩展此类进行自定义。添加DefaultPreloadManager,它使用PreloadMediaSource将来源的媒体样本预加载到内存中,并使用一个整数rankingData来指示界面上某个项的索引。 - 向
LoadControl的大多数方法添加了PlayerId,使LoadControl实现能够支持多个播放器。 - 移除了
Buffer.isDecodeOnly()和C.BUFFER_FLAG_DECODE_ONLY。无需设置此标志,因为渲染器和解码器会根据时间戳决定是否跳过缓冲区。自定义Renderer实现应检查缓冲时间是否至少为BaseRenderer.getLastResetPositionUs(),以决定是否应显示样本。自定义SimpleDecoder实现可以根据需要检查isAtLeastOutputStartTimeUs(),或使用DecoderOutputBuffer.shouldBeSkipped标记其他缓冲区以跳过它们。 - 允许
TargetPreloadStatusControl.getTargetPreloadStatus(T)返回 null 值,以指示不使用给定的rankingData预加载MediaSource。 - 将
remove(MediaSource)添加到BasePreloadManager中。 - 将
reset()添加到BasePreloadManager,以释放所有保留的来源,同时保留预加载管理器实例。 - 添加了
ExoPlayer.setPriority()(和Builder.setPriority()),用于定义PriorityTaskManager中使用的优先级值,以及从 API 35 开始的 MediaCodec 重要性。 - 修复了更新上次重新缓冲时间时导致 CMCD 中出现不正确的
bs(缓冲区耗尽)键的问题 (#1124)。 - 添加了
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource),用于指明来源已加载到末尾。这样,DefaultPreloadManager和自定义PreloadMediaSource.PreloadControl实现就可以预加载下一个来源或执行其他操作。 - 修复了在内容末尾跳过静音部分可能会触发播放异常的 bug。
- 将
clear添加到PreloadMediaSource以舍弃预加载期。 - 添加了新的错误代码
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED,该代码在编解码器资源被回收用于更高优先级的任务时使用。 - 允许
AdsMediaSource在初始内容媒体准备工作完成之前加载前贴片广告 (#1358)。 - 修复了以下 bug:在原始时段已从清单中移除后,重新准备多时段 DASH 直播时,播放会移至
STATE_ENDED。 - 在
PreloadMediaSource.PreloadControl中,将onTimelineRefreshed()重命名为onSourcePrepared(),将onPrepared()重命名为onTracksSelected()。同时相应地重命名DefaultPreloadManager.Stage中的 IntDef。 - 添加了对动态调度的实验性支持,以便更好地使工作与 CPU 唤醒周期保持一致,并延迟唤醒,直到渲染程序可以继续。
您可以在设置 ExoPlayer 实例时使用
experimentalSetDynamicSchedulingEnabled()启用此功能。 - 添加了
Renderer.getDurationToProgressUs()。Renderer可以实现此方法,以向 ExoPlayer 返回播放必须提前的时长,以便渲染器继续播放。如果使用experimentalSetDynamicSchedulingEnabled()设置ExoPlayer,则ExoPlayer在计算安排其工作任务的时间时会调用此方法。 - 添加
MediaCodecAdapter#OnBufferAvailableListener,以便在输入和输出缓冲区可供MediaCodecRenderer使用时发出提醒。MediaCodecRenderer在收到这些回调时会向ExoPlayer发出信号,如果ExoPlayer设置了experimentalSetDynamicSchedulingEnabled(),则ExoPlayer会安排其工作循环,因为渲染器可以取得进展。 - 为
LoadControl方法使用数据类,而不是单个参数。 - 添加
ExoPlayer.isReleased()以检查是否已调用Exoplayer.release()。 - 添加了
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs(),用于配置seekToPrevious()查找上一项的最大位置 (#1425)。 - 修复了一些音频焦点不一致的问题,例如在播放器暂停时未报告完全或暂时失去焦点 (#1436)。
- 修复了因提取器在初始准备步骤后报告其他轨道而可能导致的
IndexOutOfBoundsException(#1476)。 ExoPlayer.setVideoEffect()中的Effects将接收已移除渲染器偏移的时间戳 (#1098)。- 修复了在处理预读到另一个播放列表项时发生的播放器错误时可能出现的
IllegalArgumentException(#1483)。
- 添加了
- 转换器:
- 向
ExportResult添加audioConversionProcess和videoConversionProcess,以指明输出文件中相应轨道的制作方式。 - 放宽剪辑优化 H.264 级别检查。
- 添加了对在序列中切换 SDR 和 HDR 输入媒体的支持。
- 添加了对合成级音频效果的支持。
- 添加了对将 Ultra HDR 图片转码为 HDR 视频的支持。
- 修复了
DefaultAudioMixer在重置和重复使用后无法输出正确字节数的问题。 - 解决了解码器 bug,该 bug 会导致在处理 PCM 输入时音频声道数上限为立体声。
- 在
ExoPlayerAssetLoader中选择轨道时,请忽略音频声道数限制,因为这些限制仅适用于播放。 - 将
androidx.media3.transformer.Muxer接口替换为androidx.media3.muxer.Muxer,并移除androidx.media3.transformer.Muxer。 - 修复了从内容 URI 架构加载 HEIC 图片的问题。 (#1373)。
- 在
AudioGraphInput中调整音轨时长,以改善音视频同步。 - 移除
ExportResult.processedInputs字段。如果您使用此字段来提供编解码器详细信息,请改用DefaultDecoderFactory.listener。如果发生编解码器异常,ExportException.codecInfo中会提供编解码器详细信息。
- 向
- 提取器:
- MPEG-TS:通过将数据流的最后一个访问单元传递到样本队列,前滚确保渲染最后一帧的更改 (#7909)。纳入了修复程序,以解决仅 I 帧 HLS 流(#1150) 和 H.262 HLS 流 (#1126) 中出现的问题。
- MP3:优先采用
Info帧中的数据大小,而不是底层数据流报告的大小(例如文件大小或 HTTPContent-Length标头)。 这有助于从恒定比特率跳转计算中排除不可播放的尾部数据(例如专辑封面),从而使跳转更准确 (#1376)。 - MP3:使用
Info帧(如果存在)中的帧数和其他数据来计算固定比特率跳转的平均比特率,而不是根据Info帧之后的帧的比特率进行推断,因为后者可能人为地偏小,例如PCUT帧 (#1376)。 - 修复了 AVI 容器中的 PCM 音频格式提取问题。
- 音频:
- 修复了 DTS:X Profile 2 编码属性,以便进行透传播放 (#1299)。
- 对于分流播放,请在调用
AudioTrack.stop()之前重置DefaultAudioSink中用于跟踪数据流完成情况的字段,以便AudioTrack.StreamEventCallback#onPresentationEnded正确识别所有待处理数据何时已播放完毕。 - 修复了
SilenceSkippingAudioProcessor中的一个 bug,即不同音频格式(例如立体声到单声道)之间的转换可能会导致处理器抛出异常 (#1352)。 - 实现
MediaCodecAudioRenderer.getDurationToProgressUs(),以便 ExoPlayer 在 MediaCodecAudioRenderer 可以取得进展时动态安排其主工作循环。
- 视频:
- 修复了在播放过程中切换 Surface 时
Listener.onRenderedFirstFrame()到达过早的问题。 - 修复了杜比视界的解码器回退逻辑,以在需要时使用兼容的 AV1 解码器 (#1389)。
- 修复了可能因在播放过程中启用视频渲染程序而导致的编解码器异常。
- 修复了在播放过程中切换 Surface 时
- 文本:
- 修复了在跳转位置之前开始的字幕会被跳过的问题。 此问题仅在 Media3 1.4.0-alpha01 中引入。
- 更改默认字幕解析行为,使其在提取期间(而非渲染期间)发生(如需了解提取和渲染之间的区别,请参阅 ExoPlayer 的架构图)。
- 您可以通过同时调用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)和TextRenderer.experimentalSetLegacyDecodingEnabled(true)来替换此更改。如需了解如何将这些组件插入ExoPlayer实例,请参阅有关自定义的文档。 这些方法(以及对旧版字幕解码的所有支持)将在未来版本中移除。 - 具有自定义
SubtitleDecoder实现的应用需要更新这些实现,改为实现SubtitleParser(以及SubtitleParser.Factory,而不是SubtitleDecoderFactory)。
- 您可以通过同时调用
- PGS:修复了游程解码问题,将
0解析为颜色索引,而不是字面颜色值 (#1367)。 - CEA-708:忽略
rowLock值。CEA-708-E S-2023 规范规定,无论数据流中存在的值如何,都应假定rowLock和columnLock均为 true(columnLock支持未实现,因此实际上假定始终为 false)。- 此功能最初包含在
1.3.0-alpha01版本说明中,但在1.3.0-rc01版本发布之前,此更改被意外还原。此问题现已解决,因此该变更已恢复。
- 此功能最初包含在
- CEA-708:避免 ExoPlayer 对“设置画笔位置”命令的简单处理导致添加重复的换行符 (#1315)。
- 修复了当 WebVTT 字幕样本不包含任何提示(例如,作为 DASH 视频流的一部分)时,
LegacySubtitleUtil抛出IllegalArgumentException的问题 (#1516)。
- 元数据:
- 图片:
- 添加了对非方形 DASH 缩略图网格的支持 (#1300)。
- 为 API 34 及更高版本添加了对 AVIF 的支持。
- 允许将
null作为ExoPlayer.setImageOutput()的参数,以清除之前设置的ImageOutput。
- DataSource:
- 实现对
android.resource://package/id原始资源 URI 的支持,其中package与当前应用的软件包不同。 之前没有记录过这种方法,但与按名称访问相比,这是一种更高效的访问其他软件包中资源的方法。 - 在
DataSpec构造函数中,主动检查url是否不为 null。此参数已被注解为非 null。 - 允许
ByteArrayDataSource在open()期间将 URI 解析为字节数组,而不是在构建时进行硬编码 (#1405)。
- 实现对
- DRM:
- 允许在
DefaultDrmSessionManagerProvider上设置LoadErrorHandlingPolicy(#1271)。
- 允许在
- 效果:
- 支持在
SpeedChangeEffect中的同一EditedMediaItem或Composition内进行多次速度更改。 - 支持从 Ultra HDR 位图输入中输出 HLG 和 PQ。
- 添加了对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,这改进了 ExoPlayer.setVideoEffect 和 Transformer 的调试 SurfaceView 中的 HLG Surface 输出。
- 更新叠加层矩阵实现,通过翻转
setOverlayFrameAnchor()中应用的 x 和 y 值,使其与文档保持一致。如果使用OverlaySettings.Builder.setOverlayFrameAnchor(),请将 x 和 y 值乘以-1,以翻转它们。 - 修复了
TimestampWrapper与ExoPlayer#setVideoEffects搭配使用时会崩溃的 bug (#821)。 - 将默认 SDR 颜色工作空间从线性颜色更改为电信号 BT 709 SDR 视频。此外,还提供第三个选项,用于保留原始色彩空间。
- 允许定义 EditedMediaItemSequences 的不确定 Z 顺序 (#1055)。
- 在不同的 HDR 内容中保持一致的亮度范围(使用 HLG 范围)。
- 添加了对 HDR 内容上的 Ultra HDR(位图)叠加层的支持。
- 允许在 API 26 之前使用
SeparableConvolution效果。 - 移除了未使用的
OverlaySettings.useHdr,因为叠加层和帧的动态范围必须匹配。 - 为
TextOverlay添加了 HDR 支持。可以使用OverlaySettings.Builder.setHdrLuminanceMultiplier()调整文本叠加层的亮度。
- 支持在
- IMA 扩展程序:
- 将应用播放 DAI 广告流所需的 API 升级为稳定版。
- 向
ImaServerSideAdInsertionMediaSource.AdLoader添加了replaceAdTagParameters(Map <String, String>),以便在运行时替换广告代码参数。 - 修复了在广告播放期间发生播放器错误时未调用
VideoAdPlayer.VideoAdPlayerCallback.onError()的 bug (#1334)。 - 将 IMA SDK 版本提升至 3.33.0,以修复使用
data://广告代码 URI 时出现的NullPointerException(#700)。
- 会话:
- 将
CommandButton.enabled的默认值更改为true,并确保即使关联的命令可用,控制器的值也可以保持为 false。 - 为
CommandButton添加了图标常量,应使用这些常量,而不是自定义图标资源。 - 添加了
MediaSessionService.isPlaybackOngoing(),以便应用查询是否需要在onTaskRemoved()中停止服务 (#1219)。 - 添加
MediaSessionService.pauseAllPlayersAndStopSelf(),以便轻松暂停所有会话的播放,并调用stopSelf()来终止MediaSessionService的生命周期。 - 替换
MediaSessionService.onTaskRemoved(Intent),以提供安全的默认实现,在播放正在进行时让服务在前台运行,否则停止服务。 - 通过不将时长设置到平台会话元数据中,在直播媒体通知中隐藏进度条 (#1256)。
- 将
MediaMetadata的转换与MediaDescriptionCompat保持一致,以便在选择元数据属性时使用与 media1 相同的首选顺序和逻辑。 - 添加了
MediaSession.sendError(),以便向 Media3 控制器发送非严重错误。使用通知控制器(请参阅MediaSession.getMediaNotificationControllerInfo())时,自定义错误用于将平台会话的PlaybackState更新为具有给定错误信息的错误状态 (#543)。 - 添加
MediaSession.Callback.onPlayerInteractionFinished(),以便在来自特定控制器的玩家互动系列结束时通知会话。 - 添加
SessionError,并在SessionResult和LibraryResult中使用它(而不是错误代码),以提供有关错误的更多信息以及如何解决错误(如果可能)。 - 发布 media3 控制器测试应用的代码,该应用可用于测试与发布媒体会话的应用之间的互动。
- 将传递给 media3 的
MediaSession[Builder].setSessionExtras()的 extra 传播到 media1 控制器的PlaybackStateCompat.getExtras()。 - 将严重错误和非严重错误映射到平台会话,以及从平台会话映射严重错误和非严重错误。
PlaybackException会映射到PlaybackStateCompat的严重错误状态。发送到媒体通知控制器且包含MediaSession.sendError(ControllerInfo, SessionError)的SessionError会映射到PlaybackStateCompat中的非严重错误,这意味着错误代码和消息已设置,但平台会话的状态仍不同于STATE_ERROR。 - 允许按控制器设置会话活动,以覆盖全局会话活动。您可以在连接时通过使用
AcceptedResultBuilder.setSessionActivivty(PendingIntent)创建ConnectionResult,为控制器定义会话 activity。连接后,可以使用MediaSession.setSessionActivity(ControllerInfo, PendingIntent)更新会话 activity。 - 改进了对
MediaLibrarySession.Callback的调用的错误复制。 现在,您可以使用MediaLibrarySession.Builder.setLibraryErrorReplicationMode()选择错误类型或停用默认启用的错误复制,从而配置错误复制。
- 将
- 界面:
- 下载内容:
- 确保
DownloadHelper不会泄露未释放的Renderer实例,否则最终可能会导致应用因IllegalStateException: Too many receivers, total of 1000, registered for pid而崩溃 (#1224)。
- 确保
- Cronet 扩展程序:
- 修复了
CronetDataSource中的SocketTimeoutException。在某些 Cronet 版本中,回调提供的请求并不总是相同的。这会导致回调无法完成,并且请求超时 (https://issuetracker.google.com/328442628)。
- 修复了
- HLS 扩展程序:
- 修复了以下 bug:等待不连续性的待处理 EMSG 样本在
HlsSampleStreamWrapper中以不正确的偏移量委托,从而导致IndexOutOfBoundsException或IllegalArgumentException(#1002)。 - 修复了 LL-HLS 流的非主要播放列表不断重新加载的 bug (#1240)。
- 修复了以下 bug:为具有初始化片段的 HLS 启用 CMCD 会导致
Source Error和IllegalArgumentException。 - 修复了在直播播放期间非主要播放列表未刷新的 bug (#1240)。
- 修复了为 HLS 直播启用 CMCD 会导致
ArrayIndexOutOfBoundsException的 bug (#1395)。
- 修复了以下 bug:等待不连续性的待处理 EMSG 样本在
- DASH 扩展程序:
- Cast 扩展程序:
- 修复了以下 bug:将
MediaQueueItem的专辑标题转换为 Media3 媒体文件中的艺术家 (#1255)。
- 修复了以下 bug:将
- 测试实用程序:
- 在
FakeRenderer中实现onInit()和onRelease()。 - 将
TestPlayerRunHelper.runUntil()/playUntil()方法更改为在发生非严重错误(例如向AnalyticsListener.onVideoCodecError()报告的错误)时失败。使用新的TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()方法链可停用此行为。
- 在
- 演示版应用:
- 在短视频演示应用中使用
DefaultPreloadManager。 - 允许通过命令行使用
Intent参数设置重复模式 (#1266)。 - 如果设备支持,请使用
HttpEngineDataSource作为HttpDataSource。
- 在短视频演示应用中使用
- 移除了已废弃的符号:
- 移除了
CronetDataSourceFactory。请改用CronetDataSource.Factory。 - 移除了部分
DataSpec构造函数。请改用DataSpec.Builder。 - 从
DefaultHttpDataSource、OkHttpDataSource和CronetDataSource中移除了setContentTypePredicate(Predicate)方法。请改为在每个XXXDataSource.Factory上使用等效方法。 - 移除了
OkHttpDataSource构造函数和OkHttpDataSourceFactory。 请改用OkHttpDataSource.Factory。 - 移除了
PlayerMessage.setHandler(Handler)。请改用setLooper(Looper)。 - 移除
Timeline.Window.isLive字段。请改用isLive()方法。 - 移除了
DefaultHttpDataSource构造函数。改用DefaultHttpDataSource.Factory。 - 移除了
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS。改用DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS。 - 移除了
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)。请改用MediaCodecInfo.canReuseCodec(Format, Format)。 - 移除了
DrmSessionManager.DUMMY和getDummyDrmSessionManager()方法。请改用DrmSessionManager.DRM_UNSUPPORTED。 - 移除
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)、AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)、AudioRendererEventListener.onAudioInputFormatChanged(Format)、VideoRendererEventListener.onVideoInputFormatChanged(Format)。请改用接受DecoderReuseEvaluation的重载。 - 移除了
RendererSupport.FormatSupportIntDef 以及FORMAT_HANDLED、FORMAT_EXCEEDS_CAPABILITIES、FORMAT_UNSUPPORTED_DRM、FORMAT_UNSUPPORTED_SUBTYPE、FORMAT_UNSUPPORTED_TYPE常量。请改用androidx.media3.common.C中的等效 IntDef 和常量(例如C.FORMAT_HANDLED)。 - 移除
Bundleable接口。这包括移除所有Bundleable.Creator<Foo> CREATOR常量字段。调用方应改为对每种类型使用Bundle toBundle()和static Foo fromBundle(Bundle)方法。
- 移除了
版本 1.4.0-rc01
2024 年 7 月 10 日
使用 1.4.0 稳定版。
版本 1.4.0-beta01
2024 年 6 月 26 日
使用 1.4.0 稳定版。
版本 1.4.0-alpha02
2024 年 6 月 7 日
使用 1.4.0 稳定版。
版本 1.4.0-alpha01
2024 年 4 月 17 日
使用 1.4.0 稳定版。
版本 1.3.0
版本 1.3.1
2024 年 4 月 11 日
发布了 androidx.media3:media3-*:1.3.1。版本 1.3.1 包含这些提交内容。
- 通用库:
- 添加
Format.labels以允许本地化标签或其他替代标签。
- 添加
- ExoPlayer:
- 转换器:
- 针对 API 30 之前
MediaMuxer不支持负呈现时间戳而抛出的异常添加了解决方法。
- 针对 API 30 之前
- 轨道选择:
DefaultTrackSelector:优先选择帧速率“合理”(>=10fps) 的视频轨道,而不是帧速率较低或未设置帧速率的视频轨道。这可确保播放器在从动态照片中提取的 MP4 中选择“真实”视频轨道,这些 MP4 可能包含两个 HEVC 轨道,其中一个轨道的分辨率较高,但帧数非常少 (#1051)。
- 提取器:
- 音频:
- 如果音轨在分流模式下无法初始化,则通过停用分流来允许渲染程序恢复。
- 视频:
- 文本:
- WebVTT:防止直接连续的提示从
WebvttParser.parse创建虚假的额外CuesWithTiming实例 (#1177)。
- WebVTT:防止直接连续的提示从
- DRM:
- 解决在某些 Android 14 设备上,
MediaDrm框架可能会抛出NoSuchMethodError而不是ResourceBusyException或NotProvisionedException的问题 (#1145)。
- 解决在某些 Android 14 设备上,
- 效果:
- 通过转换色彩空间,改进了 PQ 到 SDR 的色调映射。
- 会话:
- 界面:
- 如果
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 依赖项升级到最新版本所必需的。 - 当
artworkUri和artworkData中至少有一个不为 null 时,在MediaMetadata.Builder.populate(MediaMetadata)中填充这两个值 (#964)。
- 实现对
- ExoPlayer:
- 添加了
PreloadMediaSource和PreloadMediaPeriod,以便应用在播放前在特定起始位置预加载内容媒体源。PreloadMediaSource负责准备内容媒体来源以接收Timeline、准备和缓存给定起始位置的时段、选择轨道以及加载该时段的媒体数据。应用通过实现PreloadMediaSource.PreloadControl来控制预加载进度,并将预加载的来源设置为播放器进行播放。 - 添加了
ExoPlayer.setImageOutput,以允许应用设置ImageRenderer.ImageOutput。 - 默认情况下,
DefaultRenderersFactory现在会向播放器提供ImageRenderer,其中ImageOutput和ImageDecoder.Factory.DEFAULT为 null。 - 跳过静音时发出
Player.Listener.onPositionDiscontinuity事件 (#765)。 - 添加了对在提取期间解析字幕的实验性支持。您可以使用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()启用此功能。 - 支持使用
PreloadMediaSource的自适应媒体来源。 - 使用 HttpEngine API 实现
HttpEngineDataSource(一种HttpDataSource)。 - 防止子类化
CompositeSequenceableLoader。此组件之前已设为可扩展,但从未在库中进行子类化。您可以使用装饰器模式封装实例并实现自定义CompositeSequenceableLoaderFactory,从而进行自定义。 - 修复了重复相同时间会导致此项中的元数据被清除的问题 (#1007)。
- 将
BundledChunkExtractor.Factory和DefaultHlsExtractorFactory上的experimentalSetSubtitleParserFactory方法重命名为setSubtitleParserFactory,并禁止传递null。使用新的experimentalParseSubtitlesDuringExtraction(boolean)方法控制解析行为。 - 添加了对自定义提取期间使用的
SubtitleParser.Factory的支持。这可以通过MediaSource.Factory.setSubtitleParserFactory()实现。 - 向通过
MergingMediaSource生成的所有Format.id字段添加来源前缀。这有助于确定哪个来源生成了Format(#883)。 - 修复了用于验证自定义通用媒体客户端数据 (CMCD) 键名称的正则表达式,将其修改为仅检查连字符 (#1028)。
- 停止对 CMCD 查询参数进行双重编码 (#1075)。
- 添加了
- 转换器:
- 轨道选择:
- 添加了
DefaultTrackSelector.selectImageTrack以启用图片轨道选择。 - 添加
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled,以确定在图片轨道和视频轨道都可用时是否选择图片轨道。默认值为false,这意味着优先选择视频轨道。
- 添加了
- 提取器:
- 向 MP4 提取器添加了额外的 AV1C 解析,以检索
ColorInfo.colorSpace、ColorInfo.colorTransfer和ColorInfo.colorRange值 (#692)。 - MP3:对具有
Info标头(与Xing标头等效的 CBR)的文件使用恒定比特率 (CBR) 搜索。以前,我们使用Info标头中的跳转表,但与忽略该表并假设文件为 CBR 相比,这会导致精确跳转模式的精确度降低。 - MPEG2-TS:添加了对 DTS、DTS-LBR 和 DTS:X Profile2 的支持 (#275)。
- 从 TS 描述符中提取音频类型,并将其映射到角色标志,以便用户做出更明智的音轨选择 (#973)。
- 向 MP4 提取器添加了额外的 AV1C 解析,以检索
- 音频:
- 视频:
- 更改接受
VideoFrameProcessor.Factory参数的MediaCodecVideoRenderer构造函数,并将其替换为接受VideoSinkProvider参数的构造函数。想要注入自定义VideoFrameProcessor.Factory的应用可以实例化使用自定义VideoFrameProcessor.Factory的CompositingVideoSinkProvider,并将视频接收器提供程序传递给MediaCodecVideoRenderer。
- 更改接受
- 文本:
- 修复了位图提示的序列化问题,以解决使用
DefaultExtractorsFactory.setTextTrackTranscodingEnabled时的Tried to marshall a Parcel that contained Binder objects错误 (#836)。 - CEA-708:忽略
rowLock值。CEA-708-E S-2023 规范规定,无论数据流中存在的值如何,都应假定rowLock和columnLock均为 true(columnLock支持未实现,因此实际上假定始终为 false)。
- 修复了位图提示的序列化问题,以解决使用
- 图片:
- 添加了对 DASH 缩略图的支持。网格图片会被剪裁,并且系统会在接近呈现时间时向
ImageOutput提供各个缩略图。
- 添加了对 DASH 缩略图的支持。网格图片会被剪裁,并且系统会在接近呈现时间时向
- DRM:
- 默认情况下,立即播放 DRM 内容中的“清晰前导”未加密样本,即使后续加密样本的密钥尚未准备就绪。如果播放位置到达加密样本时密钥仍未准备就绪,则可能会导致播放中途停顿(但之前播放根本不会在此时间点开始)。此行为可通过
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey或DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys停用。- IMA 扩展程序:
- 修复了无法播放没有适当文件扩展名的 DASH 和 HLS 广告的问题。
- 默认情况下,立即播放 DRM 内容中的“清晰前导”未加密样本,即使后续加密样本的密钥尚未准备就绪。如果播放位置到达加密样本时密钥仍未准备就绪,则可能会导致播放中途停顿(但之前播放根本不会在此时间点开始)。此行为可通过
- 会话:
- 为 TV 应用停用双击检测 (#962)。
- 修复了仅包含非 null extra 的
MediaItem.RequestMetadata无法在媒体控制器和会话之间传输的问题。 - 向
MediaLibrarySession.Builder添加了仅接受Context(而非MediaLibraryService)的构造函数。
- HLS 扩展程序:
- 将
HlsMediaPeriod缩减为软件包私有可见性。不应从 HLS 软件包外部直接依赖此类型。 - 更高效地解析对片段开头的跳转 (#1031)。
- 将
- 解码器扩展程序(FFmpeg、VP9、AV1、MIDI 等):
- MIDI 解码器:忽略 SysEx 事件消息 (#710)。
- 测试实用程序:
- 不要暂停
TestPlayerRunHelper.playUntilPosition中的播放。测试会使播放保持在播放状态,但会暂停进度,直到测试能够添加断言和进一步的操作。
- 不要暂停
- 演示版应用:
- 添加了短视频演示模块,用于演示
PreloadMediaSource在短视频内容用例中的用法。
- 添加了短视频演示模块,用于演示
版本 1.3.0-rc01
2024 年 2 月 22 日
使用 1.3.0 稳定版。
版本 1.3.0-beta01
2024 年 2 月 7 日
使用 1.3.0 稳定版。
版本 1.3.0-alpha01
2024 年 1 月 15 日
使用 1.3.0 稳定版。
版本 1.2.0
版本 1.2.1
2024 年 1 月 9 日
- ExoPlayer:
- 转换器:
- 解决编码器在配置时因设置高运行速率而抛出异常的问题。
- 提取器:
- 音频:
- 修复了多次调用
SilenceSkippingAudioProcessor时 EOS 的处理问题 (#712)。
- 修复了多次调用
- 视频:
- 针对 Galaxy Tab S7 FE、Chromecast with Google TV 和 Lenovo M10 FHD Plus 上的设备问题添加了权宜解决方法,该问题会导致 60fps AVC 流被标记为不受支持 (#693)。
- 元数据:
- 修复了仅从具有大写键的 Vorbis 注释中填充
MediaMetadata的 bug (#876)。 - 在解析非常大的 ID3 帧时捕获
OutOfMemoryError,这意味着播放可以继续,只是没有标记信息,而不是完全无法播放。
- 修复了仅从具有大写键的 Vorbis 注释中填充
- DRM:
- 将针对虚假 ClearKey
https://default.url许可网址的权宜解决方法扩展到 API 33+(之前,该权宜解决方法仅适用于 API 33)(#837)。 - 修复了在没有将 Surface 附加到播放器的情况下,从加密内容切换到明文内容时出现的
ERROR_DRM_SESSION_NOT_OPENED问题。该错误是由于错误地使用安全解码器播放明文内容所致。
- 将针对虚假 ClearKey
- 会话:
- 界面:
- DASH 扩展程序:
- 在 DASH 清单中,将“f800”解析为 Dolby 的声道数 5 (#688)。
- 解码器扩展程序(FFmpeg、VP9、AV1、MIDI 等):
- Cast 扩展程序:
- 对
Timeline的创建进行排查,以避免在投屏设备上加载媒体失败时应用崩溃 (#708)。
- 对
版本 1.2.0
2023 年 11 月 15 日
- 通用库:
- 向
Log.Logger接口中的方法添加@Nullable Throwable参数。这些方法的message参数不再包含有关传递给Log.{d,i,w,e}()方法的Throwable的任何信息,因此如果需要,实现将需要手动附加此信息(可能使用Logger.appendThrowableString(String, Throwable))。 - 修复了 Kotlin 兼容性问题,即无法将可为 null 的泛型类型形参和可为 null 的数组元素类型检测为可为 null。例如
TrackSelectorResult和SimpleDecoder方法参数 (#6792)。 - 更改
Util.shouldShowPlayButton中的默认界面和通知行为,以便在播放暂时受到抑制(例如由于暂时失去音频焦点)时显示“播放”按钮。您可以使用PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)或MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)保持旧版行为 (#11213)。 - 将
androidx.annotation:annotation-experimental升级到1.3.1,以修复 https://issuetracker.google.com/251172715。 - 将
ExoPlayer.setAudioAttributes移至Player接口。
- 向
- ExoPlayer:
- 修复了 AC4 数据流中因无法正确识别仅解码样本而导致的跳转问题 (#11000)。
- 添加了在通过
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput启用此功能时,禁止在不合适的音频输出设备(例如 Wear OS 设备上的内置扬声器)上播放的功能。如果在没有合适的音频输出设备可用时尝试播放,或者在播放期间所有合适的输出设备都断开连接,则播放抑制原因将更新为Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT。连接合适的输出设备后,系统会移除抑制原因。 - 添加
MediaSource.canUpdateMediaItem和MediaSource.updateMediaItem,以在通过Player.replaceMediaItem(s)创建后接受MediaItem更新。 - 允许通过
Player.replaceMediaItem(s)为库提供的所有MediaSource类进行MediaItem更新(#33、#9978)。 - 将
MimeTypes.TEXT_EXOPLAYER_CUES改名为MimeTypes.APPLICATION_MEDIA3_CUES。 - 添加
PngExtractor,以将整个 PNG 文件作为单个样本发送和读取到TrackOutput中。 - 将
SequenceableLoader接口中的SequenceableLoader.continueLoading(long)方法增强为SequenceableLoader.continueLoading(LoadingInfo loadingInfo)。LoadingInfo包含其他参数,除了现有的playbackPositionUs之外,还包括playbackSpeed和lastRebufferRealtimeMs。 - 将
ChunkSource接口中的ChunkSource.getNextChunk(long, long, List, ChunkHolder)方法增强为ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)。 - 向通用媒体客户端数据 (CMCD) 日志记录添加了其他字段:缓冲区耗尽 (
bs)、截止时间 (dl)、播放速度 (pr) 和启动 (su) (#8699)。 - 向
ColorInfo添加了亮度和色度位深 (#491)。 - 向通用媒体客户端数据 (CMCD) 日志记录添加了其他字段:下一个对象请求 (
nor) 和下一个范围请求 (nrr) (#8699)。 - 添加了使用查询参数传输通用媒体客户端数据 (CMCD) 数据的功能 (#553)。
- 修复了
ExperimentalBandwidthMeter中的ConcurrentModificationException(#612)。 - 向
CompositeMediaSource.getMediaTimeForChildMediaTime添加了MediaPeriodId参数。 - 在
ConcatenatingMediaSource2中支持ClippingMediaSource(以及具有时段/窗口时间偏移的其他来源)(#11226)。 - 更改
BaseRenderer.onStreamChanged(),使其也接收MediaPeriodId参数。
- 转换器:
- 解析图片输入的 EXIF 旋转数据。
- 移除了
TransformationRequest.HdrMode注解类型及其关联的常量。请改用Composition.HdrMode及其关联的常量。 - 简化
OverlaySettings以解决旋转问题。 - 将
SampleConsumer.queueInputBitmap的frameRate和durationUs参数更改为TimestampIterator。
- 轨道选择:
- 添加
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness以明确允许或禁止非无缝自适应。默认值保持其当前行为true。
- 添加
- 提取器:
- MPEG-TS:通过将数据流的最后一个访问单元传递到样本队列,确保渲染最后一帧 (#7909)。
- 修复了确定
rotationDegrees时的拼写错误。将projectionPosePitch更改为projectionPoseRoll(#461)。 - 移除
Extractor实例可以直接使用instanceof进行检查的假设。如果您想在运行时访问Extractor的实现细节,则必须先调用Extractor.getUnderlyingInstance。 - 添加
BmpExtractor。 - 添加
WebpExtractor。 - 添加
HeifExtractor。 - 向
Mp4Extractor添加了 QuickTime 经典支持。
- 音频:
- 在 MP4 和 Matroska 中添加了对 24/32 位大端序 PCM 的支持,并解析了 MP4 中
lpcm的 PCM 编码。 - 添加了对在 MP4 中提取 Vorbis 音频的支持。
- 添加了
AudioSink.getFormatOffloadSupport(Format),用于通过DefaultAudioOffloadSupportProvider检索接收器可为格式提供的分流支持级别。它会返回包含isFormatSupported、isGaplessSupported和isSpeedChangeSupported的新AudioOffloadSupport。 - 添加
AudioSink.setOffloadMode(),通过它来配置音频接收器上的分流配置。默认值为AudioSink.OFFLOAD_MODE_DISABLED。 - 您可以通过
TrackSelectionParameters中的setAudioOffloadPreference启用分流。如果设置的偏好设置为启用,设备支持该格式的分流,并且音轨选择为单个音轨,则系统会启用音频分流。 - 如果
audioOffloadModePreference设置为AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED,则DefaultTrackSelector将仅选择一个音轨,并且仅当该音轨的格式在分流中受支持时才会选择。如果分流不支持任何音轨,则不会选择任何音轨。 - 由于曲目转换后出现播放位置问题,因此在 API 级别 33 之前停用了对分流的无缝支持。
- 从
DefaultRenderersFactory.buildAudioSink方法签名中移除参数enableOffload。 - 移除方法“
DefaultAudioSink.Builder.setOffloadMode”。 - 移除 intdef 值
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED。 - 添加了对分流播放期间 Opus 无缝元数据的支持。
- 如果首次写入失败,则通过停用分流来允许渲染程序恢复 (#627)。
- 默认情况下,为纯音频卸载播放启用卸载调度。
- 删除
ExoPlayer.experimentalSetOffloadSchedulingEnabled和AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged。 - 将
onExperimentalSleepingForOffloadChanged重命名为onSleepingForOffloadChanged,将onExperimentalOffloadedPlayback重命名为onOffloadedPlayback。 - 将音频分流模式相关的
TrackSelectionParameters接口和定义移至内部AudioOffloadPreferences类。 - 向
AnalyticsListener、AudioRendererEventListener和AudioSink.Listener添加onAudioTrackInitialized和onAudioTrackReleased回调。 - 修复了 DTS Express 音频缓冲区下溢问题 (#650)。
- 修复了 E-AC3-JOC 的功能检查会抛出
IllegalArgumentException的 bug (#677)。
- 在 MP4 和 Matroska 中添加了对 24/32 位大端序 PCM 的支持,并解析了 MP4 中
- 视频:
- 允许
MediaCodecVideoRenderer使用自定义VideoFrameProcessor.Factory。 - 修复了以下 bug:如果音频串流以负时间戳开头,则无法渲染第一帧 (#291)。
- 允许
- 文本:
- 移除了
ExoplayerCuesDecoder。现在,具有sampleMimeType = application/x-media3-cues的文本轨道由TextRenderer直接处理,无需SubtitleDecoder实例。
- 移除了
- 元数据:
- 系统将不再针对“仅解码”样本调用
MetadataDecoder.decode,因为无论如何,实现都必须返回 null。
- 系统将不再针对“仅解码”样本调用
- 效果:
- 添加
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>),用于按时间戳将位图输入加入队列。 - 将
VideoFrameProcessor.registerInputStream()更改为非屏蔽。 应用必须实现VideoFrameProcessor.Listener#onInputStreamRegistered()。 - 将
VideoFrameProcessor.queueInputBitmap的frameRate和durationUs参数更改为TimestampIterator。
- 添加
- IMA 扩展程序:
- 修复了以下 bug:如果多时段 DASH 直播不是播放列表中的第一项,可能会抛出异常 (#571)。
- 在调用
AdsLoader.destroy()之前释放 StreamManager - 将 IMA SDK 版本提升至 3.31.0。
- 会话:
- 在
DefaultMediaNotificationProvider中将通知前台服务行为设置为FOREGROUND_SERVICE_IMMEDIATE(#167)。 - 仅在 API 31 以上版本中使用
android.media.session.MediaSession.setMediaButtonBroadcastReceiver(),以避免在 Samsung 设备上出现已废弃 API 的问题 (#167)。 - 使用媒体通知控制器作为代理,设置用于填充通知和平台会话的可用命令和自定义布局。
- 在 Media3 中转换由
MediaSessionService.onStartCommand()接收的媒体按钮事件,而不是将其路由到平台会话,然后再路由回 Media3。这样,调用方控制器始终是媒体通知控制器,并且应用可以轻松地在所有受支持的 API 级别上以相同的方式识别来自通知的调用。 - 修复了连接到旧版
MediaSessionCompat时MediaController.getCurrentPosition()无法前进的 bug。 - 添加
MediaLibrarySession.getSubscribedControllers(mediaId)以方便使用。 - 替换
MediaLibrarySession.Callback.onSubscribe(),以断言控制器订阅的父级 ID 的可用性。如果成功,订阅会被接受,并且系统会立即调用notifyChildrenChanged()以通知浏览器 (#561)。 - 为 Automotive OS 添加了会话演示模块,并为 Android Auto 启用了会话演示。
- 当
COMMAND_GET_TIMELINE不适用于媒体通知控制器时,请勿设置框架会话的队列。由于 Android Auto 作为客户端控制器从框架会话中读取数据,因此 Android Auto 界面中的queue按钮不会显示 (#339)。 - 默认使用
DataSourceBitmapLoader而不是SimpleBitmapLoader(#271、#327)。 - 添加了
MediaSession.Callback.onMediaButtonEvent(Intent),允许应用替换默认媒体按钮事件处理。
- 在
- 界面:
- 为 Wear OS 设备添加
Player.Listener实现,以便通过启动系统对话框来处理因Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT而导致的播放抑制,从而允许用户连接合适的音频输出设备(例如蓝牙耳机)。如果听众在可配置的超时时间(默认值为 5 分钟)内连接了合适的设备,系统会自动恢复播放。
- 为 Wear OS 设备添加
- 下载内容:
- 为
DownloadService声明“数据同步”前台服务类型,以实现 Android 14 兼容性。使用此服务时,应用还需要在清单中将dataSync添加为foregroundServiceType,并添加FOREGROUND_SERVICE_DATA_SYNC权限 (#11239)。
- 为
- HLS 扩展程序:
- 以从上次加载开始时间(而非上次加载完成时间)计算的时间间隔刷新 HLS 直播播放列表 (#663)。
- DASH 扩展程序:
- 允许在片段模板网址中使用多个相同的 DASH 标识符。
- 添加了对在提取期间解析字幕的实验性支持。此版本更好地支持合并重叠的字幕,包括解决在字幕片段之间过渡时出现的闪烁问题。您可以使用
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()启用此功能 (#288)。
- RTSP 扩展程序:
- 解码器扩展程序(FFmpeg、VP9、AV1、MIDI 等):
- 发布了 MIDI 解码器模块,该模块支持使用 Jsyn 库合成音频来播放标准 MIDI 文件。
- 添加
DecoderOutputBuffer.shouldBeSkipped,以直接标记不需要呈现的输出缓冲区。此方法优于即将弃用的C.BUFFER_FLAG_DECODE_ONLY。 - 添加了
Decoder.setOutputStartTimeUs和SimpleDecoder.isAtLeastOutputStartTimeUs,以允许解码器在开始时间之前丢弃仅解码样本。应优先使用此方法,而不是将被弃用的Buffer.isDecodeOnly。 - 修复了将 MIDI 解码器工件发布到 Maven 制品库时出现的 bug。工件已重命名为
media3-exoplayer-midi(#734)。
- Leanback 扩展:
- 修复了停用 Surface 可能会导致 Leanback 代码中出现
ArithmeticException的 bug (#617)。
- 修复了停用 Surface 可能会导致 Leanback 代码中出现
- 测试实用程序:
- 使
TestExoPlayerBuilder和FakeClock与 Espresso 界面测试和 Compose 界面测试兼容。此版本修复了以下 bug:在 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的 bug (#538)。
- 修复了播放非常短的文件时
- 音频分流:
- 根据 RFC 7845,将 Ogg ID 标头和注释标头页附加到比特流,以便进行分流 Opus 播放。
- 视频:
- H.265/HEVC:修复了解析 SPS 短期和长期参考图片信息的问题。
- 文本:
- CEA-608:更改了提示截断逻辑,以便仅考虑可见文本。 以前,在将字幕长度限制为 32 个字符时,缩进和制表符偏移量也包含在内(根据规范,这在技术上是正确的)(#11019)。
- IMA 扩展程序:
- 将 IMA SDK 版本提升至 3.30.3。
- 会话:
- 将自定义布局添加到控制器的状态,并提供一个 getter 来访问它。当自定义布局发生变化时,系统会调用
MediaController.Listener.onCustomLayoutChanged。如果应用想要向不同的 Media3 控制器发送不同的自定义布局,可以在MediaSession.Callback.onConnect中使用AcceptedResultBuilder执行此操作,以确保在连接完成后,自定义布局可供控制器使用。 - 修复了以下问题:
MediaLibraryServiceLegacyStub向不支持此操作的Result发送错误,从而产生UnsupportedOperationException(#78)。 - 通过旧命令(
COMMAND_ADJUST_DEVICE_VOLUME和COMMAND_SET_DEVICE_VOLUME)和新命令(COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS和COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)确定volumeControlType,从而修复PlayerWrapper创建VolumeProviderCompat的方式 (#554)。
- 将自定义布局添加到控制器的状态,并提供一个 getter 来访问它。当自定义布局发生变化时,系统会调用
版本 1.1.0
2023 年 7 月 5 日
- 通用库:
- 添加了音频路由不合适和准备就绪时播放的抑制原因,并更改了抑制时间过长的原因。 (#15)。
- 向 Player 添加命令:
COMMAND_GET_METADATACOMMAND_SET_PLAYLIST_METADATACOMMAND_SET_DEVICE_VOLUME_WITH_FLAGSCOMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- 向 Player 添加了重载方法,允许用户指定音量标志:
void setDeviceVolume(int, int)void increaseDeviceVolume(int)void decreaseDeviceVolume(int)void setDeviceMuted(boolean, int)
- 为
DeviceInfo添加了Builder,并弃用了现有构造函数。 - 添加了
DeviceInfo.routingControllerId,用于指定远程播放的路由控制器 ID。 - 添加了
Player.replaceMediaItem(s),作为在同一位置添加和移除内容的快捷方式 (#8046)。
- ExoPlayer:
- 仅在明确选择启用的情况下,才允许 ExoPlayer 控制设备音量方法。使用
ExoPlayer.Builder.setDeviceVolumeControlEnabled可访问:getDeviceVolume()isDeviceMuted()setDeviceVolume(int)和setDeviceVolume(int, int)increaseDeviceVolume(int)和increaseDeviceVolume(int, int)decreaseDeviceVolume(int)和decreaseDeviceVolume(int, int)
- 添加了
FilteringMediaSource,可用于从MediaSource中过滤可用的轨道类型。 - 添加了对在自适应流式传输格式 DASH、HLS 和 SmoothStreaming 的传出请求中包含通用媒体客户端数据 (CMCD) 的支持。已纳入以下字段:
br、bl、cid、rtp和sid(#8699)。API 结构和 API 方法:- CMCD 日志记录默认处于停用状态,请使用
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)将其启用。 - 默认情况下,所有键均处于启用状态,请替换
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)以滤除要记录的键。 - 替换
CmcdConfiguration.RequestConfig.getCustomData()以启用自定义按键日志记录。
- CMCD 日志记录默认处于停用状态,请使用
- 向主演示应用的清单添加了其他操作,以便更轻松地使用自定义
*.exolist.json文件启动演示应用 (#439)。 - 添加了
ExoPlayer.setVideoEffects(),以便在视频播放期间使用Effect。 - 更新
SampleQueue,以将sourceId存储为long,而不是int。这会更改公共方法SampleQueue.sourceId和SampleQueue.peekSourceId的签名。 - 向
LoadControl方法shouldStartPlayback和onTracksSelected添加了参数,以便将这些方法与相关MediaPeriod相关联。 - 通过添加时间轴参数来更改
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)的签名,该参数包含在映射中用作键的 UID 的时间段。为避免多时段直播出现并发问题,必须执行此操作。 - 废弃了
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)和BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)。 您可以改为调用不带mediaTimeOffsetUs的方法变体。请注意,即使对于已废弃的变体,也不会再将偏移量添加到由调度程序调度的MediaLoadData对象的startTimeUs和endTimeUs。 - 已将
ExoTrackSelection.blacklist重命名为excludeTrack,并将isBlacklisted重命名为isTrackExcluded。 - 修复了在空播放列表中调用
ExoPlayer.setMediaItem(s)和addMediaItem(s)时行为不一致的问题。
- 仅在明确选择启用的情况下,才允许 ExoPlayer 控制设备音量方法。使用
- 转换器:
- 移除
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)。 改用ExoPlayerAssetLoader.Factory(MediaSource.Factory)和Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)。 - 移除“
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)”。 - 修复了以下 bug:如果在输入帧等待处理时发出视频流结束信号,转换可能会卡住(导致多路复用器超时)。
- 通过
MediaCodecList查询编解码器,而不是使用findDecoder/EncoderForFormat实用程序,以扩大支持范围。 - 移除了
DefaultEncoderFactory中的 B 帧配置,因为它在某些设备上无法正常运行。
- 移除
- 轨道选择:
- 添加了
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange(默认处于停用状态)。启用后,当渲染器功能发生变化时,DefaultTrackSelector将触发新的轨道选择。
- 添加了
- 提取器:
- 音频:
- 修复了以下 bug:在启用隧道模式且
AudioProcessors处于活跃状态(例如,用于无缝剪辑)时,某些播放会失败 (#10847)。 - 在直接播放(分流)中将 Opus 帧封装在 Ogg 数据包中。
- 在休眠期间使用分流调度推断当前位置。
- 添加了
Renderer.release()和AudioSink.release(),用于在播放器生命周期结束时释放资源。 - 监听
DefaultAudioSink中的音频功能变化。在DefaultAudioSink的构造函数中添加一个必需参数context,DefaultAudioSink将使用该参数注册为AudioCapabilitiesReceiver的监听器,并在收到功能更改通知时更新其audioCapabilities属性。 - 通过
AudioSink.Listener接口中的新事件onAudioCapabilitiesChanged以及触发onRendererCapabilitiesChanged事件的新接口RendererCapabilities.Listener传播音频功能更改。 - 添加了
ChannelMixingAudioProcessor,用于对音频声道应用缩放/混音。 - 向
DecoderDiscardReasons添加了新的 int 值DISCARD_REASON_AUDIO_BYPASS_POSSIBLE,以便在音频功能发生变化后,如果可以采用绕过模式,则舍弃音频解码器。 - 添加了对 DTS Express 和 DTS:X 的直接播放支持 (#335)。
- 修复了以下 bug:在启用隧道模式且
- 视频:
- 让
MediaCodecVideoRenderer在停用渲染器时报告宽度和高度为 0 的VideoSize。当Player.getVideoSize()发生变化时,系统会相应地调用Player.Listener.onVideoSizeChanged。进行此项更改后,当Player.getCurrentTracks不支持视频或支持的视频轨道的大小尚未确定时,ExoPlayer 的视频大小(使用MediaCodecVideoRenderer)的宽度和高度为 0。
- 让
- DRM:
- 降低
DefaultDrmSession上不应从 DRM 软件包外部调用的多个内部专用方法的可见性:void onMediaDrmEvent(int)void provision()void onProvisionCompleted()onProvisionError(Exception, boolean)
- 降低
- 多路复用器:
- 添加了一个新的多路复用器库,可用于创建 MP4 容器文件。
- IMA 扩展程序:
- 为 DAI 启用多时段 DASH 直播。请注意,当前实现尚不支持在直播中跳转 (#10912)。
- 修复了以下 bug:由于连续时间轴中计算出的内容位置略有不同,因此在直播中插入了新的广告组。
- 会话:
- 添加辅助方法
MediaSession.getControllerForCurrentRequest,以获取有关当前正在调用Player方法的控制器的信息。 - 添加了
androidx.media3.session.MediaButtonReceiver,以便应用能够通过蓝牙耳机等发送的媒体按钮事件实现播放恢复 (#167)。 - 向
MediaSession.Callback.onAddMediaItems添加了默认实现,以便在请求的MediaItems具有LocalConfiguration(例如 URI)时,允许将其传递给Player(#282)。 - 默认情况下,在 Android 12 及更低版本的紧凑媒体通知视图中添加“快退”和“快进”命令按钮 (#410)。
- 向
MediaSession.Callback.onAddMediaItems添加了默认实现,以便在请求的MediaItems具有LocalConfiguration(例如 URI)时,允许将其传递给Player(#282)。 - 默认情况下,在 Android 12 及更低版本的紧凑媒体通知视图中添加“快退”和“快进”命令按钮 (#410)。
- 添加辅助方法
- 界面:
- 添加 Util 方法
shouldShowPlayButton和handlePlayPauseButtonAction,以编写带有播放/暂停按钮的自定义界面元素。
- 添加 Util 方法
- RTSP 扩展程序:
- DASH 扩展程序:
- 从
MediaLoadData.startTimeMs和MediaLoadData.endTimeMs中移除了多时段 DASH 流的媒体时间偏移值。 - 修复了重新准备多时段直播 Dash 媒体来源会产生
IndexOutOfBoundsException的 bug (#10838)。
- 从
- HLS 扩展程序:
- 添加
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long),为加载线程设置超时,以等待TimestampAdjuster初始化。如果初始化未在超时之前完成,系统会抛出PlaybackException,以避免播放无休止地卡顿。超时默认设置为零 (#323)。
- 添加
- 测试实用程序:
- 检查
DataSourceContractTest中的 URI scheme 是否不区分大小写。
- 检查
- 移除了已废弃的符号:
- 移除了
DefaultAudioSink构造函数,改用DefaultAudioSink.Builder。 - 移除
HlsMasterPlaylist,改用HlsMultivariantPlaylist。 - 移除了
Player.stop(boolean)。改用Player.stop()和Player.clearMediaItems()(如果reset为true)。 - 移除了两个已废弃的
SimpleCache构造函数,请改用接受DatabaseProvider的非废弃构造函数,以获得更好的性能。 - 移除了
DefaultBandwidthMeter构造函数,改用DefaultBandwidthMeter.Builder。 - 移除了
DefaultDrmSessionManager构造函数,改用DefaultDrmSessionManager.Builder。 - 移除了两个已废弃的
HttpDataSource.InvalidResponseCodeException构造函数,请使用接受额外字段(cause、responseBody)的非废弃构造函数来增强错误日志记录。 - 移除了
DownloadHelper.forProgressive、DownloadHelper.forHls、DownloadHelper.forDash和DownloadHelper.forSmoothStreaming,请改用DownloadHelper.forMediaItem。 - 移除了已废弃的
DownloadService构造函数,请使用未废弃的构造函数,其中包含提供channelDescriptionResourceId参数的选项。 - 移除了已废弃的字符集字符串常量(
ASCII_NAME、UTF8_NAME、ISO88591_NAME、UTF16_NAME和UTF16LE_NAME),请改用kotlin.text软件包、java.nio.charset.StandardCharsets或com.google.common.base.Charsets中的 Kotlin 字符集。 - 移除了已废弃的
WorkManagerScheduler构造函数,请改用包含提供Context参数选项的非废弃构造函数。 - 移除了已弃用的方法
createVideoSampleFormat、createAudioSampleFormat、createContainerFormat和createSampleFormat,这些方法曾用于实例化Format类。 请改用Format.Builder创建Format的实例。 - 移除了已废弃的方法
copyWithMaxInputSize、copyWithSubsampleOffsetUs、copyWithLabel、copyWithManifestFormatInfo、copyWithGaplessInfo、copyWithFrameRate、copyWithDrmInitData、copyWithMetadata、copyWithBitrate和copyWithVideoSize,请改用Format.buildUpon()和 setter 方法。 - 移除了已废弃的
ExoPlayer.retry(),请改用prepare()。 - 移除了已废弃的零参数
DefaultTrackSelector构造函数,改用DefaultTrackSelector(Context)。 - 移除了已废弃的
OfflineLicenseHelper构造函数,改用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)。 - 移除了已废弃的
DownloadManager构造函数,改用接受Executor的构造函数。 - 移除了已废弃的
Cue构造函数,请改用Cue.Builder。 - 移除了已废弃的
OfflineLicenseHelper构造函数,请改用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)。 - 移除了四个已废弃的
AnalyticsListener方法:- 废弃了
onDecoderEnabled,改用onAudioEnabled和/或onVideoEnabled。 onDecoderInitialized,请改用onAudioDecoderInitialized和/或onVideoDecoderInitialized。onDecoderInputFormatChanged,请改用onAudioInputFormatChanged和/或onVideoInputFormatChanged。- 废弃了
onDecoderDisabled,改用onAudioDisabled和/或onVideoDisabled。
- 废弃了
- 移除了已废弃的
Player.Listener.onSeekProcessed和AnalyticsListener.onSeekProcessed,请改用onPositionDiscontinuity和DISCONTINUITY_REASON_SEEK。 - 移除
ExoPlayer.setHandleWakeLock(boolean),改用setWakeMode(int)。 - 移除已废弃的
DefaultLoadControl.Builder.createDefaultLoadControl(),改用build()。 - 移除已废弃的
MediaItem.PlaybackProperties,改用MediaItem.LocalConfiguration。已弃用的字段MediaItem.playbackProperties现在属于MediaItem.LocalConfiguration类型。
- 移除了
版本 1.1.0-rc01
2023 年 6 月 21 日
使用 1.1.0 稳定版。
版本 1.1.0-beta01
2023 年 6 月 7 日
使用 1.1.0 稳定版。
版本 1.1.0-alpha01
2023 年 5 月 10 日
使用 1.1.0 稳定版。
版本 1.0.0
版本 1.0.2
2023 年 5 月 18 日
发布了 androidx.media3:media3-*:1.0.2。版本 1.0.2 中包含这些提交内容。
此版本与 ExoPlayer 2.18.7 版本相对应。
此版本包含自 1.0.1 版本以来的以下变更:
- 核心库:
- 添加了
Buffer.isLastSample(),用于表示Buffer是否包含标志C.BUFFER_FLAG_LAST_SAMPLE。 - 修复了以下问题:如果最后一个包含帧的样本在未读取“流结束”样本的情况下被移出队列,则最后一帧可能无法渲染。 (#11079)。
- 添加了
- 提取器:
- 通过重复使用 RTSP 和 MP4 提取器已使用的解析逻辑,修复了 MPEG-TS 文件中 H.265 SPS 的解析问题 (#303)。
- 文本:
- SSA:如果 UTF-16 文件以字节顺序标记开头,请添加对此类文件的支持 (#319)。
- 会话:
- 修复了以下问题:
当连接到更新其
操作的旧版
MediaSessionCompat时,MediaController不会更新其可用命令。 - 修复了以下 bug:在 API 30 上,当系统界面使用
params.isRecent == true调用Callback.onGetLibraryRoot时,MediaLibraryService无法返回 null (#355)。 - 修复了
MediaSessionService或MediaLibraryService的内存泄漏问题 (#346)。 - 修复了以下 bug:在
MediaSession中合并Timeline和位置更新可能会导致MediaController抛出IllegalStateException。
- 修复了以下问题:
当连接到更新其
操作的旧版
版本 1.0.1
2023 年 4 月 18 日
发布了 androidx.media3:media3-*:1.0.1。版本 1.0.1 中包含这些提交内容。
此版本与 ExoPlayer 2.18.6 版本相对应。
- 核心库:
- 在跳转到默认位置时重置目标直播替换 (#11051)。
- 修复了媒体中的空样本流可能导致播放卡住的 bug。
- 会话:
- 修复了以下 bug:由旧版
MediaSessionCompat发布的多个相同队列项会导致MediaController中出现异常 (#290)。 - 添加了缺少的
MediaSession.broadcastCustomCommand到旧版MediaControllerCompat.Callback.onSessionEvent的转发 (#293)。 - 修复了调用
MediaSession.setPlayer不会更新可用命令的 bug。 - 修复了以下问题:如果从
MediaController发送的TrackSelectionOverride实例引用了具有Format.metadata的组,则这些实例会被忽略 (#296)。 - 修复了以下问题:
Player.COMMAND_GET_CURRENT_MEDIA_ITEM需要可用,才能通过旧版MediaSessionCompat访问元数据。 - 修复了在
MediaSessionService中使用后台线程上的MediaSession实例时导致崩溃的问题 (#318)。 - 修复了以下问题:库声明了媒体按钮接收器,但应用并未打算这样做 (#314)。
- 修复了以下 bug:由旧版
- DASH:
- 修复了对空片段时间轴的处理 (#11014)。
- RTSP:
- 如果使用 UDP 进行 RTSP 设置失败,并显示 RTSP 错误 461 UnsupportedTransport,则使用 TCP 重试 (#11069)。
版本 1.0.0
2023 年 3 月 22 日
发布了 androidx.media3:media3-*:1.0.0。版本 1.0.0 中包含这些提交内容。
此版本与 ExoPlayer 2.18.5 版本相对应。
自 1.0.0-rc02 以来没有任何变化。
版本 1.0.0-rc02
2023 年 3 月 2 日
发布了 androidx.media3:media3-*:1.0.0-rc02。版本 1.0.0-rc02 包含这些提交内容。
此版本与 ExoPlayer 2.18.4 版本相对应。
- 核心库:
- 下载内容:
- 使要合并的两个片段的开始时间的最大差异可在
SegmentDownloader和子类中配置 (#248)。
- 使要合并的两个片段的开始时间的最大差异可在
- 音频:
- 视频:
- 将 HEVC HDR10 格式映射到
HEVCProfileMain10HDR10,而不是HEVCProfileMain10。 - 针对 Chromecast with Google TV 和 Lenovo M10 FHD Plus 上的设备问题添加了权宜解决方法,该问题会导致 60fps AVC 流被标记为不受支持 (#10898)。
- 修复了在播放帧速率远高于屏幕刷新率的媒体时出现的帧释放性能问题。
- 将 HEVC HDR10 格式映射到
- Cast:
- 修复了在媒体文件之间转换时出现的瞬态
STATE_IDLE(#245)。
- 修复了在媒体文件之间转换时出现的瞬态
- RTSP:
- 捕获在解析无效 RTSP Describe 响应消息时抛出的 IllegalArgumentException (#10971)。
- 会话:
- 修复了通知播放/暂停按钮不随播放器状态更新的 bug (#192)。
- IMA 扩展程序:
- 修复了以下 bug:由于未收到第一个(在没有广告的情况下,也是唯一一个)
LOADED事件,导致没有任何广告的 DAI 视频流无法开始。
- 修复了以下 bug:由于未收到第一个(在没有广告的情况下,也是唯一一个)
版本 1.0.0-rc01
2023 年 2 月 16 日
发布了 androidx.media3:media3-*:1.0.0-rc01。版本 1.0.0-rc01 包含这些提交内容。
此版本与 ExoPlayer 2.18.3 版本相对应。
- 核心库:
- 调整了渲染程序的解码器排序逻辑,以保持
MediaCodecSelector的偏好设置,即使解码器报告它可能无法高效地播放媒体也是如此。例如,对于默认选择器,仅提供功能支持的硬件解码器会优先于完全支持该格式的软件解码器 (#10604)。 - 添加了
ExoPlayer.Builder.setPlaybackLooper,用于为新的 ExoPlayer 实例设置现有的播放线程。 - 允许清除内容下载管理器帮助程序 (#10776)。
- 向
BasePlayer.seekTo添加了参数,以指明用于跳转的命令。 - 在 API 21 及以上级别加载可绘制对象时使用主题 (#220)。
- 添加了允许将多个媒体项合并到单个窗口中的
ConcatenatingMediaSource2(#247)。
- 调整了渲染程序的解码器排序逻辑,以保持
- 提取器:
- 如果示例表 (stbl) 在解析 trak Atom 时缺少必需的示例说明 (stsd),则抛出
ParserException,而非NullPointerException。 - 在 fMP4 中直接跳转到同步帧时会正确跳过示例 (#10941)。
- 如果示例表 (stbl) 在解析 trak Atom 时缺少必需的示例说明 (stsd),则抛出
- 音频:
- 使用压缩音频格式比特率来计算直接播放(直通)中
AudioTrack的最小缓冲区大小。
- 使用压缩音频格式比特率来计算直接播放(直通)中
- 文本:
- 修复了当字幕文件不包含任何提示时,向
Subtitle.getEventTime传递无效(负数)索引的TextRenderer。 - SubRip:如果 UTF-16 文件以字节顺序标记开头,请添加对此类文件的支持。
- 修复了当字幕文件不包含任何提示时,向
- 元数据:
- 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
- 添加了
MediaMetadata.mediaType,以指示内容类型或元数据描述的文件夹类型。 - 添加了
MediaMetadata.isBrowsable,以替代MediaMetadata.folderType。下一个版本中将废弃文件夹类型。
- DASH:
- 为图片适配集添加了完整的解析,包括图块计数 (#3752)。
- 界面:
- 会话:
- 添加了抽象
SimpleBasePlayer,以帮助为自定义播放器实现Player接口。 - 添加了辅助方法,用于将平台会话令牌转换为 Media3
SessionToken(#171)。 - 使用
onMediaMetadataChanged来触发平台媒体会话的更新 (#219)。 - 将媒体会话添加为
DefaultMediaNotificationProvider的getMediaButtons()的参数;为清楚起见,还使用了不可变列表 (#216)。 - 添加了
onSetMediaItems回调监听器,以便修改/设置MediaItem列表,同时按会话启动索引和位置,然后再设置到播放器上 (#156)。 - 避免针对非蓝牙媒体按钮事件执行两次点按检测 (#233)。
- 提高了
QueueTimeline在出现可疑的旧版会话状态时的稳健性 (#241)。
- 添加了抽象
- 元数据:
- 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
- 添加了
MediaMetadata.mediaType,以指示内容类型或元数据描述的文件夹类型。 - 添加了
MediaMetadata.isBrowsable,以替代MediaMetadata.folderType。下一个版本中将废弃文件夹类型。
- Cast 扩展程序:
- 将 Cast SDK 版本升级到 21.2.0。
- IMA 扩展程序:
- 移除了应用线程上
ImaServerSideAdInsertionMediaSource的播放器监听器,以避免出现线程问题。 - 为
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder添加focusSkipButtonWhenAvailable属性,以请求将 TV 设备上的“跳过”按钮设置为焦点,并将其默认设置为 true。 - 将
focusSkipButton()方法添加到ImaServerSideAdInsertionMediaSource.AdsLoader,以便通过程序化方式请求将“跳过”按钮设置为焦点。 - 将 IMA SDK 版本提升至 3.29.0。
- 移除了应用线程上
- 演示版应用:
- 在运行时请求下载通知的通知权限 (#10884)。
版本 1.0.0-beta03
2022 年 11 月 22 日
发布了 androidx.media3:media3-*:1.0.0-beta03。版本 1.0.0-beta03 包含这些提交内容。
此版本与 ExoPlayer 2.18.2 版本相对应。
- 核心库:
- 添加了
ExoPlayer.isTunnelingEnabled以检查当前所选轨道是否已启用隧道技术 (#2518)。 - 添加了
WrappingMediaSource以简化封装单个MediaSource的过程 (#7279)。 - 在播放因可用内存不足而卡住之前舍弃返回缓冲区。
- 在已启用分流的情况下关闭用于跟踪“doSomeWork”块的功能。
- 修复了
PlaybackStatsListener中快速跳转的会话跟踪问题 (#180)。 - 在单项播放列表中调用
seekToNext或seekToPrevious时,发送缺失的onMediaItemTransition回调 (#10667)。 - 添加了
Player.getSurfaceSize,用于返回呈现视频时所用 Surface 的大小。 - 修复了在播放器释放期间移除监听器可能会导致
IllegalStateException的 bug (#10758)。
- 添加了
- build:
- 强制执行最低
compileSdkVersion以避免编译错误 (#10684)。 - 避免于包含在另一 Gradle build 中时发布块。
- 强制执行最低
- 轨道选择:
- 如果显示设备不支持杜比视界,请改选轨道。 (#8944)。
- 下载内容:
- 视频:
- 如果显示设备不支持杜比视界,请尝试改用替代解码器。 (#9794)。
- 音频:
- 使用
SingleThreadExecutor释放AudioTrack实例,以免同时释放多个播放器时出现 OutOfMemory 错误 (#10057)。 - 为 AudioTrack 分流状态添加了
AudioOffloadListener.onExperimentalOffloadedPlayback。 (#134)。 - 将
AudioTrackBufferSizeProvider设为公共接口。 - 添加了
ExoPlayer.setPreferredAudioDevice以设置首选音频输出设备 (#135)。 - 将
androidx.media3.exoplayer.audio.AudioProcessor重命名为androidx.media3.common.audio.AudioProcessor。 - 在所有 Android 版本上,将 8 声道和 12 声道音频分别映射到 7.1 和 7.1.4 声道掩码 (#10701)。
- 使用
- 元数据:
- 现在可以将
MetadataRenderer配置为在元数据可用后立即渲染。创建一个具有MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)的实例,以指定渲染程序是尽早输出元数据还是与播放器位置同步元数据。
- 现在可以将
- DRM:
- 解决了 Android 13 ClearKey 实现中会返回非空但无效许可网址的 bug。
- 修复了在播放列表中的 DRM 方案之间切换时(例如从 Widevine 切换为 ClearKey)出现的
setMediaDrmSession failed: session not opened错误。
- 文本:
- CEA-608:确保正确处理字段 2 上的服务切换命令 (#10666)。
- DASH:
- 从清单中解析
EventStream.presentationTimeOffset(#10460)。
- 从清单中解析
- 界面:
- 使用播放器的当前替换值作为
TrackSelectionDialogBuilder中的预设值 (#10429)。
- 使用播放器的当前替换值作为
- 会话:
- 确保命令始终以正确顺序执行,即使某些命令需要异步解析也是如此 (#85)。
- 添加了
DefaultMediaNotificationProvider.Builder以构建DefaultMediaNotificationProvider实例。构建器可以配置提供程序使用的通知 ID、通知渠道 ID 和通知渠道名称。此外,还添加了方法DefaultMediaNotificationProvider.setSmallIcon(int)以设置通知小图标。(#104)。 - 确保不会丢弃在
MediaController.release()之前发送的命令 (#99)。 SimpleBitmapLoader可以从file://URI 加载位图 (#108)。- 修复了阻止
MediaController在一段时间内查找广告的断言 (#122)。 - 播放结束后,系统会从前台停止
MediaSessionService,并显示通知以重新开始播放最近播放过的媒体文件 (#112)。 - 不启动具有待处理的暂停 intent 的前台服务 (#167)。
- 手动隐藏与
DefaultNotificationProvider在 API 26 和 API 27 上创建的通知关联的“标记”(在 API 28 及更高级别上,标记会自动隐藏)(#131)。 - 修复了从旧版 MediaSession 到 Media3 MediaController 的第二项 binder 连接导致 IllegalStateException 的 bug (#49)。
- RTSP:
- IMA:
- FFmpeg 扩展程序:
- 添加了新的必需标志,以将 FFmpeg 库与 NDK 23.1.7779620 及更高版本关联 (#9933)。
- AV1 扩展程序:
- 更新了 CMake 版本,以免与最新的 Android Studio 版本不兼容 (#9933)。
- Cast 扩展程序:
- 实现了
getDeviceInfo(),以便能在使用MediaController控制播放时识别CastPlayer(#142)。
- 实现了
- 转换器:
- 添加了多路复用器监控定时器,以检测生成输出样本的速度是否过慢。
- 移除了已废弃的符号:
- 移除了
Transformer.Builder.setOutputMimeType(String)。此功能已被移除。使用默认多路复用器时,MIME 类型将始终为 MP4 格式。
- 移除了
版本 1.0.0-beta02
2022 年 7 月 21 日
发布了 androidx.media3:media3-*:1.0.0-beta02。版本 1.0.0-beta02 包含这些提交内容。
此版本与 ExoPlayer 2.18.1 版本相对应。
- 核心库:
- 确保使用
ExoPlayer.setShuffleOrder更改ShuffleOrder后会导致使用reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED对Player.Listener#onTimelineChanged进行调用 (#9889)。 - 对于渐进式媒体,仅在缓冲位置添加所选轨道 (#10361)。
- 允许将自定义日志记录器用于所有 ExoPlayer 日志输出 (#9752)。
- 修复了在
DefaultMediaSourceFactory中实现setDataSourceFactory的问题,后者以前在某些情况下无法正常运行 (#116)。
- 确保使用
- 提取器:
- DASH:
- 从清单中解析 ClearKey 许可网址 (#10246)。
- 界面:
- 确保 TalkBack 在播放控件菜单中公布当前有效的速度选项 (#10298)。
- RTSP:
- 添加了 VP8 碎片化数据包处理机制 (#110)。
- Leanback 扩展:
- 监听
LeanbackAdapter中的playWhenReady更改 (10420)。
- 监听
- Cast:
版本 1.0.0-beta01
2022 年 6 月 16 日
发布了 androidx.media3:media3-*:1.0.0-beta01。版本 1.0.0-beta01 包含这些提交内容。
这与 ExoPlayer 2.18.0 版本相对应。
- 核心库:
- 通过
MediaMetricsManager启用了对 Android 平台诊断信息的支持。ExoPlayer 会将播放事件和性能数据转发到平台,这有助于在设备上提供系统性能和调试信息。如果设备用户启用了使用情况和诊断信息数据分享功能,Google 可能也会收集上述数据。应用可以选择退出不通过ExoPlayer.Builder.setUsePlatformDiagnostics(false)为 ExoPlayer 提供平台诊断信息。 - 修复了使用
MergingMediaSource时轨道重置太频繁的 bug,例如侧载 (side-loading) 字幕和播放过程中更改所选字幕时 (#10248)。 - 停止在 API 29 和 30 上检测 5G-NSA 网络类型。这些播放将假设使用 4G 网络。
- 禁止将
null传递给MediaSource.Factory.setDrmSessionManagerProvider和MediaSource.Factory.setLoadErrorHandlingPolicy。如果需要,可以显式传递DefaultDrmSessionManagerProvider和DefaultLoadErrorHandlingPolicy的实例。 - 添加了
MediaItem.RequestMetadata来表示在确切LocalConfiguration未知的情况下播放媒体所需的元数据。此外,还移除了MediaMetadata.mediaUrl,因为它现在已包含在RequestMetadata中。 - 添加了
Player.Command.COMMAND_SET_MEDIA_ITEM,使播放器允许设置单个媒体项。
- 通过
- 轨道选择:
- 已将
TrackSelectionOverrides类扁平化为TrackSelectionParameters,并将TrackSelectionOverride提升为顶级类。 - 已将
TracksInfo重命名为Tracks,并将TracksInfo.TrackGroupInfo重命名为Tracks.Group。Player.getCurrentTracksInfo和Player.Listener.onTracksInfoChanged也已重命名为Player.getCurrentTracks和Player.Listener.onTracksChanged。这包括“取消废弃” (un-deprecating)Player.Listener.onTracksChanged方法名称,但使用的是不同的参数类型。 - 更改了
DefaultTrackSelector.buildUponParameters和DefaultTrackSelector.Parameters.buildUpon以返回DefaultTrackSelector.Parameters.Builder,而不是已废弃的DefaultTrackSelector.ParametersBuilder。 - 添加了
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities(默认处于启用状态)。启用后,DefaultTrackSelector会优先选用声道数不超过设备输出功能的音轨。在手持设备上,DefaultTrackSelector会优先选用立体声/单声道,而非多声道音频格式,除非该多声道格式可以空间化(Android 12L 及更高版本)或属于杜比环绕声格式。此外,在支持音频空间化的设备上,DefaultTrackSelector将监控空间化程序属性的变化,并在出现这些变化时触发新的音轨选择。具有television界面模式的设备不受这些限制的约束,系统会优先选用声道数最多的格式。如需启用此功能,必须使用Context构建DefaultTrackSelector实例。
- 已将
- 视频:
- 已将
DummySurface重命名为PlaceholderSurface。 - 为
MediaCodecVideoRenderer.getCodecMaxInputSize添加了 AV1 支持。
- 已将
- 音频:
- 使用宣传非标准 MIME 类型的 LG AC3 音频解码器。
- 将
AudioAttributes.getAudioAttributesV21()的返回值类型从android.media.AudioAttributes更改为新的AudioAttributesV21封装容器类,以防止 ART 验证速度在级别低于 21 的 API 上变慢。 - 对平台(级别为 29 及以上的 API)进行查询,或在未设置格式声道数的情况(在启用 HLS 无块准备时会发生)下对音频透传的音频编码声道数进行假设 (10204)。
- 解码器输出为 12 声道 PCM 音频时使用声道掩码
AudioFormat.CHANNEL_OUT_7POINT1POINT4来配置AudioTrack(#10322)。
- DRM
- 确保格式更改后始终能够立即正确更新 DRM 会话 (10274)。
- 文本:
- 更改了
Player.getCurrentCues()以返回CueGroup,而不是List<Cue>。 - SSA:支持
BorderStyle == 3(即OutlineColour设置 cue 文件的背景)时的OutlineColour样式设置 (#8435)。 - CEA-708:将数据解析为多个服务块,并忽略与当前所选服务号码无关的块。
- 移除了过去仅用于处理 Google 内部字幕格式的
RawCcExtractor。
- 更改了
- 提取器:
- 界面:
- 修复了
useController=false时将事件传递给PlayerView上设置的OnClickListener的问题 (#9605)。此外,还修复了针对所有视图配置将事件传递给OnLongClickListener的问题。 - 修复了将
ACTION_UP之前退出PlayerView边界的一系列触摸事件错误处理为点击的问题 (#9861)。 - 修复了点按操作可能会切换播放,而不是隐藏控件的
PlayerView无障碍功能问题 (#8627)。 - 重写了
TrackSelectionView和TrackSelectionDialogBuilder,以使用Player接口(而不是ExoPlayer)。这样做将允许视图与其他Player实现一起使用,并移除界面模块对 ExoPlayer 模块的依赖关系。这是一项破坏性更改。 - 不在
PlayerView轨道选择器中显示强制文字轨道;如果选择了“None”,则保留一个合适的强制文字轨道 (#9432)。
- 修复了
- DASH:
- 解析了 DTS
AudioChannelConfiguration元素中的声道数。这会为 DTS 流重新启用音频透传 (#10159)。 - 禁止将
null传递给DashMediaSource.Factory.setCompositeSequenceableLoaderFactory。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory的实例。
- 解析了 DTS
- HLS:
- 如果播放列表 CODECS 属性不包含音频编解码器,则回退到分块准备 (#10065)。
- 禁止将
null传递给HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory、HlsMediaSource.Factory.setPlaylistParserFactory和HlsMediaSource.Factory.setPlaylistTrackerFactory。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory、DefaultHlsPlaylistParserFactory或对DefaultHlsPlaylistTracker.FACTORY的引用。
- 流畅的流式传输:
- 禁止将
null传递给SsMediaSource.Factory.setCompositeSequenceableLoaderFactory。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory的实例。
- 禁止将
- RTSP:
- 添加了适用于 H263 的 RTP 读取器 (#63)。
- 添加了适用于 MPEG4 的 RTP 读取器 (#35)。
- 添加了适用于 HEVC 的 RTP 读取器 (#36)。
- 添加了适用于 AMR 的 RTP 读取器。目前仅支持单声道非交错 AMR 流。不支持复合 AMR RTP 载荷。 (#46)。
- 添加了适用于 VP8 的 RTP 读取器 (#47)。
- 添加了适用于 WAV 的 RTP 读取器 (#56)。
- 修复了 RTSP 基本授权标头。 (#9544)。
- 停止检查必填 SDP 字段,因为 ExoPlayer 不需要这些字段 (#10049)。
- 解析 RTSP 时间时会抛出受检异常 (#10165)。
- 添加了适用于 VP9 的 RTP 读取器 (#47)。
- 添加了适用于 OPUS 的 RTP 读取器 (#53)。
- 数据源:
- 已将
DummyDataSource重命名为PlaceholderDataSource。 - 添加了 OkHttp 中断处理的解决方法。
- 已将
- 会话:
- 将
MediaSession.MediaItemFiller替换为MediaSession.Callback.onAddMediaItems,以允许异步解析请求。 - 当
MediaController连接到旧版媒体会话时,支持setMediaItems(s)方法。 - 移除了
MediaController.setMediaUri和MediaSession.Callback.onSetMediaUri。使用MediaController.setMediaItem和MediaSession.Callback.onAddMediaItems可实现相同的功能。 - 转发旧版
MediaController调用,以便将媒体播放到MediaSession.Callback.onAddMediaItems(而非onSetMediaUri)。 - 添加了
MediaNotification.Provider和DefaultMediaNotificationProvider,以支持通知自定义。 - 添加了
BitmapLoader和SimpleBitmapLoader,用于下载海报图片。 - 添加了
MediaSession.setCustomLayout(),以向后兼容旧版会话。 - 添加了
MediaSession.setSessionExtras(),以提供与旧版会话相当的功能。 - 已将
MediaSession.MediaSessionCallback重命名为MediaSession.Callback,并将MediaLibrarySession.MediaLibrarySessionCallback重命名为MediaLibrarySession.Callback,将MediaSession.Builder.setSessionCallback重命名为setCallback。 - 修复了
MediaControllerImplLegacy中的 NPE (#59)。 - 在时间轴发生更改时会更新会话位置 (#51)。
- 修复了释放控制器后
MediaControllerImplBase中的 NPE (#74)。
- 将
- 广告播放/IMA:
- 将广告轮询频率从每 100 毫秒减少到每 200 毫秒,以便与美国媒体评定委员会 (MRC) 建议保持一致。
- FFmpeg 扩展程序:
- 将 CMake 版本更新为
3.21.0+,以避免 CMake bug 导致 Android Studio 的 Gradle 同步失败 (#9933)。
- 将 CMake 版本更新为
- 移除了已废弃的符号:
- 移除了
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)。改用Player.Listener.onTracksChanged(Tracks)。 - 移除了
Player.getCurrentTrackGroups和Player.getCurrentTrackSelections。改用Player.getCurrentTracks。您也可以继续使用ExoPlayer.getCurrentTrackGroups和ExoPlayer.getCurrentTrackSelections,尽管这些方法已废弃。 - 移除了
DownloadHelperDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT和DEFAULT_TRACK_SELECTOR_PARAMETERS常量。尽可能改用getDefaultTrackSelectorParameters(Context),或者使用DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT。 - 移除了构造函数
DefaultTrackSelector(ExoTrackSelection.Factory)。 改用DefaultTrackSelector(Context, ExoTrackSelection.Factory)。 - 移除了
Transformer.Builder.setContext。改为将Context传递给Transformer.Builder构造函数。
- 移除了
版本 1.0.0-alpha03
2022 年 3 月 14 日
发布了 androidx.media3:media3-*:1.0.0-alpha03。版本 1.0.0-alpha03 包含这些提交内容。
这与 ExoPlayer 2.17.1 版本相对应。
- 音频:
- 修复了 HLS 中杜比全景声 (E-AC3-JOC) 音频检查功能的错误。
- 提取器:
- FMP4:修复了包含 v0 和 v1 emsg Atom 的数据流 emsg 示例元数据可能会以错误的顺序输出的问题 (#9996)。
- 文本:
- 修复了
SingleSampleMediaSource.Factory.setTrackId和MediaItem.SubtitleConfiguration.Builder.setId的互动以优先处理SubtitleConfiguration字段,如果未设置,回退到Factory值 (#10016)。
- 修复了
- 广告播放:
- 修复了直播 HLS SSAI 数据流中广告时段之间的音频欠载问题。
版本 1.0.0-alpha02
2022 年 3 月 2 日
发布了 androidx.media3:media3-*:1.0.0-alpha02。版本 1.0.0-alpha02 包含这些提交内容。
这与 ExoPlayer 2.17.0 版本相对应。
- 核心库:
- 添加了受保护的方法
DefaultRenderersFactory.getCodecAdapterFactory(),这样,替换buildVideoRenderers()或buildAudioRenderers()的DefaultRenderersFactory子类就可以访问编解码器适配器工厂,并将其传递给它们创建的MediaCodecRenderer实例。 - 将 ICY 标头字段
name和genre分别传播到MediaMetadata.station和MediaMetadata.genre,以便它们通过Player.Listener.onMediaMetadataChanged()到达应用 (#9677)。 - 从
DefaultHttpDataSource#getResponseHeaders中移除了 null 键。 - 在创建
MediaCodec实例失败时会休眠并重试。这可解决在将 Surface 从一个安全的编解码器切换到另一个编解码器时,某些设备上会出现的问题 (#8696)。 - 添加了
MediaCodecAdapter.getMetrics()以允许用户从MediaCodec获取指标数据。(#9766)。 - 修复了 Maven 依赖项解析 (#8353)。
- 如果直播既没有低延迟功能也没收到要设置速度的用户请求,则停用直播的自动速度调整功能 (#9329)。
- 已将
DecoderCounters#inputBufferCount重命名为queuedInputBufferCount。 - 将
SimpleExoPlayer.renderers设为了不公开。可通过ExoPlayer.getRenderer访问渲染程序。 - 更新了一些
AnalyticsListener.EventFlags常量值,以与Player.EventFlags中的值匹配。 - 将
AnalyticsCollector拆分为一个接口和默认实现,以允许它在不为应用所需时由 R8 去掉。
- 添加了受保护的方法
- 轨道选择:
- 支持在轨道选择中使用首选视频角色标志 (#9402)。
- 将视频轨道选择逻辑更新为:在选择多个视频轨道用于自适应调整时,考虑首选的 MIME 类型和角色标志 (#9519)。
- 将视频和音频轨道选择逻辑更新为:仅为解码器和硬件支持的级别相同的自适应选择项选择格式 (#9565)。
- 将视频轨道选择逻辑更新为:如果主要的硬件加速解码器支持多个编解码器,则优先选用效率较高的编解码器 (#4835)。
- 相较于技术轨道选择约束(例如,首选的 MIME 类型或频道数量上限),优先选用音频内容偏好设置(例如,“默认”音轨或某个与系统语言区域的语言相匹配的轨道)。
- 修复了以下轨道选择问题:替换一个轨道组不会停用同一类型的其他轨道组 (#9675)。
- 修复了以下轨道选择问题:同时存在非空和空轨道替换时无法正确应用 (#9649)。
- 禁止
TrackGroupArray中有重复的TrackGroup。始终可通过在TrackGroup构造函数中设置id而使TrackGroup可区分开。这修复了以下问题:通过活跃轨道替换使应用转入后台再继续播放时会发生崩溃 (#9718)。 - 修正了
AdaptiveTrackSelection中的逻辑,在网络带宽足够的情况下允许提高质量,即使播放质量已非常接近当时的极限时也是如此 (#9784)。
- 视频:
- 修复了杜比视界的解码器回退逻辑,以在需要时使用兼容的 H264/H265 解码器。
- 音频:
- 提取器:
- 文本:
- DRM:
- 从
DrmSessionManager.(pre)acquireSession中移除了playbackLooper。 当自定义的MediaSource中的应用使用DrmSessionManager时,需要改为将playbackLooper传递给DrmSessionManager.setPlayer。
- 从
- 广告播放/IMA:
- 添加了对 IMA 动态广告插播 (DAI) 的支持 (#8213)。
- 向
AdPlaybackState中添加了一个允许重置广告组的方法,以便广告组可以再次播放 (#9615)。 - 在广告播放期间强制保持 1.0 的播放速度 (#9018)。
- 修复了以下问题:未能加载广告组导致播放立即重置 (#9929)。
- 界面:
- DASH:
- HLS:
- RTSP:
- 转换器:
- 将要求的最低 API 版本提高到 21。
TransformationException现已用于描述转换期间发生的错误。- 添加了
TransformationRequest以指定转换选项。 - 允许注册多个监听器。
- 修复了当读取了部分编解码器输出内容时转换器卡住的问题。
- 修复了在释放多路复用器抛出项时
Transformer.getProgress中潜在的 NPE 问题。 - 添加了用于应用转换的演示版应用。
- MediaSession 扩展程序:
- 默认情况下,
MediaSessionConnector现会在停止时清除播放列表。希望保留播放列表的应用可以在连接器上调用setClearMediaItemsOnStop(false)。
- 默认情况下,
- Cast 扩展程序:
- FFmpeg 扩展程序:
- 让
build_ffmpeg.sh依赖于 LLVM(而非 GNU)的 bin utils (#9933)。
- 让
- Android 12 兼容性:
- 将 Cast 扩展程序升级为依赖于
com.google.android.gms:play-services-cast-framework:20.1.0。早期版本的play-services-cast-framework与以 Android 12 为目标平台的应用不兼容,会在创建PendingIntent时崩溃并产生IllegalArgumentException(#9528)。
- 将 Cast 扩展程序升级为依赖于
- 移除了已废弃的符号:
- 移除了
Player.EventListener。改用Player.Listener。 - 移除了
MediaSourceFactory#setDrmSessionManager、MediaSourceFactory#setDrmHttpDataSourceFactory和MediaSourceFactory#setDrmUserAgent。改用MediaSourceFactory#setDrmSessionManagerProvider。 - 移除了
MediaSourceFactory#setStreamKeys。改用MediaItem.Builder#setStreamKeys。 - 移除了
MediaSourceFactory#createMediaSource(Uri)。改用MediaSourceFactory#createMediaSource(MediaItem)。 - 从
DashMediaSource、HlsMediaSource和SsMediaSource中移除了setTag。改用MediaItem.Builder#setTag。 - 移除了
DashMediaSource#setLivePresentationDelayMs(long, boolean)。使用MediaItem.Builder#setLiveConfiguration和MediaItem.LiveConfiguration.Builder#setTargetOffsetMs替换清单,或使用DashMediaSource#setFallbackTargetLiveOffsetMs提供回退值。 - 移除了
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread。无法再选择停用线程强制执行。 - 移除了
ActionFile和ActionFileUpgradeUtil。使用 ExoPlayer 2.16.1 或更低版本,以利用ActionFileUpgradeUtil将旧版操作文件合并到DefaultDownloadIndex中。 - 移除了
ProgressiveMediaSource#setExtractorsFactory。改用ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)构造函数。 - 移除了
ProgressiveMediaSource.Factory#setTag和ProgressiveMediaSource.Factory#setCustomCacheKey。改用MediaItem.Builder#setTag和MediaItem.Builder#setCustomCacheKey。 - 移除了
DefaultRenderersFactory(Context, @ExtensionRendererMode int)和DefaultRenderersFactory(Context, @ExtensionRendererMode int, long)构造函数。改用DefaultRenderersFactory(Context)构造函数、DefaultRenderersFactory#setExtensionRendererMode和DefaultRenderersFactory#setAllowedVideoJoiningTimeMs。 - 移除了所有公开的
CronetDataSource构造函数。改用CronetDataSource.Factory。
- 移除了
- 将以下
IntDefs更改为仅限@Target(TYPE_USE)。这可能会破坏相应 Kotlin 代码的编译,解决方法是将注解更改为对类型 (Int) 进行注解。@AacAudioObjectType@Ac3Util.SyncFrameInfo.StreamType@AdLoadException.Type@AdtsExtractor.Flags@AmrExtractor.Flags@AspectRatioFrameLayout.ResizeMode@AudioFocusManager.PlayerCommand@AudioSink.SinkFormatSupport@BinarySearchSeeker.TimestampSearchResult.Type@BufferReplacementMode@C.BufferFlags@C.ColorRange@C.ColorSpace@C.ColorTransfer@C.CryptoMode@C.Encoding@C.PcmEncoding@C.Projection@C.SelectionReason@C.StereoMode@C.VideoOutputMode@CacheDataSource.Flags@CaptionStyleCompat.EdgeType@DataSpec.Flags@DataSpec.HttpMethods@DecoderDiscardReasons@DecoderReuseResult@DefaultAudioSink.OutputMode@DefaultDrmSessionManager.Mode@DefaultTrackSelector.SelectionEligibility@DefaultTsPayloadReaderFactory.Flags@EGLSurfaceTexture.SecureMode@EbmlProcessor.ElementType@ExoMediaDrm.KeyRequest.RequestType@ExtensionRendererMode@Extractor.ReadResult@FileTypes.Type@FlacExtractor.Flags(在com.google.android.exoplayer2.ext.flac软件包中)@FlacExtractor.Flags(在com.google.android.exoplayer2.extractor.flac软件包中)@FragmentedMp4Extractor.Flags@HlsMediaPlaylist.PlaylistType@HttpDataSourceException.Type@IllegalClippingException.Reason@IllegalMergeException.Reason@LoadErrorHandlingPolicy.FallbackType@MatroskaExtractor.Flags@Mp3Extractor.Flags@Mp4Extractor.Flags@NotificationUtil.Importance@PlaybackException.FieldNumber@PlayerNotificationManager.Priority@PlayerNotificationManager.Visibility@PlayerView.ShowBuffering@Renderer.State@RendererCapabilities.AdaptiveSupport@RendererCapabilities.Capabilities@RendererCapabilities.DecoderSupport@RendererCapabilities.FormatSupport@RendererCapabilities.HardwareAccelerationSupport@RendererCapabilities.TunnelingSupport@SampleStream.ReadDataResult@SampleStream.ReadFlags@StyledPlayerView.ShowBuffering@SubtitleView.ViewType@TextAnnotation.Position@TextEmphasisSpan.MarkFill@TextEmphasisSpan.MarkShape@Track.Transformation@TrackOutput.SampleDataPart@Transformer.ProgressState@TsExtractor.Mode@TsPayloadReader.Flags@WebvttCssStyle.FontSizeUnit
版本 1.0.0-alpha01
2021 年 10 月 27 日
发布了 androidx.media3:media3-*:1.0.0-alpha01。版本 1.0.0-alpha01 包含这些提交内容。
新功能
Media3 是面向媒体支持库(包括 ExoPlayer)的新平台。首个 Alpha 版包含用于实现媒体用例的库的早期功能实现,包括:
- ExoPlayer - 一种适用于 Android 的应用级媒体播放器,可轻松自定义和扩展。
- 用于公开和控制播放的媒体会话功能。这一新的会话模块使用与 ExoPlayer 相同的
Player接口。 - 用于构建媒体播放界面的界面组件。
- 其他库中用于 ExoPlayer 的模块封装功能,例如通过 IMA SDK 插入广告。
如需了解详情,请参阅 Media3 GitHub 项目。
之前,ExoPlayer 托管在单独的 ExoPlayer GitHub 项目中。在 Media3 中,其软件包名称为 androidx.media3.exoplayer。我们计划在一段时间内继续维护和发布 ExoPlayer GitHub 项目,以便让应用有时间迁移到 Media3。Media3 取代了所有 ExoPlayer 模块,但旧版 media2 和 mediasession 扩展程序除外,后者已被新的 media3-session 模块取代。这可以实现播放器和媒体会话之间的直接集成,而无需使用适配器/连接器类。