Media3
最新更新 | 稳定版本 | 候选版本 | Beta 版本 | Alpha 版本 |
---|---|---|---|---|
2024 年 8 月 27 日 | 1.4.1 | - | - | - |
声明依赖项
要添加对 Media3 的依赖项,您必须将 Google Maven 存储库添加到您的项目中。阅读 Google 的 Maven 存储库 以了解更多信息。
在应用或模块的 build.gradle
文件中添加您需要的工件的依赖项
Groovy
dependencies { def media3_version = "1.4.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 implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" }
Kotlin
dependencies { val media3_version = "1.4.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 implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") }
有关依赖项的更多信息,请参阅 添加构建依赖项.
反馈
您的反馈有助于改进 Jetpack。您可以使用 Media3 问题跟踪器 查找问题的答案、已知问题和功能请求,以及提交新问题。
版本 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
中的IndexOutOfBoundsException
,原因是错误地处理了请求的输出开始时间大于或等于Subtitle
中的最终事件时间的情况 (#1516).
- TTML:修复对百分比
- DRM
- 修复 API 31+ 设备上播放 L1 Widevine 内容时的
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
错误。此错误是由框架MediaDrm.requiresSecureDecoder
方法的实现不完整引起的 (#1603).
- 修复 API 31+ 设备上播放 L1 Widevine 内容时的
- 效果
- 向
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.Builder.setImageDurationMs()
的持续时间对于非图像MediaItem
被忽略(如文档所述)。 - 添加
Format.customData
以存储应用程序提供的关于Format
实例的自定义信息。
- 将假定的无操作查找调用转发到受保护的
- ExoPlayer
- 添加
BasePreloadManager
,它根据其rankingData
定义的优先级协调多个来源的预加载。可以通过扩展此类进行自定义。添加DefaultPreloadManager
,它使用PreloadMediaSource
将来源的媒体样本预加载到内存中,并使用一个整数rankingData
,它指示 UI 上项目的索引。 - 将
PlayerId
添加到LoadControl
的大多数方法,以使LoadControl
实现能够支持多个播放器。 - 删除
Buffer.isDecodeOnly()
和C.BUFFER_FLAG_DECODE_ONLY
。无需设置此标志,因为渲染器和解码器将根据时间戳决定跳过缓冲区。自定义Renderer
实现应该检查缓冲区时间是否至少为BaseRenderer.getLastResetPositionUs()
,以决定是否应该显示样本。自定义SimpleDecoder
实现可以检查isAtLeastOutputStartTimeUs()
(如果需要)或用DecoderOutputBuffer.shouldBeSkipped
标记其他缓冲区以跳过它们。 - 允许
TargetPreloadStatusControl.getTargetPreloadStatus(T)
返回空值,以指示不要预加载具有给定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
实现预加载下一个来源或采取其他操作。 - 修复了在项目末尾跳过静音会导致播放异常的错误。
- 将
clear
添加到PreloadMediaSource
,以丢弃预加载时间段。 - 添加新的错误代码
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
,当为优先级更高的任务回收编解码器资源时使用。 - 允许
AdsMediaSource
在初始内容媒体准备完成之前加载前贴广告 (#1358). - 修复了在原始时间段已从清单中移除后重新准备多时间段 DASH 直播流时,播放移至
STATE_ENDED
的错误。 - 将
onTimelineRefreshed()
重命名为onSourcePrepared()
,将onPrepared()
重命名为onTracksSelected()
,位于PreloadMediaSource.PreloadControl
中。相应地重命名DefaultPreloadManager.Stage
中的 IntDefs。 - 添加对动态调度的实验性支持,以更好地将工作与 CPU 唤醒周期对齐,并将唤醒延迟到渲染器可以进行时。您可以在设置 ExoPlayer 实例时使用
experimentalSetDynamicSchedulingEnabled()
启用此功能。 - 添加
Renderer.getDurationToProgressUs()
。一个Renderer
可以实现此方法以返回到 ExoPlayer 渲染器要进行的播放必须前进的持续时间。如果 ExoPlayer 设置为experimentalSetDynamicSchedulingEnabled()
,则 ExoPlayer 会在计算调度工作任务的时间时调用此方法。 - 添加
MediaCodecAdapter#OnBufferAvailableListener
,以在MediaCodecRenderer
可使用输入和输出缓冲区时发出警报。MediaCodecRenderer
在收到这些回调时会向 ExoPlayer 发出信号,如果 ExoPlayer 设置为experimentalSetDynamicSchedulingEnabled()
,则 ExoPlayer 会安排其工作循环,因为渲染器可以取得进展。 - 使用数据类代替单个参数,用于
LoadControl
方法。 - 添加
ExoPlayer.isReleased()
以检查是否已调用Exoplayer.release()
。 - 添加
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
以配置seekToPrevious()
将其查找到上一个项目的最大位置 (#1425). - 修复了一些音频焦点不一致,例如,在播放器暂停时未报告完全或短暂焦点丢失 (#1436).
- 修复了在提取器在初始准备步骤之后报告了额外的轨道导致的潜在
IndexOutOfBoundsException
(#1476). Effects
在ExoPlayer.setVideoEffect()
中将接收已移除渲染器偏移的时间戳 (#1098).- 修复了在处理提前读取到另一个播放列表项目中的播放器错误时,可能导致的潜在
IllegalArgumentException
(#1483).
- 添加
- 转换器
- 将
audioConversionProcess
和videoConversionProcess
添加到ExportResult
,以指示输出文件中的相应轨道是如何生成的。 - 放松修剪优化 H.264 等级检查。
- 添加对在序列中更改 SDR 和 HDR 输入媒体的支持。
- 添加对合成级音频效果的支持。
- 添加对将超高清 HDR 图像转换为 HDR 视频的支持。
- 修复了
DefaultAudioMixer
在重置和重复使用后未输出正确字节数的问题。 - 解决了解码器错误,在处理 PCM 输入时,音频通道数限制为立体声。
- 在
ExoPlayerAssetLoader
中选择轨道时,忽略音频通道数量约束,因为它们仅适用于播放。 - 用
androidx.media3.muxer.Muxer
替换androidx.media3.transformer.Muxer
接口,并删除androidx.media3.transformer.Muxer
。 - 修复了从内容 URI 方案加载 HEIC 图像的问题。 (#1373).
- 调整
AudioGraphInput
中的音频轨道持续时间以改善 AV 同步。 - 删除
ExportResult.processedInputs
字段。如果您将此字段用于编解码器详细信息,请改用DefaultDecoderFactory.listener
。在编解码器异常的情况下,编解码器详细信息将在ExportException.codecInfo
中提供。
- 将
- 提取器
- MPEG-TS:向前推进更改,通过将流的最后一个访问单元传递给样本队列来确保渲染最后一帧 (#7909)。合并了修复程序,以解决在仅 I 帧 HLS 流 (#1150) 和 H.262 HLS 流 (#1126) 中出现的错误。
- MP3:优先考虑
Info
帧中的数据大小,而不是底层流报告的大小(例如文件大小或 HTTPContent-Length
标头)。这有助于将不可播放的预告片数据(例如专辑封面)从恒定比特率查找计算中排除,从而使查找更加准确 (#1376). - MP3:使用
Info
帧中的帧数和其他数据(如果存在)来计算恒定比特率查找的平均比特率,而不是从Info
帧之后的帧的比特率推断,该帧可能人为地小,例如PCUT
帧 (#1376). - 修复了 AVI 容器中的 PCM 音频格式提取。
- 音频
- 修复了 DTS:X Profile 2 编码属性,用于直通播放 (#1299).
- 对于卸载播放,在调用
AudioTrack.stop()
之前,在DefaultAudioSink
中重置流完成的跟踪字段,以便AudioTrack.StreamEventCallback#onPresentationEnded
正确识别所有待处理的数据何时已播放。 - 修复了
SilenceSkippingAudioProcessor
中的错误,该错误会导致不同音频格式(例如立体声到单声道)之间的转换导致处理器抛出异常 (#1352). - 实现
MediaCodecAudioRenderer.getDurationToProgressUs()
,以便 ExoPlayer 会在 MediaCodecAudioRenderer 可以取得进展时动态调度其主工作循环。
- 视频
- 修复了在播放过程中切换曲面时
Listener.onRenderedFirstFrame()
过早到达的问题。 - 修复了 Dolby Vision 的解码器回退逻辑,以便在需要时使用兼容的 AV1 解码器 (#1389).
- 修复了在播放过程中启用视频渲染器可能导致的编解码器异常。
- 修复了在播放过程中切换曲面时
- 文本
- 修复了在查找位置之前开始的字幕被跳过的错误。此错误是在 Media3 1.4.0-alpha01 中引入的。
- 更改默认字幕解析行为,使其在提取过程中发生,而不是在渲染过程中发生(请参阅ExoPlayer 的架构图,了解提取和渲染之间的区别)。
- 可以通过同时调用 两个 方法
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
和TextRenderer.experimentalSetLegacyDecodingEnabled(true)
来覆盖此更改。有关如何将这些组件连接到ExoPlayer
实例的信息,请参阅 自定义文档。这些方法(以及所有对传统字幕解码的支持)将在未来的版本中删除。 - 使用自定义
SubtitleDecoder
实现的应用需要更新它们以改为实现SubtitleParser
(以及SubtitleParser.Factory
而不是SubtitleDecoderFactory
)。
- 可以通过同时调用 两个 方法
- PGS:修复运行长度解码以将
0
解析为颜色索引,而不是字面颜色值(#1367)。 - CEA-708:忽略
rowLock
值。CEA-708-E S-2023 规范指出,无论流中是否存在值,都应假设rowLock
和columnLock
都为真(columnLock
支持未实现,因此实际上始终假设为假)。- 这最初包含在
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
。
- 数据源
- 实现对
android.resource://package/id
原始资源 URI 的支持,其中package
与当前应用程序的包不同。这以前没有记录为有效,但它是访问另一个包中资源的比按名称更有效的方式。 - 在
DataSpec
构造函数中,尽早检查url
是否不为空。此参数已标注为非空。 - 允许
ByteArrayDataSource
在open()
期间将 URI 解析为字节数组,而不是在构造时硬编码(#1405)。
- 实现对
- DRM
- 允许在
DefaultDrmSessionManagerProvider
上设置LoadErrorHandlingPolicy
(#1271)。
- 允许在
- 效果
- 支持在
SpeedChangeEffect
中的相同EditedMediaItem
或Composition
内进行多次速度更改。 - 支持从超 HDR 位图输入输出 HLG 和 PQ。
- 添加对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,这在 ExoPlayer.setVideoEffect 和 Transformer 的调试 SurfaceView 中改进了 HLG 表面输出。
- 更新覆盖矩阵实现,使其通过翻转在
setOverlayFrameAnchor()
中应用的 x 和 y 值来与文档保持一致。如果使用OverlaySettings.Builder.setOverlayFrameAnchor()
,请将它们的 x 和 y 值翻转,方法是将它们乘以-1
。 - 修复当与
ExoPlayer#setVideoEffects
一起使用时,TimestampWrapper
会崩溃的错误(#821)。 - 将默认的 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。还提供第三个选项以保留原始颜色空间。
- 允许定义 EditedMediaItemSequences 的不确定 z 顺序(#1055)。
- 在不同的 HDR 内容片段中保持一致的亮度范围(使用 HLG 范围)。
- 添加对 HDR 内容上的超 HDR(位图)覆盖的支持。
- 允许在 API 26 之前使用
SeparableConvolution
效应。 - 删除未使用的
OverlaySettings.useHdr
,因为覆盖和帧的动态范围必须匹配。 - 添加对
TextOverlay
的 HDR 支持。可以使用OverlaySettings.Builder.setHdrLuminanceMultiplier()
调整文本覆盖的亮度。
- 支持在
- IMA 扩展
- 将应用播放 DAI 广告流 所需的 API 提升为稳定状态。
- 添加
replaceAdTagParameters(Map <String, String>)
到ImaServerSideAdInsertionMediaSource.AdLoader
,允许在运行时替换广告标签参数。 - 修复在广告播放期间发生播放器错误时,未调用
VideoAdPlayer.VideoAdPlayerCallback.onError()
的错误(#1334)。 - 将 IMA SDK 版本更新为 3.33.0,以修复使用
data://
广告标签 URI 时出现的NullPointerException
(#700)。
- 会话
- 将
CommandButton.enabled
的默认值更改为true
,并确保即使关联的命令可用,该值也可以保持为 false,用于控制器。 - 添加用于
CommandButton
的图标常量,应使用这些常量而不是自定义图标资源。 - 添加
MediaSessionService.isPlaybackOngoing()
,让应用查询服务是否需要在onTaskRemoved()
中停止(#1219)。 - 添加
MediaSessionService.pauseAllPlayersAndStopSelf()
,它方便地允许暂停所有会话的播放,并调用stopSelf()
来终止MediaSessionService
的生命周期。 - 覆盖
MediaSessionService.onTaskRemoved(Intent)
以提供一个安全的默认实现,如果播放正在进行,则使服务保持在前景,否则停止服务。 - 通过不在平台会话元数据中设置持续时间来隐藏直播流的媒体通知中的进度条(#1256)。
- 对齐
MediaMetadata
到MediaDescriptionCompat
的转换,以在选择元数据属性时使用与 media1 中相同的首选顺序和逻辑。 - 添加
MediaSession.sendError()
,允许向 Media3 控制器发送非致命错误。当使用通知控制器(参见MediaSession.getMediaNotificationControllerInfo()
)时,自定义错误用于将平台会话的PlaybackState
更新为具有给定错误信息的错误状态(#543)。 - 添加
MediaSession.Callback.onPlayerInteractionFinished()
以通知会话来自特定控制器的播放器交互序列何时完成。 - 添加
SessionError
并将其用于SessionResult
和LibraryResult
,而不是错误代码,以提供有关错误的更多信息以及如何解决错误(如果可能)。 - 发布媒体 3 控制器测试应用程序的代码,该应用程序可用于测试与发布媒体会话的应用程序的交互。
- 将传递给 media3 的
MediaSession[Builder].setSessionExtras()
的额外信息传播到 media1 控制器的PlaybackStateCompat.getExtras()
。 - 将致命错误和非致命错误映射到平台会话,并从平台会话映射到致命错误和非致命错误。将
PlaybackException
映射到PlaybackStateCompat
的致命错误状态。将SessionError
使用MediaSession.sendError(ControllerInfo, SessionError)
发送到媒体通知控制器,将映射到PlaybackStateCompat
中的非致命错误,这意味着错误代码和消息已设置,但平台会话的状态仍然不同于STATE_ERROR
。 - 允许每个控制器设置会话活动以覆盖全局会话活动。可以在连接时通过创建具有
AcceptedResultBuilder.setSessionActivivty(PendingIntent)
的ConnectionResult
来为控制器定义会话活动。连接后,可以使用MediaSession.setSessionActivity(ControllerInfo, PendingIntent)
更新会话活动。 - 改进对
MediaLibrarySession.Callback
的调用的错误复制。现在可以通过使用MediaLibrarySession.Builder.setLibraryErrorReplicationMode()
来配置错误复制,以选择错误类型或选择退出错误复制(默认情况下为开启)。
- 将
- UI
- 下载
- 确保
DownloadHelper
不会泄漏未释放的Renderer
实例,这最终会导致应用程序因IllegalStateException: Too many receivers, total of 1000, registered for pid
而崩溃(#1224)。
- 确保
- Cronet 扩展
- 修复
CronetDataSource
中的SocketTimeoutException
。在某些版本的 Cronet 中,回调提供的请求并不总是相同的。这会导致回调未完成且请求超时(https://issuetracker.google.com/328442628)。
- 修复
- HLS 扩展
- 修复在
HlsSampleStreamWrapper
中,等待不连续的待处理 EMSG 样本以不正确的偏移量委托,导致IndexOutOfBoundsException
或IllegalArgumentException
的错误(#1002)。 - 修复非主要播放列表对 LL-HLS 流保持重新加载的错误(#1240)。
- 修复为具有初始化段的 HLS 启用 CMCD 会导致
Source Error
和IllegalArgumentException
的错误。 - 修复了在直播播放期间未刷新非主播放列表的错误 (#1240).
- 修复了为 HLS 直播流启用 CMCD 会导致
ArrayIndexOutOfBoundsException
的错误 (#1395).
- 修复在
- DASH 扩展
- Cast 扩展
- 修复了将
MediaQueueItem
的专辑标题转换为 Media3 媒体项目中的艺术家信息的错误 (#1255).
- 修复了将
- 测试工具
- 在
FakeRenderer
中实现onInit()
和onRelease()
。 - 将
TestPlayerRunHelper.runUntil()/playUntil()
方法更改为在非致命错误时失败(例如报告给AnalyticsListener.onVideoCodecError()
的错误)。使用新的TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
方法链来禁用此行为。
- 在
- 演示应用
- 在简短形式的演示应用中使用
DefaultPreloadManager
。 - 允许使用命令行中的
Intent
参数设置重复模式 (#1266). - 当设备支持时,使用
HttpEngineDataSource
作为HttpDataSource
。
- 在简短形式的演示应用中使用
- 移除弃用的符号
- 移除
CronetDataSourceFactory
。使用CronetDataSource.Factory
代替。 - 移除一些
DataSpec
构造函数。使用DataSpec.Builder
代替。 - 从
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.FormatSupport
IntDef 和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
- 转换器
- 添加解决方法以解决由于
MediaMuxer
在 API 30 之前不支持负表示时间戳而导致的异常。
- 添加解决方法以解决由于
- 轨道选择
DefaultTrackSelector
:优先考虑具有“合理”帧率(>=10fps)的视频轨道,而不是具有较低或未设置帧率的轨道。这确保播放器在从包含两个 HEVC 轨道的运动照片中提取的 MP4 中选择“真实”视频轨道,其中一个轨道具有更高的分辨率,但帧数非常少 (#1051).
- 提取器
- 音频
- 允许通过在卸载模式下音频轨道初始化失败时禁用卸载来恢复渲染器。
- 视频
- 文本
- WebVTT:防止直接连续的提示从
WebvttParser.parse
创建虚假额外的CuesWithTiming
实例 (#1177).
- WebVTT:防止直接连续的提示从
- DRM
- 解决一些 Android 14 设备上
MediaDrm
框架抛出的NoSuchMethodError
,而不是ResourceBusyException
或NotProvisionedException
(#1145).
- 解决一些 Android 14 设备上
- 效果
- 通过转换颜色空间改进 PQ 到 SDR 的色调映射。
- 会话
- UI
- 如果
Locale
无法识别显示名称,则回退以包含音频轨道语言名称 (#988).
- 如果
- DASH 扩展
- 将清单中的所有
Label
元素填充到Format.labels
中 (#1054).
- 将清单中的所有
- RTSP 扩展
- 在 SDP 解析中跳过空会话信息值(i 标记)(#1087).
- 编解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
- 默认情况下禁用 MIDI 扩展作为本地依赖项,因为它需要配置额外的 Maven 存储库。需要从本地依赖项中使用此模块的用户 可以重新启用它。
版本 1.3.0
2024 年 3 月 6 日
androidx.media3:media3-*:1.3.0
已发布。版本 1.3.0 包含 这些提交。
- 通用库
- 实现对
android.resource://package/[type/]name
原始资源 URI 的支持,其中package
与当前应用程序的包不同。这始终记录为可以工作,但直到现在才正确实现。 - 将应用代码设置或从媒体读取的 MIME 类型标准化为全部小写。
- 在
AdPlaybackState
中使用完整的MediaItem
来定义广告,而不是单个Uri
。 - 将
minSdk
提高到 19(Android KitKat)。这与 所有其他 AndroidX 库保持一致,并且是我们升级到最新版本的 AndroidX 依赖项所必需的。 - 当至少一个非空时,在
MediaMetadata.Builder.populate(MediaMetadata)
中填充artworkUri
和artworkData
(#964).
- 实现对
- ExoPlayer
- 添加
PreloadMediaSource
和PreloadMediaPeriod
,允许应用在播放之前以特定起始位置预加载内容媒体源。PreloadMediaSource
负责准备内容媒体源以接收Timeline
,准备和缓存给定起始位置的时段,选择轨道并加载时段的媒体数据。应用通过实现PreloadMediaSource.PreloadControl
来控制预加载进度,并将预加载的源设置为播放器的播放。 - 添加
ExoPlayer.setImageOutput
,允许应用设置ImageRenderer.ImageOutput
。 DefaultRenderersFactory
现在默认情况下为播放器提供ImageRenderer
,带有空ImageOutput
和ImageDecoder.Factory.DEFAULT
。- 当跳过静音时,发出
Player.Listener.onPositionDiscontinuity
事件 (#765). - 添加对在提取期间解析字幕的实验性支持。可以使用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
启用此功能。 - 支持具有
PreloadMediaSource
的自适应媒体源。 - 实现
HttpEngineDataSource
,一个使用 HttpEngine API 的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
都为真(columnLock
支持未实现,因此实际上始终假设为假)。
- 修复位图提示的序列化以解决在使用
- 图像
- 添加对 DASH 缩略图的支持。网格图像被裁剪,单个缩略图在接近其呈现时间时被提供给
ImageOutput
。
- 添加对 DASH 缩略图的支持。网格图像被裁剪,单个缩略图在接近其呈现时间时被提供给
- DRM
- 默认情况下立即播放 DRM 内容中的“清除引导”未加密样本,即使后面的加密样本的密钥尚未准备好。如果在播放位置到达加密样本时密钥仍然没有准备好,这可能会导致播放过程中出现停顿(但以前在这一点上播放根本不会开始)。这种行为可以通过
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
或DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
禁用。
- 默认情况下立即播放 DRM 内容中的“清除引导”未加密样本,即使后面的加密样本的密钥尚未准备好。如果在播放位置到达加密样本时密钥仍然没有准备好,这可能会导致播放过程中出现停顿(但以前在这一点上播放根本不会开始)。这种行为可以通过
- IMA 扩展
- 修复了没有适当文件扩展名的 DASH 和 HLS 广告无法播放的问题。
- 会话
- 为电视应用禁用双击检测 (#962).
- 修复了
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).
- 元数据
- 修复了
MediaMetadata
仅从具有大写键的 Vorbis 注释中填充的问题 (#876). - 在解析非常大的 ID3 帧时捕获
OutOfMemoryError
,这意味着播放可以继续而无需标签信息,而不是播放完全失败。
- 修复了
- DRM
- 将虚假 ClearKey
https://default.url
许可证 URL 的解决方法扩展到 API 33+(以前该解决方法仅适用于 API 33)(#837)。 - 修复了在没有表面附加到播放器的情况下从加密内容切换到清除内容时出现的
ERROR_DRM_SESSION_NOT_OPENED
错误。该错误是由于错误地使用安全解码器播放清除内容导致的。
- 将虚假 ClearKey
- 会话
- UI
- 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 兼容性问题,其中可空泛型类型参数和可空数组元素类型未被检测为可空。例如,
TrackSelectorResult
和SimpleDecoder
方法参数 (#6792). - 更改
Util.shouldShowPlayButton
中的默认 UI 和通知行为,以便在播放暂时被抑制时(例如,由于短暂的音频焦点丢失)显示“播放”按钮。可以通过使用PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
或MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
来保留旧的行为 (#11213). - 将
androidx.annotation:annotation-experimental
升级到1.3.1
以修复 https://issuetracker.google.com/251172715。 - 将
ExoPlayer.setAudioAttributes
移动到Player
接口。
- 向
- ExoPlayer
- 修复了 AC4 流中由于未正确识别仅解码样本而导致的查找问题 (#11000).
- 添加了在不合适的音频输出设备(例如,Wear OS 设备上的内置扬声器)上抑制播放的功能,当通过
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
启用此功能时。如果在没有合适的音频输出的情况下尝试播放,或者在播放期间所有合适的输出都断开连接,则播放抑制原因将更新为Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
。当连接了合适的输出时,将删除抑制原因。 - 添加
MediaSource.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)
。除了现有的playbackPositionUs
外,LoadingInfo
还包含其他参数,包括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 classic 的支持。
- 音频
- 添加对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析 MP4 中
lpcm
的 PCM 编码。 - 添加对从 MP4 中提取 Vorbis 音频的支持。
- 添加
AudioSink.getFormatOffloadSupport(Format)
,它通过DefaultAudioOffloadSupportProvider
获取接收器可以为格式提供的卸载支持级别。它返回新的AudioOffloadSupport
,其中包含isFormatSupported
、isGaplessSupported
和isSpeedChangeSupported
。 - 添加
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
的错误 (#677)。
- 添加对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析 MP4 中
- 视频
- 允许
MediaCodecVideoRenderer
使用自定义的VideoFrameProcessor.Factory
。 - 修复如果音频流以负时间戳开头,则无法渲染第一帧的错误 (#291)。
- 允许
- 文本
- 移除
ExoplayerCuesDecoder
。现在,sampleMimeType = application/x-media3-cues
的文本轨道由TextRenderer
直接处理,而不需要SubtitleDecoder
实例。
- 移除
- 元数据
- 对于“仅解码”样本,
MetadataDecoder.decode
将不再被调用,因为实现必须始终返回 null。
- 对于“仅解码”样本,
- 效果
- 添加
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
,通过时间戳对位图输入进行排队。 - 更改
VideoFrameProcessor.registerInputStream()
使其为非阻塞操作。应用程序必须实现VideoFrameProcessor.Listener#onInputStreamRegistered()
。 - 将
VideoFrameProcessor.queueInputBitmap
的frameRate
和durationUs
参数更改为TimestampIterator
。
- 添加
- IMA 扩展
- 修复多周期 DASH 直播流(不是播放列表中的第一个项目)可能会抛出异常的错误 (#571)。
- 在调用
AdsLoader.destroy()
之前释放 StreamManager。 - 将 IMA SDK 版本更新到 3.31.0。
- 会话
- 在
DefaultMediaNotificationProvider
中将通知前台服务行为设置为FOREGROUND_SERVICE_IMMEDIATE
(#167)。 - 在 API 31 以上仅使用
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
,以避免在三星设备上出现与已弃用 API 相关的问题 (#167)。 - 使用媒体通知控制器作为代理来设置可用的命令和用于填充通知和平台会话的自定义布局。
- 将媒体按钮事件(由 Media3 中的
MediaSessionService.onStartCommand()
接收)转换为 Media3,而不是将它们路由到平台会话,然后再路由回 Media3。通过这样做,调用者控制器始终是媒体通知控制器,并且应用程序可以轻松地以相同的方式识别来自所有受支持 API 等级的通知的调用。 - 修复
MediaController.getCurrentPosition()
在连接到旧版MediaSessionCompat
时不会推进的错误。 - 添加
MediaLibrarySession.getSubscribedControllers(mediaId)
以便于使用。 - 覆盖
MediaLibrarySession.Callback.onSubscribe()
以断言控制器订阅的父 ID 的可用性。如果成功,则接受订阅并立即调用notifyChildrenChanged()
以通知浏览器 (#561)。 - 添加汽车操作系统会话演示模块,并为 Android Auto 启用会话演示。
- 当媒体通知控制器不可用
COMMAND_GET_TIMELINE
时,不要设置框架会话的队列。当 Android Auto 作为从框架会话读取的客户端控制器时,这会导致 Android Auto UI 中的queue
按钮不显示 (#339)。 - 默认情况下使用
DataSourceBitmapLoader
而不是SimpleBitmapLoader
(#271, #327)。 - 添加
MediaSession.Callback.onMediaButtonEvent(Intent)
,它允许应用程序覆盖默认的媒体按钮事件处理。
- 在
- UI
- 为 Wear OS 设备添加
Player.Listener
实现,该实现处理由于Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
导致的播放抑制,方法是启动系统对话框以允许用户连接合适的音频输出(例如蓝牙耳机)。如果在可配置的超时时间内(默认值为 5 分钟)连接了合适的设备,则监听器将自动恢复播放。
- 为 Wear OS 设备添加
- 下载
- 为 Android 14 兼容性声明
DownloadService
的“数据同步”前台服务类型。使用此服务时,应用程序还需要在清单中添加dataSync
作为foregroundServiceType
,并在清单中添加FOREGROUND_SERVICE_DATA_SYNC
权限 (#11239)。
- 为 Android 14 兼容性声明
- HLS 扩展
- 使用从上次加载开始时间而不是上次加载完成时间计算的间隔刷新 HLS 直播播放列表 (#663)。
- DASH 扩展
- 允许在段模板 URL 中使用多个相同的 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 存储库的错误。该工件已重命名为
media3-exoplayer-midi
(#734)。
- Leanback 扩展
- 修复了禁用曲面会导致 Leanback 代码中出现
ArithmeticException
的错误 (#617)。
- 修复了禁用曲面会导致 Leanback 代码中出现
- 测试工具
- 使
TestExoPlayerBuilder
和FakeClock
与 Espresso UI 测试和 Compose UI 测试兼容。这修复了在 Espresso 或 Compose 视图交互期间播放非确定性地推进的错误。
- 使
- 移除弃用的符号
- 删除
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
和TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
。使用Composition.Builder.setHdrMode(int)
并在Transformer.start(Composition, String)
中传递Composition
代替。 - 删除已弃用的
DownloadNotificationHelper.buildProgressNotification
方法,使用不推荐使用的方法,该方法使用notMetRequirements
参数代替。
- 删除
版本 1.2.0-rc01
2023 年 11 月 1 日
使用 1.2.0 稳定版。
版本 1.2.0-beta01
2023 年 10 月 19 日
使用 1.2.0 稳定版。
版本 1.2.0-alpha02
2023 年 9 月 29 日
使用 1.2.0 稳定版。
版本 1.2.0-alpha01
2023 年 8 月 17 日
使用 1.2.0 稳定版。
版本 1.1.0
版本 1.1.1
2023 年 8 月 16 日
- 通用库
- 从所有模块中删除意外添加的
multidex
依赖项 (#499)。
- 从所有模块中删除意外添加的
- ExoPlayer
- 修复了
PlaybackStatsListener
中的错误,该错误在播放列表被清除后创建了虚假的PlaybackStats
。 - 在通用媒体客户端数据 (CMCD) 日志中添加其他字段:流格式 (sf)、流类型 (st)、版本 (v)、最高码率 (tb)、对象持续时间 (d)、测量的吞吐量 (mtp) 和对象类型 (ot) (#8699)。
- 修复了
- 音频
- 修复了
Player.getState()
在播放非常短的文件时从不转换到STATE_ENDED
的错误 (#538)。
- 修复了
- 音频卸载
- 根据 RFC 7845,将 Ogg ID 标头和注释标头页面追加到用于卸载 Opus 播放的比特流。
- 视频
- H.265/HEVC:修复解析 SPS 短期和长期参考图片信息。
- 文本
- CEA-608:将提示截断逻辑更改为仅考虑可见文本。以前,在将提示长度限制为 32 个字符时,缩进和制表符偏移量也被包含在内(这在规范上是技术上正确的)(#11019)。
- IMA 扩展
- 将 IMA SDK 版本提升至 3.30.3。
- 会话
- 向控制器的状态添加自定义布局,并提供一个访问它的获取器。当自定义布局更改时,将调用
MediaController.Listener.onCustomLayoutChanged
。希望向不同的 Media3 控制器发送不同的自定义布局的应用程序可以在MediaSession.Callback.onConnect
中执行此操作,方法是使用AcceptedResultBuilder
确保在连接完成时自定义布局可供控制器使用。 - 修复了
MediaLibraryServiceLegacyStub
向不支持此功能的Result
发送错误,从而产生UnsupportedOperationException
的情况 (#78)。 - 修复了
PlayerWrapper
创建VolumeProviderCompat
的方式,方法是通过传统命令(COMMAND_ADJUST_DEVICE_VOLUME
和COMMAND_SET_DEVICE_VOLUME
)和新命令(COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
和COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
)来确定volumeControlType
(#554)。
- 向控制器的状态添加自定义布局,并提供一个访问它的获取器。当自定义布局更改时,将调用
版本 1.1.0
2023 年 7 月 5 日
- 通用库
- 添加了不适合的音频路由的抑制原因,以及为抑制时间过长添加了播放就绪更改原因。(#15)。
- 向 Player 添加命令
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- 向 Player 添加重载方法,允许用户指定音量标志
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- 添加
Builder
用于DeviceInfo
,并弃用现有构造函数。 - 添加
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
关联。 - 通过添加一个包含用作映射中密钥的 UID 的周期的时间线参数来更改
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
的签名。这是为了避免多周期直播的并发问题。 - 弃用
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)
。 - 修复了在视频流的末尾在输入帧等待处理时发出信号时,转换可能会卡住(导致多路复用器超时)的错误。
- 通过
MediaCodecList
查询编解码器,而不是使用findDecoder/EncoderForFormat
工具,以扩展支持。 - 删除
DefaultEncoderFactory
中的 B 帧配置,因为它在某些设备上不起作用。
- 删除
- 音轨选择
- 添加
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
,默认情况下处于禁用状态。启用后,DefaultTrackSelector
将在渲染器功能更改时触发新的音轨选择。
- 添加
- 提取器
- 音频
- 修复了在启用隧道并且
AudioProcessors
处于活动状态(例如,用于无缝修剪)时,某些播放会失败的错误 (#10847)。 - 在直接播放(卸载)中将 Opus 帧封装在 Ogg 包裹中。
- 使用卸载调度在睡眠期间推断当前位置。
- 添加
Renderer.release()
和AudioSink.release()
用于在播放器生命周期的末尾释放资源。 - 在
DefaultAudioSink
中监听音频功能更改。在DefaultAudioSink
的构造函数中添加一个必需的参数context
,DefaultAudioSink
将使用该参数作为监听器注册到AudioCapabilitiesReceiver
,并在收到功能更改通知时更新其audioCapabilities
属性。 - 通过
AudioSink.Listener
接口中的新事件onAudioCapabilitiesChanged
传播音频功能更改,以及一个新的接口RendererCapabilities.Listener
,该接口触发onRendererCapabilitiesChanged
事件。 - 添加
ChannelMixingAudioProcessor
以对音频声道应用缩放/混合。 - 在音频功能更改后,如果可能绕过模式,则将新的 int 值
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
添加到DecoderDiscardReasons
中,以丢弃音频解码器。 - 添加对 DTS Express 和 DTS:X 的直接播放支持(#335)。
- 修复了在启用隧道并且
- 视频
- 当渲染器被禁用时,使
MediaCodecVideoRenderer
报告一个宽度和高度为 0 的VideoSize
。当Player.getVideoSize()
发生变化时,Player.Listener.onVideoSizeChanged
将相应地被调用。有了这个改变,当Player.getCurrentTracks
不支持视频,或者支持的视频轨道的尺寸尚未确定时,ExoPlayer 的视频尺寸将为 0。
- 当渲染器被禁用时,使
- DRM
- 降低
DefaultDrmSession
上几个仅供内部使用的,且不应从 DRM 包外部调用的方法的可见性。void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- 降低
- Muxer
- 添加一个新的 muxer 库,可用于创建 MP4 容器文件。
- IMA 扩展
- 为 DAI 启用多时段直播 DASH 流。请注意,当前实现尚不支持在直播流中进行跳转(#10912)。
- 修复在直播流中插入新的广告组的错误,因为连续时间轴中计算出的内容位置略有不同。
- 会话
- 添加辅助方法
MediaSession.getControllerForCurrentRequest
以获取有关当前调用Player
方法的控制器的信息。 - 添加
androidx.media3.session.MediaButtonReceiver
,使应用程序能够使用例如蓝牙耳机发送的媒体按钮事件实现播放恢复(#167)。 - 在
MediaSession.Callback.onAddMediaItems
中添加默认实现,以允许将请求的MediaItems
传递到Player
,前提是它们具有LocalConfiguration
(例如 URI)(#282)。 - 在 Android 12 及以下版本中,默认情况下在紧凑型媒体通知视图上添加“跳转到上一首”和“跳转到下一首”命令按钮(#410)。
- 在
MediaSession.Callback.onAddMediaItems
中添加默认实现,以允许将请求的MediaItems
传递到Player
,前提是它们具有LocalConfiguration
(例如 URI)(#282)。 - 在 Android 12 及以下版本中,默认情况下在紧凑型媒体通知视图上添加“跳转到上一首”和“跳转到下一首”命令按钮(#410)。
- 添加辅助方法
- UI
- 添加 Util 方法
shouldShowPlayButton
和handlePlayPauseButtonAction
以使用带播放/暂停按钮的自定义 UI 元素。
- 添加 Util 方法
- RTSP 扩展
- DASH 扩展
- 从多时段 DASH 流的
MediaLoadData.startTimeMs
和MediaLoadData.endTimeMs
中删除媒体时间偏移量。 - 修复重新准备多时段直播 Dash 媒体源会导致
IndexOutOfBoundsException
的错误(#10838)。
- 从多时段 DASH 流的
- HLS 扩展
- 添加
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
以设置加载线程等待TimestampAdjuster
初始化的超时时间。如果初始化在超时前没有完成,则会抛出PlaybackException
,以避免播放无休止地停顿。默认情况下,超时时间设置为 0(#323)。
- 添加
- 测试工具
- 在
DataSourceContractTest
中检查 URI 方案的大小写不敏感性。
- 在
- 移除弃用的符号
- 删除
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
包中的 Kotlin 字符集、java.nio.charset.StandardCharsets
或com.google.common.base.Charsets
。 - 删除已弃用的
WorkManagerScheduler
构造函数,改为使用包含提供Context
参数选项的非弃用构造函数。 - 删除用于实例化
Format
类的已弃用的方法createVideoSampleFormat
、createAudioSampleFormat
、createContainerFormat
和createSampleFormat
。改为使用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)。
- 会话
- 修复
MediaController
在连接到更新其操作的旧版MediaSessionCompat
时不更新其可用命令的问题。 - 修复在 API 30 上阻止
MediaLibraryService
为 System UI 对Callback.onGetLibraryRoot
的调用(其中params.isRecent == true
)返回 null 的错误(#355)。 - 修复
MediaSessionService
或MediaLibraryService
的内存泄漏问题(#346)。 - 修复在
MediaSession
中组合的Timeline
和位置更新可能会导致MediaController
抛出IllegalStateException
的错误。
- 修复
版本 1.0.1
2023 年 4 月 18 日
发布了androidx.media3:media3-*:1.0.1
。版本 1.0.1 包含这些提交。
此版本对应于ExoPlayer 2.18.6 版本。
- 核心库
- 在跳转到默认位置时重置目标直播流覆盖(#11051)。
- 修复媒体中空样本流会导致播放卡住的错误。
- 会话
- 修复旧版
MediaSessionCompat
发布的多个相同的队列项会导致MediaController
中出现异常的错误(#290)。 - 添加对
MediaSession.broadcastCustomCommand
到旧版MediaControllerCompat.Callback.onSessionEvent
的转发(#293)。 - 修复调用
MediaSession.setPlayer
不会更新可用命令的错误。 - 修复从
MediaController
发送的TrackSelectionOverride
实例在引用具有Format.metadata
的组时被忽略的问题(#296)。 - 修复
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
需要可用才能通过旧版MediaSessionCompat
访问元数据的问题。 - 修复在后台线程上的
MediaSession
实例在MediaSessionService
中使用时会导致崩溃的问题(#318)。 - 修复库声明媒体按钮接收器而应用程序没有意愿的问题(#314)。
- 修复旧版
- DASH
- 修复空段时序的处理 (#11014).
- RTSP
- 如果 RTSP 使用 UDP 设置失败,并出现 RTSP 错误 461 UnsupportedTransport,则重试使用 TCP (#11069).
版本 1.0.0
2023 年 3 月 22 日
androidx.media3:media3-*:1.0.0
发布。 版本 1.0.0 包含这些提交。
此版本对应于 ExoPlayer 2.18.5 版本。
自 1.0.0-rc02 以来没有更改。
版本 1.0.0-rc02
2023 年 3 月 2 日
androidx.media3:media3-*:1.0.0-rc02
发布。 版本 1.0.0-rc02 包含这些提交。
此版本对应于 ExoPlayer 2.18.4 版本。
- 核心库
- 下载
- 在
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 描述响应消息时抛出的 IllegalArgumentException (#10971).
- 会话
- 修复通知播放/暂停按钮未随播放器状态更新的错误 (#192).
- IMA 扩展
- 修复由于未收到第一个(在没有广告的情况下也是唯一的)
LOADED
事件,导致没有广告的 DAI 流无法启动的错误。
- 修复由于未收到第一个(在没有广告的情况下也是唯一的)
版本 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 原子时缺少所需的样本描述 (stsd),则抛出
ParserException
而不是NullPointerException
。 - 在 fMP4 中直接搜索到同步帧时,正确跳过样本 (#10941).
- 如果样本表 (stbl) 在解析 trak 原子时缺少所需的样本描述 (stsd),则抛出
- 音频
- 使用压缩音频格式比特率来计算直接播放 (直通) 中
AudioTrack
的最小缓冲区大小。
- 使用压缩音频格式比特率来计算直接播放 (直通) 中
- 文本
- 修复
TextRenderer
如果字幕文件不包含提示,则将无效(负)索引传递给Subtitle.getEventTime
。 - SubRip:如果 UTF-16 文件以字节序标记开头,则添加对 UTF-16 文件的支持。
- 修复
- 元数据
- 解析来自 ID3 帧的多个以 null 分隔的值,如 ID3 v2.4 所允许的那样。
- 添加
MediaMetadata.mediaType
,用于表示内容类型或元数据描述的文件夹类型。 - 添加
MediaMetadata.isBrowsable
作为MediaMetadata.folderType
的替代。文件夹类型将在下一个版本中弃用。
- DASH
- 添加对图像自适应集的完整解析,包括图块计数 (#3752).
- UI
- 会话
- 添加抽象的
SimpleBasePlayer
,以帮助为自定义播放器实现Player
接口。 - 添加帮助程序方法,用于将平台会话令牌转换为 Media3
SessionToken
(#171). - 使用
onMediaMetadataChanged
触发平台媒体会话的更新 (#219). - 将媒体会话作为
DefaultMediaNotificationProvider
的getMediaButtons()
的参数添加,并使用不可变列表以提高清晰度 (#216). - 添加
onSetMediaItems
回调监听器,以提供在将媒体项列表、起始索引和位置设置到播放器之前通过会话修改/设置它们的方法 (#156). - 避免为非蓝牙媒体按钮事件检测双击 (#233).
- 在出现可疑的传统会话状态时,使
QueueTimeline
更加健壮 (#241).
- 添加抽象的
- 元数据
- 解析来自 ID3 帧的多个以 null 分隔的值,如 ID3 v2.4 所允许的那样。
- 添加
MediaMetadata.mediaType
,用于表示内容类型或元数据描述的文件夹类型。 - 添加
MediaMetadata.isBrowsable
作为MediaMetadata.folderType
的替代。文件夹类型将在下一个版本中弃用。
- Cast 扩展
- 将 Cast SDK 版本更新为 21.2.0。
- IMA 扩展
- 删除
ImaServerSideAdInsertionMediaSource
在应用程序线程上的播放器监听器,以避免线程问题。 - 向
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder
添加属性focusSkipButtonWhenAvailable
,用于请求在电视设备上聚焦跳过按钮,并将其默认设置为 true。 - 向
ImaServerSideAdInsertionMediaSource.AdsLoader
添加方法focusSkipButton()
,用于以编程方式请求聚焦跳过按钮。 - 将 IMA SDK 版本更新为 3.29.0。
- 删除
- 演示应用
- 在运行时请求下载通知的通知权限 (#10884).
版本 1.0.0-beta03
2022 年 11 月 22 日
androidx.media3:media3-*:1.0.0-beta03
发布。 版本 1.0.0-beta03 包含这些提交。
此版本对应于 ExoPlayer 2.18.2 版本。
- 核心库
- 添加
ExoPlayer.isTunnelingEnabled
以检查当前选定轨道是否启用了隧道 (#2518). - 添加
WrappingMediaSource
以简化对单个MediaSource
的包装 (#7279). - 在播放因可用内存不足而卡住之前丢弃后缓冲区。
- 在启用卸载时关闭跟踪“doSomeWork”块。
- 修复
PlaybackStatsListener
中快速搜索的会话跟踪问题 (#180). - 在单项播放列表中调用
seekToNext
或seekToPrevious
时发送缺少的onMediaItemTransition
回调 (#10667). - 添加
Player.getSurfaceSize
,它返回渲染视频的表面的大小。 - 修复在播放器释放期间删除监听器会导致
IllegalStateException
的错误 (#10758).
- 添加
- 构建
- 强制执行最小
compileSdkVersion
,以避免编译错误 (#10684). - 在包含在另一个 gradle 构建中时避免发布块。
- 强制执行最小
- 音轨选择
- 如果显示器不支持 Dolby Vision,则优先使用其他轨道 (#8944).
- 下载
- 视频
- 如果显示器不支持 Dolby Vision,则尝试使用备用解码器 (#9794).
- 音频
- 对释放
AudioTrack
实例使用SingleThreadExecutor
,以避免在同时释放多个播放器时出现 OutOfMemory 错误 (#10057). - 添加
AudioOffloadListener.onExperimentalOffloadedPlayback
用于 AudioTrack 卸载状态。 (#134). - 使
AudioTrackBufferSizeProvider
成为公共接口。 - 添加
ExoPlayer.setPreferredAudioDevice
以设置首选音频输出设备 (#135). - 将
androidx.media3.exoplayer.audio.AudioProcessor
重命名为androidx.media3.common.audio.AudioProcessor
。 - 在所有 Android 版本上,将 8 通道和 12 通道音频分别映射到 7.1 和 7.1.4 通道掩码 (#10701).
- 对释放
- 元数据
MetadataRenderer
现在可以配置为在元数据可用时立即渲染元数据。使用MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
创建实例以指定渲染器是否会尽早输出元数据或与播放器位置同步。
- DRM
- 解决 Android 13 ClearKey 实现中的一个错误,该错误返回一个非空的但无效的许可证 URL。
- 修复在播放列表中切换 DRM 方案(例如,从 Widevine 切换到 ClearKey)时出现的
setMediaDrmSession failed: session not opened
错误。
- 文本
- CEA-608:确保正确处理字段 2 上的服务切换命令 (#10666).
- DASH
- 从清单中解析
EventStream.presentationTimeOffset
(#10460).
- 从清单中解析
- UI
- 在
TrackSelectionDialogBuilder
中使用播放器的当前覆盖作为预设 (#10429).
- 在
- 会话
- 确保即使某些命令需要异步解析,也要始终按正确的顺序执行命令 (#85).
- 添加
DefaultMediaNotificationProvider.Builder
来构建DefaultMediaNotificationProvider
实例。构建器可以配置提供程序使用的通知 ID、通知通道 ID 和通知通道名称。此外,添加方法DefaultMediaNotificationProvider.setSmallIcon(int)
来设置通知的小图标。(#104)。 - 确保在
MediaController.release()
之前发送的命令不会被丢弃。(#99)。 SimpleBitmapLoader
可以从file://
URI 加载位图。(#108)。- 修复阻止
MediaController
在一个周期内跳过广告的断言。(#122)。 - 当播放结束时,
MediaSessionService
将从前台停止,并且会显示一个通知以重新开始播放最后播放的媒体项。(#112)。 - 不要使用暂停的意图启动前台服务。(#167)。
- 在 API 26 和 API 27 上手动隐藏与
DefaultNotificationProvider
创建的通知关联的“徽章”(徽章在 API 28+ 上会自动隐藏)。(#131)。 - 修复一个错误,该错误会导致从传统 MediaSession 到 Media3 MediaController 的第二个绑定连接导致 IllegalStateExceptions。(#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 版本。
- 核心库
- 提取器
- DASH
- 从清单解析 ClearKey 许可证 URL。(#10246)。
- UI
- 确保 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
时轨道重置过于频繁的错误,例如在旁加载字幕并在播放过程中更改选定字幕时。(#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
。这包括“取消弃用”Player.Listener.onTracksChanged
方法名,但具有不同的参数类型。 - 更改
DefaultTrackSelector.buildUponParameters
和DefaultTrackSelector.Parameters.buildUpon
以返回DefaultTrackSelector.Parameters.Builder
而不是已弃用的DefaultTrackSelector.ParametersBuilder
。 - 添加
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
,默认情况下启用。启用后,DefaultTrackSelector
将优先选择音频轨道,其声道数不超过设备输出能力。在手持设备上,DefaultTrackSelector
将优先选择立体声/单声道而不是多声道音频格式,除非多声道格式可以 空间化(Android 12L+)或为杜比环绕声格式。此外,在支持音频空间化的设备上,DefaultTrackSelector
将监控 空间化属性 的更改,并在这些更改后触发新的轨道选择。具有television
UI 模式 的设备将被排除在这些约束之外,并将优先选择声道数最多的格式。若要启用此功能,DefaultTrackSelector
实例必须使用Context
构建。
- 将
- 视频
- 将
DummySurface
重命名为PlaceholderSurface
。 - 将 AV1 支持添加到
MediaCodecVideoRenderer.getCodecMaxInputSize
中。
- 将
- 音频
- 使用 LG AC3 音频解码器广告非标准 MIME 类型。
- 将
AudioAttributes.getAudioAttributesV21()
的返回类型从android.media.AudioAttributes
更改为新的AudioAttributesV21
包装器类,以防止在 API < 21 上进行缓慢的 ART 验证。 - 在格式音频声道数未设置时查询平台(API 29+)或假定音频直通的音频编码声道数,这种情况发生在 HLS 无块准备时。(10204)。
- 如果解码器输出 12 声道 PCM 音频,则使用声道掩码
AudioFormat.CHANNEL_OUT_7POINT1POINT4
配置AudioTrack
。(#10322)。
- DRM
- 确保在格式更改后立即跳转时始终正确更新 DRM 会话。(10274)。
- 文本
- 将
Player.getCurrentCues()
更改为返回CueGroup
而不是List<Cue>
。 - SSA:当
BorderStyle == 3
(即OutlineColour
设置提示的背景)时,支持OutlineColour
样式设置。(#8435)。 - CEA-708:将数据解析为多个服务块,并忽略与当前选定服务号无关的块。
- 删除
RawCcExtractor
,该提取器仅用于处理 Google 内部字幕格式。
- 将
- 提取器
- UI
- 修复在
useController=false
的情况下向PlayerView
上设置的OnClickListener
发送事件的情况。(#9605)。此外,还修复了向所有视图配置的OnLongClickListener
发送事件的情况。 - 修复错误,该错误会错误地将一系列在
ACTION_UP
之前超出PlayerView
边界范围的触摸事件视为单击。(#9861)。 - 修复
PlayerView
的可访问性问题,即点击可能会切换播放而不是隐藏控件。(#8627)。 - 重写
TrackSelectionView
和TrackSelectionDialogBuilder
以使用Player
接口而不是ExoPlayer
。这允许将这些视图与其他Player
实现一起使用,并从 UI 模块中删除对 ExoPlayer 模块的依赖关系。这是一个重大更改。 - 不要在
PlayerView
轨道选择器中显示强制文本轨道,如果选择“无”,则保持合适的强制文本轨道处于选中状态。(#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
的引用。
- Smooth Streaming
- 不允许将
null
传递给SsMediaSource.Factory.setCompositeSequenceableLoaderFactory
。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory
的实例。
- 不允许将
- RTSP
- 数据源
- 将
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+
,以避免导致AndroidStudio的gradle同步失败的CMake错误(#9933)。
- 将CMake版本更新为
- 移除弃用的符号
- 删除
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
。使用Player.Listener.onTracksChanged(Tracks)
代替。 - 删除
Player.getCurrentTrackGroups
和Player.getCurrentTrackSelections
。使用Player.getCurrentTracks
代替。您也可以继续使用ExoPlayer.getCurrentTrackGroups
和ExoPlayer.getCurrentTrackSelections
,尽管这些方法已弃用。 - 删除
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
和DEFAULT_TRACK_SELECTOR_PARAMETERS
常量。尽可能使用getDefaultTrackSelectorParameters(Context)
代替,否则使用DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
。 - 删除构造函数
DefaultTrackSelector(ExoTrackSelection.Factory)
。使用DefaultTrackSelector(Context, ExoTrackSelection.Factory)
代替。 - 删除
Transformer.Builder.setContext
。Context
应该传递给Transformer.Builder
构造函数代替。
- 删除
版本 1.0.0-alpha03
2022年3月14日
androidx.media3:media3-*:1.0.0-alpha03
已发布。 版本 1.0.0-alpha03 包含这些提交。
这对应于ExoPlayer 2.17.1 版本。
- 音频
- 修复在HLS中检查杜比全景声(E-AC3-JOC)音频功能的错误。
- 提取器
- FMP4:修复包含v0和v1 emsg原子的流中,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()
,以便DefaultRenderersFactory
的子类覆盖buildVideoRenderers()
或buildAudioRenderers()
可以访问编解码器适配器工厂并将它传递给它们创建的MediaCodecRenderer
实例。 - 将ICY标头字段
name
和genre
分别传播到MediaMetadata.station
和MediaMetadata.genre
,以便它们通过Player.Listener.onMediaMetadataChanged()
到达应用程序(#9677)。 - 从
DefaultHttpDataSource#getResponseHeaders
中删除空键。 - 在创建
MediaCodec
实例失败时休眠并重试。这解决了一些设备在将曲面从安全编解码器切换到另一个编解码器时出现的问题(#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)。
- UI
- DASH
- HLS
- RTSP
- 转换器
- 将所需的最小 API 版本提升至 21。
TransformationException
现在用于描述在转换过程中发生的错误。- 添加
TransformationRequest
用于指定转换选项。 - 允许注册多个监听器。
- 修复编码器输出部分读取时 Transformer 卡住的问题。
- 修复在释放复用器时抛出异常时
Transformer.getProgress
中潜在的 NPE。 - 添加一个演示应用程序,用于应用转换。
- MediaSession 扩展
- 默认情况下,
MediaSessionConnector
现在会在停止时清除播放列表。想要保留播放列表的应用程序可以在连接器上调用setClearMediaItemsOnStop(false)
。
- 默认情况下,
- Cast 扩展
- FFmpeg 扩展
- 使
build_ffmpeg.sh
依赖于 LLVM 的 bin 工具,而不是 GNU 的 (#9933)。
- 使
- Android 12 兼容性
- 升级 Cast 扩展,使其依赖于
com.google.android.gms:play-services-cast-framework:20.1.0
。较早版本的play-services-cast-framework
与针对 Android 12 的应用程序不兼容,在创建PendingIntent
时会发生崩溃,并出现IllegalArgumentException
(#9528)。
- 升级 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
接口。 - 用于构建媒体播放用户界面的 UI 组件。
- 包装其他库中的功能以供 ExoPlayer 使用的模块,例如通过 IMA SDK 插入广告。
有关更多信息,请参阅 Media3 GitHub 项目。
ExoPlayer 之前托管在单独的 ExoPlayer GitHub 项目 中。在 Media3 中,它的包名为 androidx.media3.exoplayer
。我们计划在一段时间内继续维护和发布 ExoPlayer GitHub 项目,以便应用程序有时间迁移到 Media3。Media3 为所有 ExoPlayer 模块提供了替代方案,除了旧版 media2 和 mediasession 扩展,它们被新的 media3-session
模块替换。这在播放器和媒体会话之间提供了直接集成,而无需使用适配器/连接器类。