Media3
最新更新 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 11 月 13 日 | 1.4.1 | 1.5.0-rc01 | - | - |
声明依赖项
要添加对 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" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$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") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
有关依赖项的更多信息,请参阅添加构建依赖项。
反馈
您的反馈有助于改进 Jetpack。您可以使用Media3 问题跟踪器查找问题的答案、已知问题和功能请求,以及提交新问题。
版本 1.5
1.5.0-rc01 (2024-11-13)
自1.5.0-beta01 版本以来,此版本包含以下更改
- ExoPlayer
- 为
SntpClient
添加一个 setter 方法,用于设置自上次更新后客户端重新初始化的最大经过时间(#1794)。 - 选择视频轨道时考虑语言因素。默认情况下,如果可用,则选择与所选音频轨道语言匹配的“主”视频轨道。可以使用
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
表达显式视频语言偏好。 - 向
DefaultTrackSelector.selectVideoTrack()
方法添加selectedAudioLanguage
参数。 - 向
MediaSourceEventListener.onLoadStarted
及其对应的MediaSourceEventListener.EventDispatcher
方法添加retryCount
参数。 - 修复了在多段 DASH 流中,播放列表项或片段的时长与实际内容不匹配时,可能会导致在项末尾出现帧冻结的错误(#1698)。
- 为
- 转换器
- 更新
VideoFrameProcessor.registerInputStream
和VideoFrameProcessor.Listener.onInputStreamRegistered
的参数,使用Format
。
- 更新
- 提取器
- 数据源
DataSourceContractTest
:断言DataSource.getUri()
返回解析后的 URI(如文档所述)。如果解析后的 URI 与请求的 URI 不同,则测试可以使用新的DataSourceContractTest.TestResource.Builder.setResolvedUri()
方法进行指示。DataSourceContractTest
:断言在open()
调用失败(由于资源“未找到”)之后,并且在后续close()
调用之前,DataSource.getUri()
和getResponseHeaders()
返回其“打开”值。- 重写
DataSourceContractTest.getNotFoundResources()
允许测试子类提供多个“未找到”的资源,以及提供任何预期的标头。这可以区分 HTTP 404(带标头)和“服务器未找到”(无标头)。
- 重写
- 文本
- 修复了 H.264 MPEG-TS 流中 CEA-608 字幕无法输出的问题(这是在
1.5.0-alpha01
中由 https://github.com/androidx/media/commit/03a205f220ecf7681f85f8a752227e3986e257ff 引入的)。 - 支持 Dolby Vision 内容中的 CEA-608 字幕(#1820)。
- 修复了 H.264 MPEG-TS 流中 CEA-608 字幕无法输出的问题(这是在
- RTSP 扩展
- 修复了在解析带有报头扩展的 RTP 数据包时崩溃的问题(#1225)。
版本 1.5.0-beta01
2024 年 10 月 30 日
androidx.media3:media3-*:1.5.0-beta01
已发布。版本 1.5.0-beta01 包含 这些提交。
- 通用库
- 从手动内联的内部类中删除
@DoNotInline
注解,这些内部类旨在避免 运行时类验证失败。最新版本的 R8 现在会自动内联此类调用以避免运行时失败(因此不再需要手动内联)。库的所有 Gradle 用户都必须已经在使用一个使用 R8 版本的 Android Gradle 插件,该版本执行此操作,由于compileSdk = 35
。使用非 Gradle 构建系统的库用户需要确保其 R8 等效的缩减/混淆步骤执行类似的自动内联过程,以避免运行时类验证失败。此更改已在其他 AndroidX 库中完成。
- 从手动内联的内部类中删除
- ExoPlayer
- 修复了当
MediaCodec
在异步模式(API 31+ 上的默认行为)下操作时,MediaCodec.CryptoException
有时会被报告为“意外运行时错误”的问题。 - 使用
PreloadMediaSource.PreloadControl.onContinueLoadingRequested()
传递bufferedDurationUs
而不是bufferedPositionUs
。还将DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
更改为DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
,然后应用程序需要传递一个值,该值表示从默认起始位置开始的特定持续时间,相应的媒体源必须使用此 IntDef 预加载,而不是位置。 - 添加
ForwardingRenderer
实现,该实现将所有方法调用转发到另一个渲染器(1703)。 - 添加播放列表中下一项的预加载。应用程序可以通过相应地调用
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
来启用预加载。默认情况下,预加载已禁用。当启用并且不干扰播放时,DefaultLoadControl
将预加载限制为仅在播放器未加载播放时启动和继续。应用程序可以通过相应地实现LoadControl.shouldContinuePreloading()
来更改此行为(例如,在DefaultLoadControl
中重写此方法时)。LoadControl
的默认实现会在应用程序使用LoadControl
的自定义实现时禁用预加载。 - 添加方法
MediaSourceEventListener.EventDispatcher.dispatchEvent()
以允许调用子类侦听器的事件(1736)。 - 添加
DefaultPreloadManager.Builder
,用于构建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)通过
- 修复了当
- 转换器
- 对于图像导出,使用
MediaItem.Builder.setImageDurationMs
设置图像持续时间是强制性的。 - 添加对音频 EditedMediaItems 序列中间隙的导出支持。
- 对于图像导出,使用
- 轨道选择
DefaultTrackSelector
:在其他因素相等的情况下,优先选择基于对象的音频而不是基于通道的音频。
- 提取器
- 音频
- 修复了在跳转过程中可能出现的爆音问题。
- 修复了 Sonic 的时间拉伸/音调转换算法的截断错误累积问题。
- 修复了
SpeedChangingAudioProcessor
中导致输出帧丢失的错误。
- 视频
- 添加了解决 Galaxy Tab S7 FE 上设备问题的变通方法,该问题会导致 60fps 安全 H264 流被标记为不受支持(#1619)。
- 添加了解决编解码器在最后一个样本后卡住且不返回流结束信号的变通方法。
- 文本
- 确保在 HLS 中,具有非常大字幕时间戳的 WebVTT(当以微秒表示并乘以
90,000
MPEG 时间基时,会溢出 64 位long
)能够显示(#1763)。
- 确保在 HLS 中,具有非常大字幕时间戳的 WebVTT(当以微秒表示并乘以
- 元数据
- 将
C.TRACK_TYPE_METADATA
类型分配给包含 icy 或 vnd.dvb.ait 内容的轨道。
- 将
- DRM
- 修复了在打开 DRM 会话失败后,
DefaultDrmSession.requiresSecureDecoder
引发的IllegalStateException
。此问题是在1.5.0-alpha01
中引入的。
- 修复了在打开 DRM 会话失败后,
- 复用器
- IMA 扩展
- 修复了服务器端插入的没有预卷的 DAI 流在播放到最后一个中卷之后会导致
ArrayIndexOutOfBoundsException
的错误(#1741)。
- 修复了服务器端插入的没有预卷的 DAI 流在播放到最后一个中卷之后会导致
- 会话
- 修复了导致从
MediaBrowser
发送的自定义命令分派到MediaSessionCompat.Callback
而不是连接到旧版服务时的MediaBrowserServiceCompat
方法变体的错误。这阻止了MediaBrowser
接收旧版服务发回的实际返回值(#1474)。 - 处理某些制造商的设备在设置媒体按钮意图的广播接收器时抛出的
IllegalArgumentException
(#1730)。 - 添加媒体项的命令按钮。这为 Media3 API 添加了旧版库中称为
Custom browse actions
的内容,并使用MediaBrowserCompat
。请注意,使用 Media3 命令按钮,媒体项可用于MediaBrowser
和MediaController
。请参阅 AAOS 的自定义浏览操作。 - 修复了 Media3 控制器有时无法在请求
play()
后让会话应用程序启动前台服务的错误。 - 将
CommandButton.Builder.setIconUri
限制为仅接受内容 Uri。 - 在连接到旧版
MediaBrowserCompat
时,将 Media3 浏览器的连接提示传递给初始MediaBrowserCompat
。服务可以在第一次调用onGetRoot()
时接收作为根提示传递的连接提示。 - 修复了连接到旧版浏览器服务的
MediaBrowser
在浏览器订阅parentid
后未收到服务发送的错误的错误。 - 改进互操作性行为,以便连接到旧版
MediaBrowserService
的 Media3 浏览器在订阅父项时不会两次请求parentId
的子项。
- 修复了导致从
- UI
- 使
PlayerView
-in-Compose-AndroidView
变通方法中的拉伸/裁剪视频成为可选,因为 XML 基于共享转换存在问题。在AndroidView
内部使用PlayerView
的应用程序需要调用PlayerView.setEnableComposeSurfaceSyncWorkaround
以选择加入(#1237,#1594)。 - 将
setFullscreenButtonState
添加到PlayerView
,以便能够按需更新全屏按钮的图标,即超出频带且不响应点击交互(#1590,#184)。 - 修复了如果存在应用定义的文本轨道选择偏好设置,则文本选择中的“无”选项无法正常工作的错误。
- 使
- 平滑流扩展
- 修复了在播放带有文本轨道的SmoothStreaming流时发生的
Bad magic number for Bundle
错误(#1779)。
- 修复了在播放带有文本轨道的SmoothStreaming流时发生的
- RTSP 扩展
- 修复了包含编码@字符的URL的用户数据删除问题(#1138)。
- 解码器扩展(FFmpeg、VP9、AV1等)
- 在Android 15上为解码器扩展添加16 KB页面支持(#1685)。
- 投射扩展
- 停止在CastSession断开连接后清理时间线,这使得发送方应用能够在断开连接后本地恢复播放。
- 在提供
Context
时填充CastPlayer的DeviceInfo
。这使得能够将MediaSession
链接到RoutingSession
,这对于集成输出切换器是必要的(#1056)。
- 移除已弃用的符号
- 移除已弃用的
DefaultEncoderFactory
构造函数。请改用DefaultEncoderFactory.Builder
。
- 移除已弃用的
版本1.5.0-alpha01
2024年9月10日
此版本包含自1.4.1版本以来的以下更改
- 通用库
- 添加
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特定功能 - 将
Player.listen
挂起扩展函数添加到media3-common-ktx
库中,以旋转协程以监听Player.Events
。
- 添加
- 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()
,以指示各个渲染器何时允许播放准备就绪。
- 转换器
- 添加
SurfaceAssetLoader
,它支持通过Surface
将视频数据排队到Transformer。 ImageAssetLoader
通过AssetLoader.onError
报告不支持的输入,而不是抛出IllegalStateException
。
- 添加
- 提取器
- 允许
Mp4Extractor
和FragmentedMp4Extractor
识别后续样本未引用的H264样本。 - 添加在
AmrExtractor
中启用基于索引的查找选项。 - 将有效帧之间超过128kB的MP3文件视为截断(而不是无效)。这意味着末尾带有非MP3数据的文件,且没有其他元数据指示MP3字节的长度,现在会在MP3数据的末尾停止播放,而不是以
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
错误失败(#1563)。
- 允许
- 数据源
- 更新
HttpEngineDataSource
,以允许从版本S扩展7开始使用,而不是API级别34(#1262)。
- 更新
- 音频
- 如果媒体中存在CTA-2075响度元数据,则自动在编解码器上配置它。
- 确保在查找时平滑地降低音量。
- 视频
MediaCodecVideoRenderer
避免解码既未渲染也未被其他样本用作引用的样本。- 在API 35及更高版本上,
MediaCodecAdapter
现在可以在configure
中接收null
Surface
,并调用一个新的方法detachOutputSurface
以移除之前设置的Surface
(如果编解码器支持此功能)(MediaCodecInfo.detachedSurfaceSupported
)。 - 在处理
onOutputFormatChanged
时,如果提供了MediaCodecAdapter
提供的像素纵横比值,则使用它们(#1371)。
- 文本
- 添加自定义
VoiceSpan
并为WebVTT语音跨度填充它(#1632)。
- 添加自定义
- 图像
- 添加
ExternallyLoadedImageDecoder
,以便与Glide或Coil等外部图像加载库轻松集成。
- 添加
- 数据源
- 添加
FileDescriptorDataSource
,这是一种新的DataSource
,可用于从FileDescriptor
读取(#3757)。
- 添加
- 效果
- 添加
DefaultVideoFrameProcessor
来解决轻微的SurfaceTexture
缩放问题。SurfaceTexture
可能包含一个小的缩放比例,该缩放比例会裁剪掉裁剪缓冲区边缘周围的1个纹理边框。现在已对此进行处理,以便输出更接近预期。 - 加快
DefaultVideoFrameProcessor.queueInputBitmap()
的速度。因此,使用Transformer
将图像导出到视频的速度更快。
- 添加
- IMA 扩展
- 修复了清除播放列表可能导致
ImaServerSideAdInsertionMediaSource
中出现ArrayIndexOutOfBoundsException
的错误。
- 修复了清除播放列表可能导致
- 会话
- 添加
MediaButtonReceiver.shouldStartForegroundService(Intent)
,以允许应用通过覆盖此方法来抑制传入的用于恢复播放的播放命令。默认情况下,始终启动服务,并且无法抑制播放,而不会导致系统以ForegroundServiceDidNotStartInTimeException
错误崩溃服务(#1528)。
- 添加
- DASH扩展
- 添加对段中间开始的时段的支持(#1440)。
- 解码器扩展(FFmpeg、VP9、AV1等)
- 添加IAMF解码器模块,该模块支持使用libamf原生库合成音频来播放包含IAMF轨道的MP4文件。
- 播放支持立体声布局以及具有空间化的5.1,以及可选的头跟踪功能,但目前不支持双声道播放。
- 添加IAMF解码器模块,该模块支持使用libamf原生库合成音频来播放包含IAMF轨道的MP4文件。
- 投射扩展
- 停止在CastSession断开连接后清理时间线,这使得发送方应用能够在断开连接后本地恢复播放。
- 在提供
Context
时填充CastPlayer的DeviceInfo
。这使得能够将MediaSession
链接到RoutingSession
,这对于集成输出切换器是必要的(#1056)。
- 测试实用程序
DataSourceContractTest
现在包含用于验证的测试- 输入流
read position
已更新。 - 输出缓冲区
offset
已正确应用。
- 输入流
- 移除已弃用的符号
- 移除已弃用的
Player.hasPrevious
、Player.hasPreviousWindow()
。请改用Player.hasPreviousMediaItem()
。 - 移除已弃用的
Player.previous()
方法。请改用Player.seekToPreviousMediaItem()
。 - 移除已弃用的
DrmSessionEventListener.onDrmSessionAcquired
方法。
- 移除已弃用的
版本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
值的父节点正确继承。 - 修复了由于错误地处理请求的输出开始时间大于或等于
Subtitle
中最终事件时间的情况而导致的LegacySubtitleUtil
中的IndexOutOfBoundsException
(#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包含这些提交。
- 通用库
- 将假定的无操作 seek 调用转发到受保护的
BasePlayer.seekTo()
和SimpleBasePlayer.handleSeek()
方法,而不是忽略它们。如果您在自定义播放器中实现这些方法,则可能需要使用mediaItemIndex == C.INDEX_UNSET
处理这些额外的调用。 - 移除对增强型 Java 8 反糖的编译依赖项 (#1312)。
- 确保传递给
MediaItem.Builder.setImageDurationMs()
的时长对于非图像MediaItem
被忽略(如文档所述)。 - 添加
Format.customData
用于存储应用程序提供的关于Format
实例的自定义信息。
- 将假定的无操作 seek 调用转发到受保护的
- ExoPlayer
- 添加
BasePreloadManager
,它根据其rankingData
定义的优先级协调多个源的预加载。可以通过扩展此类进行自定义。添加DefaultPreloadManager
,它使用PreloadMediaSource
将源的媒体样本预加载到内存中,并使用一个整数rankingData
来指示 UI 上项目的索引。 - 在
LoadControl
的大多数方法中添加PlayerId
,以使LoadControl
实现能够支持多个播放器。 - 移除
Buffer.isDecodeOnly()
和C.BUFFER_FLAG_DECODE_ONLY
。无需设置此标志,因为渲染器和解码器将根据时间戳决定是否跳过缓冲区。自定义Renderer
实现应检查缓冲区时间是否至少为BaseRenderer.getLastResetPositionUs()
以决定是否应显示样本。自定义SimpleDecoder
实现可以根据需要检查isAtLeastOutputStartTimeUs()
或使用DecoderOutputBuffer.shouldBeSkipped
标记其他缓冲区以跳过它们。 - 允许
TargetPreloadStatusControl.getTargetPreloadStatus(T)
返回 null 值,以指示不要预加载具有给定rankingData
的MediaSource
。 - 向
BasePreloadManager
添加remove(MediaSource)
。 - 向
BasePreloadManager
添加reset()
,以释放所有持有的源,同时保留预加载管理器实例。 - 添加
ExoPlayer.setPriority()
(以及Builder.setPriority()
)以定义在PriorityTaskManager
中使用的优先级值,以及 API 35 中的 MediaCodec 重要性。 - 修复导致 CMCD 中
bs
(缓冲区饥饿)键不正确的上一次重新缓冲时间更新问题 (#1124)。 - 添加
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
以指示源已加载到末尾。这允许DefaultPreloadManager
和自定义PreloadMediaSource.PreloadControl
实现预加载下一个源或采取其他操作。 - 修复在项目末尾跳过静音可能触发播放异常的错误。
- 向
PreloadMediaSource
添加clear
以丢弃预加载周期。 - 添加新的错误代码
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
,用于在为更高优先级的任务回收编解码器资源时使用。 - 让
AdsMediaSource
在初始内容媒体准备完成之前加载预播广告 (#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)。 ExoPlayer.setVideoEffect()
中的Effects
将接收已移除渲染器偏移量的时间戳 (#1098)。- 修复在提前读取另一个播放列表项目时处理播放器错误时可能发生的潜在
IllegalArgumentException
(#1483)。
- 添加
- 转换器
- 向
ExportResult
添加audioConversionProcess
和videoConversionProcess
,指示输出文件中相应音轨的制作方式。 - 放宽修剪优化 H.264 级别检查。
- 添加对在序列中 SDR 和 HDR 输入媒体之间切换的支持。
- 添加对合成级音频效果的支持。
- 添加对将超 HDR 图像转码为 HDR 视频的支持。
- 修复
DefaultAudioMixer
在重置和重复使用后未输出正确字节数的问题。 - 解决解码器错误,该错误在处理 PCM 输入时将音频通道数限制为立体声。
- 在
ExoPlayerAssetLoader
中选择音轨时,忽略音频通道数约束,因为它们仅适用于播放。 - 将
androidx.media3.transformer.Muxer
接口替换为androidx.media3.muxer.Muxer
并移除androidx.media3.transformer.Muxer
。 - 修复从内容 URI 方案加载 HEIC 图像的问题。(#1373)。
- 调整
AudioGraphInput
中的音频音轨时长以改善 AV 同步。 - 移除
ExportResult.processedInputs
字段。如果您使用此字段获取编解码器详细信息,则改用DefaultDecoderFactory.listener
。如果出现编解码器异常,则编解码器详细信息将在ExportException.codecInfo
中可用。
- 向
- 提取器
- MPEG-TS:通过将流的最后一个访问单元传递到样本队列来向前推进确保渲染最后一帧的更改 (#7909)。整合修复以解决仅 I 帧 HLS 流 (#1150) 和 H.262 HLS 流 (#1126) 中出现的问题。
- MP3:优先使用
Info
帧中的数据大小而不是底层流报告的大小(例如文件大小或 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
均为 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
。
- 数据源
- 实现对
android.resource://package/id
原始资源 URI 的支持,其中package
与当前应用程序的包不同。这之前未记录为可行,但它是比按名称访问另一个包中的资源更有效的方法。 - 在
DataSpec
构造函数中急切地检查url
是否不为 null。此参数已被注释为非 null。 - 允许
ByteArrayDataSource
在open()
期间将 URI 解析为字节数组,而不是在构造时硬编码(#1405)。
- 实现对
- DRM
- 允许在
DefaultDrmSessionManagerProvider
上设置LoadErrorHandlingPolicy
(#1271)。
- 允许在
- 效果
- 在
SpeedChangeEffect
中支持在同一EditedMediaItem
或Composition
中进行多次速度更改。 - 支持从超高清 HDR 位图输入输出 HLG 和 PQ。
- 添加对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,这可以改善 ExoPlayer.setVideoEffect 和 Transformer 的 Debug SurfaceView 中的 HLG 表面输出。
- 更新叠加矩阵实现,使其与文档保持一致,方法是翻转在
setOverlayFrameAnchor()
中应用的 x 和 y 值。如果使用OverlaySettings.Builder.setOverlayFrameAnchor()
,请将它们的 x 和 y 值乘以-1
翻转。 - 修复当
TimestampWrapper
与ExoPlayer#setVideoEffects
一起使用时崩溃的错误(#821)。 - 将默认 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。还提供第三个选项以保留原始色彩空间。
- 允许定义 EditedMediaItemSequences 的不确定 z 顺序(#1055)。
- 在不同的 HDR 内容片段之间保持一致的亮度范围(使用 HLG 范围)。
- 添加对 HDR 内容上超高清 HDR(位图)叠加的支持。
- 允许在 API 26 之前使用
SeparableConvolution
效果。 - 删除未使用的
OverlaySettings.useHdr
,因为叠加和帧的动态范围必须匹配。 - 添加对
TextOverlay
的 HDR 支持。可以使用OverlaySettings.Builder.setHdrLuminanceMultiplier()
调整文本叠加的亮度。
- 在
- IMA 扩展
- 将应用播放 DAI 广告流 所需的 API 提升至稳定版本。
- 添加
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 控制器测试应用的代码,该应用可用于测试与发布媒体会话的应用的交互。
- 将传递给媒体 3 的
MediaSession[Builder].setSessionExtras()
的额外信息传播到媒体 1 控制器的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扩展
- 投射扩展
- 修复了将
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)的视频轨道,而不是帧速率较低或未设置帧速率的轨道。这确保了播放器在从运动照片中提取的 MP4 中选择“真实”视频轨道,这些 MP4 可以包含两个 HEVC 轨道,其中一个具有更高的分辨率,但帧数非常少(#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-tags)(#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
,并使用 nullImageOutput
和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
均为 true(columnLock
支持未实现,因此实际上始终假定为 false)。
- 修复位图提示的序列化,以解决使用
- 图像
- 添加对 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”解析为杜比的 5 个通道数 (#688)。
- 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
- 投射扩展
- 清理
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).
- 当通过
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)
。除了现有的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
。现在TextRenderer
直接处理具有sampleMimeType = application/x-media3-cues
的文本轨道,无需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). - 使用媒体通知控制器作为代理来设置可用的命令和用于填充通知和平台会话的自定义布局。
- 转换由
MediaSessionService.onStartCommand()
在 Media3 中接收的媒体按钮事件,而不是将它们路由到平台会话并返回到 Media3。这样,调用方控制器始终是媒体通知控制器,并且应用可以在所有支持的 API 级别上以相同的方式轻松识别来自通知的调用。 - 修复连接到旧版
MediaSessionCompat
时MediaController.getCurrentPosition()
不前进的错误。 - 添加
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)
并将Composition
传递给Transformer.start(Composition, String)
。 - 移除已弃用的
DownloadNotificationHelper.buildProgressNotification
方法,改用不弃用的方法,该方法采用notMetRequirements
参数。
- 移除
版本 1.2.0-rc01
2023 年 11 月 1 日
使用 1.2.0 稳定版本。
版本 1.2.0-beta01
2023 年 10 月 19 日
使用 1.2.0 稳定版本。
版本 1.2.0-alpha02
2023 年 9 月 29 日
使用 1.2.0 稳定版本。
版本 1.2.0-alpha01
2023 年 8 月 17 日
使用 1.2.0 稳定版本。
版本 1.1.0
版本 1.1.1
2023 年 8 月 16 日
- 通用库
- 从所有模块中删除意外添加的
multidex
依赖项(#499)。
- 从所有模块中删除意外添加的
- ExoPlayer
- 修复
PlaybackStatsListener
中的问题,在播放列表清除后会创建虚假的PlaybackStats
。 - 向通用媒体客户端数据 (CMCD) 日志添加其他字段:流格式 (sf)、流类型 (st)、版本 (v)、顶部比特率 (tb)、对象时长 (d)、测得的吞吐量 (mtp) 和对象类型 (ot)(#8699)。
- 修复
- 音频
- 修复播放非常短的文件时
Player.getState()
从未转换到STATE_ENDED
的错误(#538)。
- 修复播放非常短的文件时
- 音频卸载
- 根据 RFC 7845,将 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)。 - 修复
PlayerWrapper
创建VolumeProviderCompat
的方式,方法是通过传统命令(COMMAND_ADJUST_DEVICE_VOLUME
和COMMAND_SET_DEVICE_VOLUME
)和新命令(COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
和COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
)确定volumeControlType
(#554)。
- 向控制器的状态添加自定义布局,并提供一个 getter 来访问它。当自定义布局更改时,将调用
版本 1.1.0
2023 年 7 月 5 日
- 通用库
- 添加不合适的音频路由的抑制原因,并在抑制时间过长时更改播放就绪更改原因。(#15)。
- 向 Player 添加命令
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- 向 Player 添加重载方法,允许用户指定音量标志
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- 为
DeviceInfo
添加Builder
并弃用现有的构造函数。 - 添加
DeviceInfo.routingControllerId
以指定远程播放的路由控制器 ID。 - 添加
Player.replaceMediaItem(s)
作为在同一位置添加和删除项目的快捷方式(#8046)。
- ExoPlayer
- 仅当明确选择加入时,才允许 ExoPlayer 控制设备音量方法。使用
ExoPlayer.Builder.setDeviceVolumeControlEnabled
访问getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
和setDeviceVolume(int, int)
increaseDeviceVolume(int)
和increaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
和decreaseDeviceVolume(int, int)
- 添加
FilteringMediaSource
,允许从MediaSource
过滤可用的音轨类型。 - 支持在自适应流格式 DASH、HLS 和 SmoothStreaming 的传出请求中包含通用媒体客户端数据 (CMCD)。已合并以下字段:
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
用于将缩放/混合应用于音频通道。 - 在
DecoderDiscardReasons
中添加新的 int 值DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
,以便在音频功能更改后旁路模式可用时丢弃音频解码器。 - 添加对 DTS Express 和 DTS:X 的直接播放支持(#335)。
- 修复当启用隧道且
- 视频
- 使
MediaCodecVideoRenderer
在渲染器禁用时报告宽度和高度为 0 的VideoSize
。当Player.getVideoSize()
更改时,Player.Listener.onVideoSizeChanged
会相应地被调用。通过此更改,当Player.getCurrentTracks
不支持视频或支持的视频轨道的尺寸尚未确定时,MediaCodecVideoRenderer
的 ExoPlayer 视频尺寸的宽度和高度为 0。
- 使
- DRM
- 降低
DefaultDrmSession
上几个仅限内部使用的 methods 的可见性,这些 methods 不应从 DRM 包外部调用void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- 降低
- 复用器
- 添加一个新的复用器库,可用于创建 MP4 容器文件。
- IMA 扩展
- 为 DAI 启用多时段直播 DASH 流。请注意,当前实现尚不支持在直播流中寻求(#10912)。
- 修复了一个错误,该错误会导致在直播流中插入新的广告组,因为连续时间轴中计算出的内容位置略有不同。
- 会话
- 添加辅助方法
MediaSession.getControllerForCurrentRequest
以获取有关当前调用Player
method 的控制器的信息。 - 添加
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)。
- 添加辅助方法
- UI
- 添加 Util methods
shouldShowPlayButton
和handlePlayPauseButtonAction
以使用播放/暂停按钮编写自定义 UI 元素。
- 添加 Util methods
- RTSP 扩展
- DASH扩展
- 从多时段 DASH 流的
MediaLoadData.startTimeMs
和MediaLoadData.endTimeMs
中移除媒体时间偏移量。 - 修复了一个错误,该错误会导致重新准备多时段直播 Dash 媒体源产生
IndexOutOfBoundsException
(#10838)。
- 从多时段 DASH 流的
- HLS 扩展
- 添加
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
以设置加载线程等待TimestampAdjuster
初始化的超时时间。如果初始化在超时前未完成,则会抛出PlaybackException
以避免播放无限期地停滞。超时时间默认设置为零(#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
参数的选项。 - 移除已弃用的 methods
createVideoSampleFormat
、createAudioSampleFormat
、createContainerFormat
和createSampleFormat
,这些 methods 用于实例化Format
类。改用Format.Builder
创建Format
的实例。 - 移除已弃用的 methods
copyWithMaxInputSize
、copyWithSubsampleOffsetUs
、copyWithLabel
、copyWithManifestFormatInfo
、copyWithGaplessInfo
、copyWithFrameRate
、copyWithDrmInitData
、copyWithMetadata
、copyWithBitrate
和copyWithVideoSize
,改用Format.buildUpon()
和 setter methods。 - 移除已弃用的
ExoPlayer.retry()
,改用prepare()
。 - 移除已弃用的无参
DefaultTrackSelector
构造函数,改用DefaultTrackSelector(Context)
。 - 移除已弃用的
OfflineLicenseHelper
构造函数,改用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
。 - 移除已弃用的
DownloadManager
构造函数,改用接受Executor
的构造函数。 - 移除已弃用的
Cue
构造函数,改用Cue.Builder
。 - 移除已弃用的
OfflineLicenseHelper
构造函数,改用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
。 - 移除四个已弃用的
AnalyticsListener
methodsonDecoderEnabled
,改用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 文件以字节顺序标记开头,则添加对 UTF-16 文件的支持(#319)。
- 会话
- 修复当连接到更新其操作的旧版
MediaSessionCompat
时,MediaController
不会更新其可用命令的问题。 - 修复阻止
MediaLibraryService
在 API 30 上从系统 UI 到Callback.onGetLibraryRoot
的调用返回 null 的错误,前提是params.isRecent == true
(#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
不会更新可用命令的错误。 - 修复如果
TrackSelectionOverride
实例从MediaController
发送并且引用具有Format.metadata
的组,则会被忽略的问题(#296)。 - 修复需要通过旧版
MediaSessionCompat
访问元数据时,Player.COMMAND_GET_CURRENT_MEDIA_ITEM
必须可用。 - 修复在后台线程上的
MediaSession
实例在MediaSessionService
中使用时导致崩溃的问题(#318)。 - 修复库在应用程序未打算的情况下声明媒体按钮接收器的问题(#314)。
- 修复旧版
- 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)。
- 会话
- 修复通知播放/暂停按钮未随播放器状态更新的错误(#192)。
- IMA 扩展
- 修复阻止没有广告的 DAI 流开始的错误,因为第一个(并且在没有广告的情况下是唯一的)
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)。
- 调整渲染器的解码器排序逻辑以维持
- 提取器
- 如果在解析 trak 原子时样本表 (stbl) 缺少必需的样本描述 (stsd),则抛出
ParserException
而不是NullPointerException
。 - 在 fMP4 中直接跳转到同步帧时正确跳过样本(#10941)。
- 如果在解析 trak 原子时样本表 (stbl) 缺少必需的样本描述 (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
回调侦听器,以提供在将MediaItem
列表、起始索引和位置设置到 Player 之前通过会话修改/设置它们的方法(#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)。
- 音频
- 使用
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 实现中的一个错误,该错误返回了一个非空但无效的许可证 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 扩展
- 添加新要求的标志,以便使用 NDK 23.1.7779620 及更高版本链接 FFmpeg 库(#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
会导致Player.Listener#onTimelineChanged
被调用,其中reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
(#9889)。 - 对于渐进式媒体,仅在缓冲位置包含选定的轨道(#10361)。
- 允许所有 ExoPlayer 日志输出使用自定义日志记录器(#9752)。
- 修复了
DefaultMediaSourceFactory
中setDataSourceFactory
的实现,在某些情况下该实现无法正常工作(#116)。
- 确保使用
- 提取器
- 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 模式 的设备将排除在这些限制之外,并将优先选择声道数最高的格式。要启用此功能,必须使用Context
构造DefaultTrackSelector
实例。
- 将
- 视频
- 将
DummySurface
重命名为PlaceholderSurface
。 - 为
MediaCodecVideoRenderer.getCodecMaxInputSize
添加 AV1 支持。
- 将
- 音频
- 使用 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
的引用。
- 平滑流
- 不允许将
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+
以避免导致 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 中对 Dolby Atmos (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)。
- 视频
- 修复 Dolby Vision 的解码器回退逻辑,使其在需要时使用兼容的 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
模块替换。这提供了播放器和媒体会话之间的直接集成,无需使用适配器/连接器类。