Media3
最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 12 月 20 日 | 1.5.1 | - | - | 1.6.0-alpha01 |
声明依赖项
如需添加 Media3 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle
文件中添加所需工件的依赖项:
Groovy
dependencies { def media3_version = "1.5.0" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.5.0" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。您可以使用 Media3 问题跟踪器来查找问题的答案、已知问题和功能请求,以及提交新问题。
版本 1.6.0
版本 1.6.0-alpha01
2024 年 12 月 20 日
发布了 androidx.media3:media3-*:1.6.0-alpha01
。版本 1.6.0-alpha01 包含这些提交内容。
- 通用库:
- 移除了
Format.toBundle(boolean excludeMetadata)
方法,改用Format.toBundle()
。 - 添加了
AudioManagerCompat
和AudioFocusRequestCompat
以替换androidx.media
中的等效类。
- 移除了
- ExoPlayer:
- 选择视频轨道时,请考虑语言。默认情况下,选择与所选音轨(如果有)的语言匹配的“主要”视频轨。您可以使用
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
表达明确的视频语言偏好设置。 - 向
DefaultTrackSelector.selectVideoTrack()
方法添加了selectedAudioLanguage
参数。 - 向
MediaSourceEventListener.onLoadStarted
和相应的MediaSourceEventListener.EventDispatcher
方法添加了retryCount
参数。 - 修复了以下 bug:播放列表项或多时段 DASH 串流中的时段时长与实际内容不符,可能会导致在项结束时帧冻结 (#1698)。
- 将
DefaultLoadControl
中bufferForPlaybackMs
和bufferForPlaybackAfterRebufferMs
的默认值分别缩减为 1000 毫秒和 2000 毫秒。 - 添加
MediaExtractorCompat
,这是一个新类,可提供与平台MediaExtractor
等效的功能。 - 将
BasePreloadManager.Listener
移至顶级PreloadManagerListener
。 - 可以实现
RenderersFactory.createSecondaryRenderer
,以提供辅助渲染程序进行预热。预热可加快播放期间的媒体内容切换速度。 - 支持针对自适应流式传输格式 DASH、HLS 和 SmoothStreaming 发送清单请求的
CmcdData
(#1951)。 - 提供将在
MediaCodecRenderer.onReadyToInitializeCodec
中初始化的编解码器的MediaCodecInfo
(#1963)。 - 更改
AdsMediaSource
,以允许通过附加广告组来扩展AdPlaybackStates
。检测到无效的修改并抛出异常。
- 选择视频轨道时,请考虑语言。默认情况下,选择与所选音轨(如果有)的语言匹配的“主要”视频轨。您可以使用
- 转换器:
- 更新
VideoFrameProcessor.registerInputStream
和VideoFrameProcessor.Listener.onInputStreamRegistered
的参数以使用Format
。 - 添加了对转换为其他向后兼容格式的支持。
- 使用
DefaultEncoderFactory
时生成 HDR 静态元数据。
- 更新
- 提取器:
- AVI:修复了对包含恒定比特率压缩音频的文件的处理方式,其中流标头存储的是字节数,而不是分块数。
- 音频:
- 修复了在恢复播放时调用
onAudioPositionAdvancing
的问题(之前是在暂停播放时调用)。
- 修复了在恢复播放时调用
- 视频:
- 修复了
MediaCodecVideoRenderer
,以便在没有Surface
时,仅当VideoFrameReleaseControl.getFrameReleaseAction
不为FRAME_RELEASE_TRY_AGAIN_LATER
时,渲染程序才会跳过刚刚提前显示的帧。
- 修复了
- 文本:
- 停止提前加载使用
MediaItem.Builder.setSubtitleConfigurations
配置的所有字幕文件,而是仅在通过轨道选择选择字幕文件时加载该字幕文件 (#1721)。
- 停止提前加载使用
- 影响:
- 将
OverlaySettings
的功能移至StaticOverlaySettings
。可以为OverlaySettings
创建子类,以允许动态叠加层设置。
- 将
- 多路复用器:
- 将
MuxerException
从Muxer
接口中移出,以避免完全限定名称过长。
- 将
- 会话:
- 将“Context”添加为“MediaButtonReceiver.shouldStartForegroundService”的参数 (#1887)。
- 界面:
- 将
PlayerSurface
可组合项添加到media3-ui-compose
模块。 - 向
media3-ui-compose
模块添加了PlayPauseButtonState
、NextButtonState
、PreviousButtonState
、RepeatButtonState
、ShuffleButtonState
类以及对应的rememberPlayPauseButtonState
、rememberNextButtonState
、rememberPreviousButtonState
、rememberRepeatButtonState
、rememberShuffleButtonState
可组合项。
- 将
- HLS 扩展程序:
- 添加了
HlsInterstitialsAdsLoader
的第一个版本。广告加载器会读取 HLS 媒体播放列表的 HLS 插页式广告,并将其映射到传递给AdsMediaSource
的AdPlaybackState
。此初始版本仅支持具有X-ASSET-URI
属性的 HLS VOD 串流。 - 添加了
HlsInterstitialsAdsLoader.AdsMediaSourceFactory
。应用可以使用它以便以方便且安全的方式创建使用HlsInterstitialsAdsLoader
的AdsMediaSource
实例。
- 添加了
- DASH 扩展程序:
- 为 DASH 添加了对 AC-4 级别 4 格式的支持 (#1898)。
- 解码器扩展(FFmpeg、VP9、AV1 等):
- 添加了 MPEG-H 解码器模块,该模块使用原生 MPEG-H 解码器模块解码 MPEG-H 音频 (#1826)。
- 演示版应用:
- 使用
PlayPauseButtonState
、NextButtonState
、PreviousButtonState
、RepeatButtonState
、ShuffleButtonState
将MinimalControls
(PlayPauseButton
、NextButton
、PreviousButton
)和ExtraControls
(RepeatButton
、ShuffleButton
)可组合界面元素添加到demo-compose
。
- 使用
- 移除了已废弃的符号:
- 移除了已废弃的
AudioMixer.create()
方法。改用DefaultAudioMixer.Factory().create()
。 - 移除了以下已废弃的
Transformer.Builder
方法:setTransformationRequest()
,改用setAudioMimeType()
、setVideoMimeType()
和setHdrMode()
。setAudioProcessors()
,在EditedMediaItem.Builder.setEffects()
中设置音频处理器,并改为将其传递给Transformer.start()
。setVideoEffects()
,在EditedMediaItem.Builder.setEffects()
中设置视频效果,并改为将其传递给Transformer.start()
。setRemoveAudio()
,改用EditedMediaItem.Builder.setRemoveAudio()
从传递给Transformer.start()
的EditedMediaItem
中移除音频。setRemoveVideo()
,请改用EditedMediaItem.Builder.setRemoveVideo()
从传递给Transformer.start()
的EditedMediaItem
中移除视频。setFlattenForSlowMotion()
,请改用EditedMediaItem.Builder.setFlattenForSlowMotion()
来扁平化传递给Transformer.start()
的EditedMediaItem
。setListener()
,请改用addListener()
、removeListener()
或removeAllListeners()
。
- 移除了以下已废弃的
Transformer.Listener
方法:- 废弃了
onTransformationCompleted(MediaItem)
,改用onCompleted(Composition, ExportResult)
。 - 废弃了
onTransformationCompleted(MediaItem, TransformationResult)
,改用onCompleted(Composition, ExportResult)
。 - 废弃了
onTransformationError(MediaItem, Exception)
,改用onError(Composition, ExportResult, ExportException)
。 - 废弃了
onTransformationError(MediaItem, TransformationException)
,改用onError(Composition, ExportResult, ExportException)
。 - 废弃了
onTransformationError(MediaItem, TransformationResult, TransformationException)
,改用onError(Composition, ExportResult, ExportException)
。 - 废弃了
onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)
,改用onFallbackApplied(Composition, TransformationRequest, TransformationRequest)
。
- 废弃了
- 移除了已废弃的
TransformationResult
类。请改用ExportResult
。 - 移除了已废弃的
TransformationException
类。请改用ExportException
。 - 移除了已废弃的
Transformer.PROGRESS_STATE_NO_TRANSFORMATION
。改用Transformer.PROGRESS_STATE_NOT_STARTED
。 - 移除了已废弃的
Transformer.setListener()
。请改用Transformer.addListener()
、Transformer.removeListener()
或Transformer.removeAllListeners()
。 - 移除了已废弃的
Transformer.startTransformation()
。改用Transformer.start(MediaItem, String)
。 - 移除了已废弃的
SingleFrameGlShaderProgram
。改用BaseGlShaderProgram
。 - 移除了
Transformer.flattenForSlowMotion
。改用EditedMediaItem.flattenForSlowMotion
。
- 移除了已废弃的
版本 1.5
版本 1.5.1
2024 年 12 月 19 日
发布了 androidx.media3:media3-*:1.5.1
。版本 1.5.1 包含这些提交内容。
- ExoPlayer:
- 在 MediaCodec 中停用了异步解密功能,以避免出现此平台 API 中报告的编解码器超时问题 (#1641)。
- 提取器:
- MP3:当
VBRI
帧的目录不涵盖文件中的所有 MP3 数据时,不要提前停止播放 (#1904)。
- MP3:当
- 视频:
- 在处理
onOutputFormatChanged
时,回滚使用MediaCodecAdapter
提供的像素宽高比值的操作 (#1371)。
- 在处理
- 文本:
- 修复了
ReplacingCuesResolver.discardCuesBeforeTimeUs
中在timeUs
时刻处于活动状态(已启动,但尚未结束)的 cue 被错误丢弃的 bug (#1939)。
- 修复了
- 元数据:
- 将 Vorbis 注释中的碟片/曲目编号和类型提取到
MediaMetadata
(#1958)。
- 将 Vorbis 注释中的碟片/曲目编号和类型提取到
版本 1.5.0
2024 年 11 月 27 日
发布了 androidx.media3:media3-*:1.5.0
。版本 1.5.0 包含这些提交内容。
- 通用库:
- 添加了
ForwardingSimpleBasePlayer
,可让您通过进行微小调整来转发到其他播放器,同时确保完全一致性和监听器处理 (#1183)。 - 将
SimpleBasePlayer.State.playlist
替换为getPlaylist()
方法。 - 为
SimpleBasePlayer.State.Builder.setPlaylist()
添加了替换项,以便直接指定Timeline
和当前Tracks
和Metadata
,而不是构建播放列表结构。 - 将
minSdk
提高到 21 (Android Lollipop)。这与所有其他 AndroidX 库保持一致。 - 添加了
androidx.media3:media3-common-ktx
工件,该工件基于 Common 库提供特定于 Kotlin 的功能 - 向
media3-common-ktx
库添加Player.listen
挂起扩展函数,以旋转协程来监听Player.Events
。 - 从手动移出代码行的内部类中移除了
@DoNotInline
注解,以避免运行时类验证失败。最新版本的 R8 现在会自动对此类调用进行离线处理,以避免运行时失败(因此,不再需要手动离线处理)。由于compileSdk = 35
,该库的所有 Gradle 用户都必须使用使用执行此操作的 R8 版本的 Android Gradle 插件版本。使用非 Gradle 构建系统的库的用户需要确保其等效于 R8 的缩减/混淆步骤执行类似的自动脱离线程处理,以避免运行时类验证失败。其他 AndroidX 库中已完成此更改。
- 添加了
- ExoPlayer:
- 现在,可以针对每个媒体内容调用
MediaCodecRenderer.onProcessedStreamChange()
。以前,系统不会针对第一个调用此方法。请使用MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
启用此功能。 - 添加了
PreloadMediaSource.PreloadControl.onPreloadError
,以允许PreloadMediaSource.PreloadControl
实现在发生错误时执行操作。 - 添加
BasePreloadManager.Listener
以将预加载事件传播到应用。 - 允许更改 SNTP 客户端超时设置,并在超时时重试备用地址 (#1540)。
- 移除了
MediaCodecAdapter.Configuration.flags
,因为该字段始终为零。 - 允许用户在 Wear OS API 35 及更高版本(设备声明支持此功能)中选择内置扬声器进行播放。
- 推迟对
Context.getSystemService(Context.AUDIO_SERVICE)
的阻塞调用,直到启用音频焦点处理。这样可确保在未启用音频焦点处理的情况下不会执行阻塞调用 (#1616)。 - 允许在加载失败时播放,无论缓冲时长如何 (#1571)。
- 添加了
AnalyticsListener.onRendererReadyChanged()
,以便在各个渲染程序允许播放时发出信号。 - 修复了以下问题:当
MediaCodec
在异步模式下运行时(API 31 及更高版本上的默认行为),MediaCodec.CryptoException
有时会被报告为“意外运行时错误”。 - 使用
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[])
并将方法标记为最终方法,以防止替换。 应改用新的DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
。 - 在
MergingMediaSource
中报告来自次要来源的MediaSourceEventListener
事件。这会导致系统为旁加载的字幕(使用MediaItem.LocalConfiguration.subtitleConfigurations
添加的字幕)报告加载开始/错误/取消/完成事件,这些事件可能会显示为从AnalyticsListener
发出的重复加载事件。 - 防止字幕和元数据错误导致播放完全停止。
而是会停用有问题的轨道,并继续播放其余轨道 (#1722)。
- 在新的字幕处理(提取期间)中,系统会通过
onLoadError
回调发出关联的解析(例如无效的字幕数据)和加载错误(例如 HTTP 404)。 - 在旧版字幕处理(呈现期间)中,系统仅会通过
onLoadError
回调发出关联的加载错误,而会静默忽略解析错误(这是之前的行为)。
- 在新的字幕处理(提取期间)中,系统会通过
- 修复了以下 bug:播放列表项或多时段 DASH 串流中的时段时长与实际内容不符,可能会导致在项结束时帧冻结 (#1698)。
- 向
SntpClient
添加了一个 setter,用于设置自上次更新以来经过的最大时间(客户端会在此之后重新初始化)(#1794)。
- 现在,可以针对每个媒体内容调用
- 转换器:
- 添加了
SurfaceAssetLoader
,它支持通过Surface
将视频数据加入 Transformer 队列。 ImageAssetLoader
通过AssetLoader.onError
报告不受支持的输入,而不是抛出IllegalStateException
。- 将使用
MediaItem.Builder.setImageDurationMs
设置图片时长设为导出图片的强制性操作。 - 添加了对音频 EditedMediaItem 序列中间隔的导出支持。
- 添加了
- 轨道选择:
DefaultTrackSelector
:在其他因素不变的情况下,优先使用基于对象的音频,而不是基于声道的音频。
- 提取器:
- 允许
Mp4Extractor
和FragmentedMp4Extractor
识别后续示例未用作参考的 H264 示例。 - 添加了在
AmrExtractor
中启用基于索引的跳转的选项。 - 将有效帧之间的 MP3 文件大小超过 128KB 的文件视为截断(而非无效)。这意味着,如果文件末尾包含非 MP3 数据,且没有其他元数据来指示 MP3 字节的长度,则现在会在 MP3 数据结束时停止播放,而不是因
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
而失败 (#1563)。 - 修复了在处理 MP4 文件中的编辑列表时,针对非关键帧媒体开始位置的预滚动示例处理问题 (#1659)。
- 通过使用
Mp4Extractor
和FragmentedMp4Extractor
中的mdhd
框中的媒体时长,改进了帧速率计算 (#1531)。 - 修复了 MP4 编辑列表中
media_time
的缩放不正确的问题。虽然segment_duration
已使用电影时间尺度正确缩放,但media_time
现在使用轨道时间尺度正确缩放,如 MP4 格式标准所指定 (#1792)。 - 处理包含编辑列表的 MP4 的
endIndices
计算中的无序帧 (#1797)。 - 修复了 MP4 文件的
mdhd
盒中媒体时长解析,以处理-1
值 (#1819)。 - 添加了对在 H.263 视频的 MP4 文件中识别
h263
盒的支持 (#1821)。 - 添加了对 AC-4 级别 4 ISO 基本媒体文件格式的支持 (#1265)。
- 允许
- DataSource:
- 更新了
HttpEngineDataSource
,以允许从版本 S 扩展程序 7(而非 API 级别 34)开始使用 (#1262)。 DataSourceContractTest
:断言DataSource.getUri()
会返回已解析的 URI(如文档所述)。如果此值与请求的 URI 不同,测试可以使用新的DataSourceContractTest.TestResource.Builder.setResolvedUri()
方法指明这一点。DataSourceContractTest
:断言在对open()
的调用失败(由于资源“未找到”)后,以及在后续的close()
调用之前,DataSource.getUri()
和getResponseHeaders()
会返回其“open”值。- 替换
DataSourceContractTest.getNotFoundResources()
后,测试子类可以提供多个“未找到”资源,还可以提供任何预期标头。这样可以区分 HTTP 404(包含标头)和“找不到服务器”(不含标头)。
- 替换
- 更新了
- 音频:
- 自动在编解码器上配置 CTA-2075 响度元数据(如果媒体中存在)。
- 确保在跳转时音量平滑下降。
- 修复了在跳转期间可能发生的爆裂声问题。
- 修复了 Sonic 的节奏延长/音调移调算法的截断错误累积问题。
- 修复了
SpeedChangingAudioProcessor
中导致丢失输出帧的 bug。
- 视频:
MediaCodecVideoRenderer
会避免解码未呈现或未被其他采样用作参考的采样。- 在 API 35 及更高版本中,
MediaCodecAdapter
现在可以在configure
中接收null
Surface
,并调用新方法detachOutputSurface
以移除之前设置的Surface
(如果编解码器支持此操作)(MediaCodecInfo.detachedSurfaceSupported
)。 - 在处理
onOutputFormatChanged
时,使用MediaCodecAdapter
提供的像素宽高比值(如果有)(#1371)。 - 添加了针对 Galaxy Tab S7 FE 上导致 60fps 安全 H264 串流被标记为不受支持的设备问题的权宜解决方法 (#1619)。
- 添加了针对在最后一个样本后卡住且未返回数据流结束信号的编解码器的权宜解决方法。
- 文本:
- 添加了自定义
VoiceSpan
,并为 WebVTT 语音片段填充了该VoiceSpan
(#1632)。 - 确保 HLS 中的 WebVTT 包含非常大的字幕时间戳(如果将其表示为微秒并乘以
90,000
MPEG 时间基准,则会溢出 64 位long
)(#1763)。 - 支持杜比视界内容中的 CEA-608 字幕 (#1820)。
- 修复了启用 CEA-608 字幕时在 DASH 多时段串流上播放挂起的问题 (#1863)。
- 添加了自定义
- 元数据:
- 将
C.TRACK_TYPE_METADATA
类型分配给包含 icy 或 vnd.dvb.ait 内容的轨道。
- 将
- 图片:
- 添加了
ExternallyLoadedImageDecoder
,以简化与 Glide 或 Coil 等外部图片加载库的集成。
- 添加了
- DataSource:
- 添加了
FileDescriptorDataSource
,这是一个可用于从FileDescriptor
读取的新DataSource
(#3757)。
- 添加了
- 影响:
- 添加了针对轻微
SurfaceTexture
缩放的DefaultVideoFrameProcessor
权宜解决方法。SurfaceTexture
可能包含一个小缩放,用于剪除剪裁缓冲区边缘周围的 1 个纹理单元边界。现在,系统会处理此问题,以使输出更接近预期。 - 加快
DefaultVideoFrameProcessor.queueInputBitmap()
的速度。因此,使用Transformer
将图片导出为视频的速度更快。
- 添加了针对轻微
- IMA 扩展程序:
- 修复了清除播放列表可能会导致
ImaServerSideAdInsertionMediaSource
中出现ArrayIndexOutOfBoundsException
的 bug。 - 修复了以下 bug:在播放到最后一个中贴片广告后,没有前贴片广告的服务器端插入的 DAI 串流可能会导致
ArrayIndexOutOfBoundsException
(#1741)。
- 修复了清除播放列表可能会导致
- 会话:
- 添加了
MediaButtonReceiver.shouldStartForegroundService(Intent)
,以允许应用通过替换此方法来抑制传入的播放命令,以便继续播放。默认情况下,该服务始终处于启动状态,并且如果不使用ForegroundServiceDidNotStartInTimeException
使系统崩溃服务,则无法抑制播放 (#1528)。 - 修复了以下 bug:当连接到旧版服务时,导致从
MediaBrowser
发送的自定义命令被调度到MediaSessionCompat.Callback
,而不是方法的MediaBrowserServiceCompat
变体。这会导致MediaBrowser
无法接收旧版服务发回的实际返回值 (#1474)。 - 处理为媒体按钮 intent 设置广播接收器时某些制造商的设备抛出的
IllegalArgumentException
(#1730)。 - 为媒体内容添加了命令按钮。这会为旧版库中的
MediaBrowserCompat
添加 Media3 API(以前称为Custom browse actions
)。请注意,Media3 命令按钮适用于MediaBrowser
和MediaController
中的媒体内容。请参阅 AAOS 的自定义浏览操作。 - 修复了以下 bug:Media3 控制器有时无法在请求
play()
后让会话应用启动前台服务。 - 将
CommandButton.Builder.setIconUri
限制为仅接受内容 URI。 - 在连接到旧版
MediaBrowserCompat
时,将 Media3 浏览器的连接提示传递给初始MediaBrowserCompat
。服务可以在首次调用onGetRoot()
时接收作为根提示传入的连接提示。 - 修复了以下 bug:连接到旧版浏览器服务的
MediaBrowser
在浏览器订阅parentid
后未收到该服务发送的错误。 - 改进了互操作性行为,以便连接到旧版
MediaBrowserService
的 Media3 浏览器在订阅父级时不会两次请求parentId
的子项。
- 添加了
- 界面:
- 由于基于 XML 的共享转场存在问题,因此将
PlayerView
-in-Compose-AndroidView
中的拉伸/剪裁视频作为可选解决方法。在AndroidView
中使用PlayerView
的应用需要调用PlayerView.setEnableComposeSurfaceSyncWorkaround
才能选择启用 (#1237、#1594)。 - 向
PlayerView
添加了setFullscreenButtonState
,以允许按需更新全屏按钮的图标,即非在点击互动后响应式更新(#1590、#184)。 - 修复了以下 bug:如果存在应用定义的文字轨道选择偏好设置,则文本选择中的“无”选项不起作用。
- 由于基于 XML 的共享转场存在问题,因此将
- DASH 扩展程序:
- 添加了对从细分中间开始的周期的支持 (#1440)。
- 流畅的流式传输扩展:
- 修复了播放包含字幕轨道的 SmoothStreaming 串流时出现的
Bad magic number for Bundle
错误 (#1779)。
- 修复了播放包含字幕轨道的 SmoothStreaming 串流时出现的
- RTSP 扩展程序:
- 解码器扩展程序(FFmpeg、VP9、AV1 等):
- 添加了 IAMF 解码器模块,该模块支持使用 libiamf 原生库合成音频来播放包含 IAMF 轨道的 MP4 文件。
- 支持立体声布局和 5.1 声道布局,并支持启用空间化和可选的头部跟踪功能,但目前不支持立体声播放。
- 为 Android 15 上的解码器扩展程序添加了 16 KB 页面支持 (#1685)。
- 添加了 IAMF 解码器模块,该模块支持使用 libiamf 原生库合成音频来播放包含 IAMF 轨道的 MP4 文件。
- Cast 扩展程序:
- 在 CastSession 断开连接后停止清理时间轴,以便发送器应用在断开连接后在本地恢复播放。
- 在提供
Context
时填充 CastPlayer 的DeviceInfo
。这样便可将MediaSession
关联到RoutingSession
,这对于集成输出切换器至关重要 (#1056)。
- 测试实用程序:
DataSourceContractTest
现在包含用于验证以下内容的测试:- 输入流
read position
已更新。 - 输出缓冲区
offset
已正确应用。
- 输入流
- 演示版应用
- 解决了短视频演示版应用中的内存泄漏问题 (#1839)。
- 移除了已废弃的符号:
- 移除了已废弃的
Player.hasPrevious
、Player.hasPreviousWindow()
。 请改用Player.hasPreviousMediaItem()
。 - 移除了已废弃的
Player.previous()
方法。改用Player.seekToPreviousMediaItem()
。 - 移除了已废弃的
DrmSessionEventListener.onDrmSessionAcquired
方法。 - 移除了已废弃的
DefaultEncoderFactory
构造函数。改用DefaultEncoderFactory.Builder
。
- 移除了已废弃的
版本 1.5.0-rc02
2024 年 11 月 19 日
使用 1.5.0 稳定版。
版本 1.5.0-rc01
2024 年 11 月 13 日
使用 1.5.0 稳定版。
版本 1.5.0-beta01
2024 年 10 月 30 日
使用 1.5.0 稳定版。
版本 1.5.0-alpha01
2024 年 9 月 10 日
使用 1.5.0 稳定版。
版本 1.4.0
版本 1.4.1
2024 年 8 月 27 日
发布了 androidx.media3:media3-*:1.4.1
。版本 1.4.1 包含这些提交内容。
- ExoPlayer:
- 提取器:
- MP3:通过根据
Info
帧中的长度字段正确忽略尾随非 MP3 数据,修复了Searched too many bytes
错误 (#1480)。
- MP3:通过根据
- 文本:
- TTML:修复了对百分比
tts:fontSize
值的处理,以确保这些值能够从具有百分比tts:fontSize
值的父节点正确继承。 - 修复了
LegacySubtitleUtil
中的IndexOutOfBoundsException
,因为系统之前错误地处理了请求的输出开始时间大于或等于Subtitle
中的最终事件时间的情况 (#1516)。
- TTML:修复了对百分比
- DRM:
- 修复了在播放 L1 Widevine 内容的 API 31 及更高版本的设备上出现的
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
错误。此错误是由框架MediaDrm.requiresSecureDecoder
方法的实现不完整所致 (#1603)。
- 修复了在播放 L1 Widevine 内容的 API 31 及更高版本的设备上出现的
- 影响:
- 向
GlObjectsProvider
添加了release()
方法。
- 向
- 会话:
- RTSP 扩展程序:
- 在 SDP 解析中跳过无效的媒体描述 (#1087)。
版本 1.4.0
2024 年 7 月 25 日
发布了 androidx.media3:media3-*:1.4.0
。版本 1.4.0 包含这些提交内容。
- 通用库:
- 将假定为无操作的跳转调用转发到受保护的
BasePlayer.seekTo()
和SimpleBasePlayer.handleSeek()
方法,而不是忽略它们。如果您要在自定义播放器中实现这些方法,则可能需要使用mediaItemIndex == C.INDEX_UNSET
处理这些额外的调用。 - 移除了对增强型 Java 8 脱糖的编译依赖项 (#1312)。
- 确保系统会忽略传递给
MediaItem.Builder.setImageDurationMs()
的持续时间(如文档所述),如果MediaItem
不是图片。 - 添加了
Format.customData
,用于存储应用提供的有关Format
实例的自定义信息。
- 将假定为无操作的跳转调用转发到受保护的
- ExoPlayer:
- 添加了
BasePreloadManager
,用于根据rankingData
定义的优先级协调多个来源的预加载。您可以通过扩展此类来进行自定义。添加了DefaultPreloadManager
,该类使用PreloadMediaSource
将来源的媒体选段预加载到内存中,并使用一个整数rankingData
来指示界面上项的索引。 - 向
LoadControl
的大多数方法添加了PlayerId
,以便LoadControl
实现支持多位玩家。 - 移除了
Buffer.isDecodeOnly()
和C.BUFFER_FLAG_DECODE_ONLY
。无需设置此标志,因为渲染程序和解码器会根据时间戳决定是否跳过缓冲区。自定义Renderer
实现应检查缓冲时间是否至少为BaseRenderer.getLastResetPositionUs()
,以决定是否应显示选段。自定义SimpleDecoder
实现可以根据需要检查isAtLeastOutputStartTimeUs()
,或使用DecoderOutputBuffer.shouldBeSkipped
标记其他缓冲区以跳过它们。 - 允许
TargetPreloadStatusControl.getTargetPreloadStatus(T)
返回 null 值,以指示不使用给定rankingData
预加载MediaSource
。 - 将
remove(MediaSource)
添加到BasePreloadManager
中。 - 将
reset()
添加到BasePreloadManager
以释放所有预留来源,同时保留预加载管理器实例。 - 添加了
ExoPlayer.setPriority()
(和Builder.setPriority()
),用于定义PriorityTaskManager
中使用的优先级值,以及从 API 35 开始用于 MediaCodec 重要性的优先级值。 - 修复了更新上次重新缓冲时间时出现的问题,该问题导致 CMCD 中的
bs
(缓冲区饥饿)键不正确 (#1124)。 - 添加
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
以指示源已加载到结束。这样,DefaultPreloadManager
和自定义PreloadMediaSource.PreloadControl
实现便可预加载下一个来源或执行其他操作。 - 修复了以下 bug:在内容末尾跳过静音时可能会触发播放异常。
- 将
clear
添加到PreloadMediaSource
以舍弃预加载期。 - 添加了新的错误代码
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
,用于在为更高优先级任务回收编解码器资源时使用。 - 让
AdsMediaSource
在初始内容媒体准备完成之前加载前贴片广告 (#1358)。 - 修复了以下 bug:在原始时段已从清单中移除后,重新准备多时段 DASH 直播时,播放会移至
STATE_ENDED
。 - 在
PreloadMediaSource.PreloadControl
中将onTimelineRefreshed()
重命名为onSourcePrepared()
,将onPrepared()
重命名为onTracksSelected()
。此外,请相应地重命名DefaultPreloadManager.Stage
中的 IntDef。 - 添加了对动态调度的实验性支持,以便更好地将工作与 CPU 唤醒周期保持一致,并延迟唤醒到渲染程序可以进行进展时。在设置 ExoPlayer 实例时,您可以使用
experimentalSetDynamicSchedulingEnabled()
启用此功能。 - 添加了
Renderer.getDurationToProgressUs()
。Renderer
可以实现此方法,以返回播放必须提前多少时间才能让渲染程序继续运行。如果使用experimentalSetDynamicSchedulingEnabled()
设置ExoPlayer
,则ExoPlayer
会在计算安排其工作任务的时间时调用此方法。 - 添加了
MediaCodecAdapter#OnBufferAvailableListener
,以便在输入和输出缓冲区可供MediaCodecRenderer
使用时发出提醒。MediaCodecRenderer
在收到这些回调时会向ExoPlayer
发送信号,如果ExoPlayer
是使用experimentalSetDynamicSchedulingEnabled()
设置的,则ExoPlayer
会调度其工作循环,因为渲染程序可以取得进展。 - 对
LoadControl
方法使用数据类,而不是单个参数。 - 添加了
ExoPlayer.isReleased()
以检查是否已调用Exoplayer.release()
。 - 添加了
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
,用于配置seekToPrevious()
向前跳转到上一个项的最大位置 (#1425)。 - 修复了一些音频焦点不一致的问题,例如在播放器暂停时未报告完全或暂时性焦点丢失 (#1436)。
- 修复了由于提取器在初始准备步骤后报告其他轨道而导致的潜在
IndexOutOfBoundsException
(#1476)。 ExoPlayer.setVideoEffect()
中的Effects
将接收移除了渲染程序偏移的时间戳 (#1098)。- 修复了在处理在读取其他播放列表项时发生的播放器错误时可能出现的
IllegalArgumentException
(#1483)。
- 添加了
- 转换器:
- 将
audioConversionProcess
和videoConversionProcess
添加到ExportResult
,指明输出文件中的相应轨道的制作方式。 - 放宽剪裁优化 H.264 级别检查。
- 添加了对在 SDR 和 HDR 输入媒体之间按顺序切换的支持。
- 添加了对组合级音效的支持。
- 添加了对将 Ultra HDR 图片转码为 HDR 视频的支持。
- 修复了
DefaultAudioMixer
在重置和重复使用后无法输出正确字节数的问题。 - 解决了以下解码器 bug:在处理 PCM 输入时,音频声道数量上限为立体声。
- 在
ExoPlayerAssetLoader
中选择轨道时,请忽略音频通道数约束条件,因为它们仅适用于播放。 - 将
androidx.media3.transformer.Muxer
接口替换为androidx.media3.muxer.Muxer
,并移除androidx.media3.transformer.Muxer
。 - 修复了从内容 URI 架构加载 HEIC 图片的问题。 (#1373)。
- 调整了
AudioGraphInput
中的音轨时长,以改善音频与视频同步。 - 移除了
ExportResult.processedInputs
字段。如果您要使用此字段来提供编解码器详细信息,请改用DefaultDecoderFactory.listener
。如果发生编解码器异常,ExportException.codecInfo
中将会显示编解码器详细信息。
- 将
- 提取器:
- MPEG-TS:通过将数据流的最后一个访问单元传递给示例队列,滚动更新更改,确保渲染最后一个帧 (#7909)。纳入了修复程序,以解决仅 I 帧 HLS 流(#1150) 和 H.262 HLS 流 (#1126) 中出现的问题。
- MP3:优先使用
Info
帧中的数据大小,而不是底层数据流报告的大小(例如文件大小或 HTTPContent-Length
标头)。这有助于从恒定比特率跳转计算中排除不可播放的预告片数据(例如专辑封面),从而提高跳转的准确性 (#1376)。 - MP3:使用
Info
帧中的帧数和其他数据(如果有)来计算恒定比特率跳转的平均比特率,而不是根据Info
帧后帧的比特率(可能人为地较小,例如PCUT
帧)进行外推 (#1376)。 - 修复了 AVI 容器中的 PCM 音频格式提取问题。
- 音频:
- 修复了适用于透传播放的 DTS:X 配置文件 2 编码属性 (#1299)。
- 对于分流播放,请先在
DefaultAudioSink
中重置流完成的跟踪字段,然后再调用AudioTrack.stop()
,以便AudioTrack.StreamEventCallback#onPresentationEnded
正确识别播放了所有待处理数据的时间。 - 修复了
SilenceSkippingAudioProcessor
中的 bug,其中不同音频格式(例如立体声到单声道)之间的转换可能会导致处理器抛出异常 (#1352)。 - 实现
MediaCodecAudioRenderer.getDurationToProgressUs()
,以便 ExoPlayer 将其主要工作循环动态调度到 MediaCodecAudioRenderer 可以取得进展时。
- 视频:
- 修复了在播放过程中切换 Surface 时
Listener.onRenderedFirstFrame()
提前到达的问题。 - 修复了杜比视界的解码器回退逻辑,以在需要时使用兼容的 AV1 解码器 (#1389)。
- 修复了在播放过程中启用视频渲染程序时可能导致的编解码器异常。
- 修复了在播放过程中切换 Surface 时
- 文本:
- 修复了在跳转到某个位置之前开始的字幕会被跳过的问题。 此问题仅在 Media3 1.4.0-alpha01 中引入。
- 更改默认字幕解析行为,使其在提取期间(而非呈现期间)发生(如需了解提取和呈现之间的区别,请参阅 ExoPlayer 的架构图)。
- 您可以通过同时调用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
和TextRenderer.experimentalSetLegacyDecodingEnabled(true)
来覆盖此更改。如需了解如何将这些组件连接到ExoPlayer
实例,请参阅关于自定义的文档。我们会在未来的版本中移除这些方法(以及对旧版字幕解码的所有支持)。 - 具有自定义
SubtitleDecoder
实现的应用需要更新它们,以改为实现SubtitleParser
(并改为使用SubtitleParser.Factory
而非SubtitleDecoderFactory
)。
- 您可以通过同时调用
- PGS:修复了运行长度解码,以将
0
解析为颜色索引,而不是字面颜色值 (#1367)。 - CEA-708:忽略
rowLock
值。CEA-708-E S-2023 规范规定,无论数据流中存在什么值,都应假定rowLock
和columnLock
均为 true(未实现columnLock
支持,因此实际上假定其始终为 false)。- 这项更改最初包含在
1.3.0-alpha01
版本说明中,但在1.3.0-rc01
发布之前意外被还原。此问题现已修复,因此相应更改已恢复。
- 这项更改最初包含在
- CEA-708:避免 ExoPlayer 对“set pen location”命令的简单处理添加重复的新行 (#1315)。
- 修复了当 WebVTT 字幕示例不包含任何提示(例如,作为 DASH 串流的一部分)时,从
LegacySubtitleUtil
发送的IllegalArgumentException
问题 (#1516)。
- 元数据:
- 图片:
- 添加了对非方形 DASH 缩略图网格的支持 (#1300)。
- 为 API 34 及更高版本添加了对 AVIF 的支持。
- 允许将
null
用作ExoPlayer.setImageOutput()
的参数,以清除之前设置的ImageOutput
。
- DataSource:
- 实现对
android.resource://package/id
原始资源 URI 的支持,其中package
不同于当前应用的软件包。之前的文档并未说明这种方法可行,但与按名称访问其他软件包中的资源相比,这种方法更高效。 - 在
DataSpec
构造函数中,提前检查url
是否不为 null。此参数已注解为非 null。 - 允许
ByteArrayDataSource
在open()
期间将 URI 解析为字节数组,而不是在构建时对其进行硬编码 (#1405)。
- 实现对
- DRM:
- 允许在
DefaultDrmSessionManagerProvider
上设置LoadErrorHandlingPolicy
(#1271)。
- 允许在
- 影响:
- 支持在
SpeedChangeEffect
中的同一EditedMediaItem
或Composition
中进行多次速度更改。 - 支持从超高动态范围位图输入中输出 HLG 和 PQ。
- 添加了对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,这有助于改进 ExoPlayer.setVideoEffect 和 Transformer 的 Debug SurfaceView 中的 HLG Surface 输出。
- 更新了叠加层矩阵实现,通过翻转在
setOverlayFrameAnchor()
中应用的 x 和 y 值,使其与文档保持一致。如果使用OverlaySettings.Builder.setOverlayFrameAnchor()
,请将 x 和 y 值乘以-1
来翻转它们。 - 修复了
TimestampWrapper
在与ExoPlayer#setVideoEffects
结合使用时发生崩溃的 bug (#821)。 - 将默认的 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。此外,还提供第三种选项以保留原始颜色空间。
- 允许定义 EditedMediaItemSequence 的未确定 z 顺序 (#1055)。
- 在不同的 HDR 内容中保持一致的亮度范围(使用 HLG 范围)。
- 添加了对 HDR 内容的 Ultra HDR(位图)叠加层的支持。
- 允许在 API 26 之前使用
SeparableConvolution
效果。 - 移除了未使用的
OverlaySettings.useHdr
,因为叠加层和帧的动态范围必须匹配。 - 为
TextOverlay
添加了 HDR 支持。您可以使用OverlaySettings.Builder.setHdrLuminanceMultiplier()
调整文本叠加层的亮度。
- 支持在
- IMA 扩展程序:
- 将应用播放 DAI 广告串流所需的 API 升级为稳定版。
- 向
ImaServerSideAdInsertionMediaSource.AdLoader
添加了replaceAdTagParameters(Map <String, String>)
,以允许在运行时替换广告代码参数。 - 修复了在广告播放期间发生播放器错误时未调用
VideoAdPlayer.VideoAdPlayerCallback.onError()
的 bug (#1334)。 - 将 IMA SDK 版本提升至 3.33.0,以修复使用
data://
广告代码 URI 时出现的NullPointerException
问题 (#700)。
- 会话:
- 将
CommandButton.enabled
的默认值更改为true
,并确保即使关联的命令可用,控制器的值也能保持为 false。 - 为
CommandButton
添加了图标常量,应使用这些常量,而不是自定义图标资源。 - 添加了
MediaSessionService.isPlaybackOngoing()
,以便应用查询是否需要在onTaskRemoved()
中停止服务 (#1219)。 - 添加了
MediaSessionService.pauseAllPlayersAndStopSelf()
,可方便地暂停所有会话的播放,并调用stopSelf()
来终止MediaSessionService
的生命周期。 - 替换
MediaSessionService.onTaskRemoved(Intent)
以提供安全的默认实现,以便在播放仍在进行时让服务在前台运行,否则停止服务。 - 通过不将时长设置到平台会话元数据中,隐藏直播的媒体通知中的快进条 (#1256)。
- 将
MediaMetadata
的转换与MediaDescriptionCompat
保持一致,以便在选择元数据属性时使用与 media1 中相同的首选顺序和逻辑。 - 添加了
MediaSession.sendError()
,以允许向 Media3 控制器发送非严重错误。使用通知控制器(请参阅MediaSession.getMediaNotificationControllerInfo()
)时,自定义错误用于将平台会话的PlaybackState
更新为包含给定错误信息的错误状态 (#543)。 - 添加
MediaSession.Callback.onPlayerInteractionFinished()
,以便在特定控制器的一系列玩家互动完成时通知会话。 - 添加
SessionError
并在SessionResult
和LibraryResult
中使用它(而不是错误代码),以便提供有关错误的更多信息,并尽可能提供有关如何解决错误的信息。 - 发布 media3 控制器测试应用的代码,该代码可用于测试与发布媒体会话的应用的交互。
- 将传递给 media3 的
MediaSession[Builder].setSessionExtras()
的 extra 传播到 media1 控制器的PlaybackStateCompat.getExtras()
。 - 将严重错误和非严重错误映射到平台会话和从平台会话映射。
PlaybackException
会映射到PlaybackStateCompat
的严重错误状态。使用MediaSession.sendError(ControllerInfo, SessionError)
向媒体通知控制器发送的SessionError
会映射到PlaybackStateCompat
中的非严重错误,这意味着错误代码和消息已设置,但平台会话的状态仍与STATE_ERROR
不同。 - 允许为每个控制器设置会话 activity,以替换全局会话 activity。您可以通过使用
AcceptedResultBuilder.setSessionActivivty(PendingIntent)
创建ConnectionResult
,在连接时为控制器定义会话活动。连接后,可以使用MediaSession.setSessionActivity(ControllerInfo, PendingIntent)
更新会话活动。 - 改进了对
MediaLibrarySession.Callback
调用的错误复制。 现在,您可以使用MediaLibrarySession.Builder.setLibraryErrorReplicationMode()
来选择错误类型或停用默认处于开启状态的错误复制功能,从而配置错误复制。
- 将
- 界面:
- 下载内容:
- 确保
DownloadHelper
不会泄露未发布的Renderer
实例,这最终可能会导致应用因IllegalStateException: Too many receivers, total of 1000, registered for pid
而崩溃 (#1224)。
- 确保
- Cronet 扩展程序:
- 修复了
CronetDataSource
中的SocketTimeoutException
。在某些版本的 Cronet 中,回调提供的请求并不总是相同。这会导致回调无法完成并导致请求超时 (https://issuetracker.google.com/328442628)。
- 修复了
- HLS 扩展程序:
- 修复了以下 bug:等待不连续性的待处理 EMSG 样本在
HlsSampleStreamWrapper
中委托,但偏移量不正确,导致IndexOutOfBoundsException
或IllegalArgumentException
(#1002)。 - 修复了以下 bug:非主要播放列表会不断重新加载 LL-HLS 流 (#1240)。
- 修复了以下 bug:为包含初始化分段的 HLS 启用 CMCD 会导致
Source Error
和IllegalArgumentException
。 - 修复了在直播播放期间非主要播放播放列表不会刷新的 bug (#1240)。
- 修复了为 HLS 直播启用 CMCD 会导致
ArrayIndexOutOfBoundsException
的 bug (#1395)。
- 修复了以下 bug:等待不连续性的待处理 EMSG 样本在
- DASH 扩展程序:
- Cast 扩展程序:
- 修复了将
MediaQueueItem
的影集标题转换为 Media3 媒体项中的音乐人信息的 bug (#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 中选择“真实”视频轨道,其中可能包含两个 HEVC 轨道,其中一个分辨率较高,但帧数非常少 (#1051)。
- 提取器:
- 音频:
- 如果音轨在分流模式下未能初始化,则通过停用分流来允许渲染程序恢复。
- 视频:
- 文本:
- WebVTT:阻止直接连续提示从
WebvttParser.parse
创建虚假的其他CuesWithTiming
实例 (#1177)。
- WebVTT:阻止直接连续提示从
- DRM:
- 解决了在某些 Android 14 设备上
MediaDrm
框架(而非ResourceBusyException
或NotProvisionedException
)可能会抛出NoSuchMethodError
的问题 (#1145)。
- 解决了在某些 Android 14 设备上
- 影响:
- 通过转换颜色空间,改进了 PQ 到 SDR 色调映射。
- 会话:
- 界面:
- 如果
Locale
无法识别显示名称,则回退以添加音轨语言名称 (#988)。
- 如果
- DASH 扩展程序:
- 将清单中的所有
Label
元素填充到Format.labels
(#1054)。
- 将清单中的所有
- RTSP 扩展程序:
- 在 SDP 解析中跳过空会话信息值 (i-tag) (#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 依赖项。 - 当其中至少一个非 null 时,在
MediaMetadata.Builder.populate(MediaMetadata)
中填充artworkUri
和artworkData
(#964)。
- 实现了对
- ExoPlayer:
- 添加了
PreloadMediaSource
和PreloadMediaPeriod
,以允许应用在播放前在特定起始位置预加载内容媒体源。PreloadMediaSource
负责准备内容媒体源以接收Timeline
、准备并缓存给定开始位置的时段、选择轨道并加载相应时段的媒体数据。应用通过实现PreloadMediaSource.PreloadControl
来控制预加载进度,并将预加载的来源设置为播放器以进行播放。 - 添加了允许应用设置
ImageRenderer.ImageOutput
的ExoPlayer.setImageOutput
。 DefaultRenderersFactory
现在默认向玩家提供ImageRenderer
,其中ImageOutput
和ImageDecoder.Factory.DEFAULT
为 null。- 跳过静音时发出
Player.Listener.onPositionDiscontinuity
事件 (#765)。 - 添加了对提取过程中解析字幕的实验性支持。您可以使用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
启用此功能。 - 使用
PreloadMediaSource
支持自适应媒体源。 - 使用 HttpEngine API 实现
HttpEngineDataSource
,即HttpDataSource
。 - 禁止对
CompositeSequenceableLoader
进行子类化。此组件之前已实现可扩展性,但从未在库中进行过子类化处理。您可以使用装饰器模式封装实例并实现自定义CompositeSequenceableLoaderFactory
来进行自定义。 - 修复了重复同一时间会导致此项的元数据被清除的问题 (#1007)。
- 将
BundledChunkExtractor.Factory
和DefaultHlsExtractorFactory
上的experimentalSetSubtitleParserFactory
方法重命名为setSubtitleParserFactory
,并禁止传递null
。使用新的experimentalParseSubtitlesDuringExtraction(boolean)
方法控制解析行为。 - 添加了对自定义提取过程中使用的
SubtitleParser.Factory
的支持。这可以通过MediaSource.Factory.setSubtitleParserFactory()
实现。 - 为从
MergingMediaSource
生成的所有Format.id
字段添加了来源前缀。这有助于确定哪个来源生成了Format
(#883)。 - 修复了用于验证自定义通用媒体客户端数据 (CMCD) 键名称的正则表达式,将其修改为仅检查英文连字符 (#1028)。
- 停止对 CMCD 查询参数进行双重编码 (#1075)。
- 添加了
- 转换器:
- 轨道选择:
- 添加了
DefaultTrackSelector.selectImageTrack
以启用图片轨道选择。 - 添加了
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
,以便在同时有图片轨道和视频轨道可用时确定是否选择图片轨道。默认值为false
,表示优先选择视频轨道。
- 添加了
- 提取器:
- 向 MP4 提取器添加了额外的 AV1C 解析,以检索
ColorInfo.colorSpace
、ColorInfo.colorTransfer
和ColorInfo.colorRange
值 (#692)。 - MP3:使用恒定比特率 (CBR) 跳转到包含
Info
标头(与Xing
标头等效的 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 广告的问题。
- 会话:
- 针对 TV 应用停用双击检测 (#962)。
- 修复了以下问题:仅包含非 null extra 的
MediaItem.RequestMetadata
不会在媒体控制器和会话之间传输。 - 向
MediaLibrarySession.Builder
添加了仅接受Context
(而非MediaLibraryService
)的构造函数。
- HLS 扩展程序:
- 将
HlsMediaPeriod
的公开范围缩小为软件包私有。不应从 HLS 软件包外部直接依赖于此类型。 - 更高效地解析跳转到片段开头的操作 (#1031)。
- 将
- 解码器扩展(FFmpeg、VP9、AV1、MIDI 等):
- MIDI 解码器:忽略 SysEx 事件消息 (#710)。
- 测试实用程序:
- 请勿在
TestPlayerRunHelper.playUntilPosition
中暂停播放。测试会让播放保持在播放状态,但会暂停进度,直到测试能够添加断言和进一步的操作。
- 请勿在
- 演示版应用:
- 添加了短视频演示模块,以演示如何将
PreloadMediaSource
与短视频内容用例搭配使用。
- 添加了短视频演示模块,以演示如何将
版本 1.3.0-rc01
2024 年 2 月 22 日
使用 1.3.0 稳定版。
版本 1.3.0-beta01
2024 年 2 月 7 日
使用 1.3.0 稳定版。
版本 1.3.0-alpha01
2024 年 1 月 15 日
使用 1.3.0 稳定版。
版本 1.2.0
版本 1.2.1
2024 年 1 月 9 日
- ExoPlayer:
- 转换器:
- 解决了编码器因设置较高的运行速率而会在配置时抛出问题的问题。
- 提取器:
- 音频:
- 修复了多次调用
SilenceSkippingAudioProcessor
时对 EOS 的处理方式 (#712)。
- 修复了多次调用
- 视频:
- 添加了针对 Galaxy Tab S7 FE、Chromecast(支持 Google TV)和 Lenovo M10 FHD Plus 上导致 60fps AVC 串流被标记为不受支持的设备问题的权宜解决方法 (#693)。
- 元数据:
- 修复了仅从使用大写键的 Vorbis 注释填充
MediaMetadata
的 bug (#876)。 - 在解析非常大的 ID3 帧时捕获
OutOfMemoryError
,这意味着即使没有标记信息,播放也可以继续,而不是完全失败。
- 修复了仅从使用大写键的 Vorbis 注释填充
- DRM:
- 将针对虚假 ClearKey
https://default.url
许可 URI 的权宜解决方法扩展到 API 33 及更高版本(之前,权宜解决方法仅适用于 API 33)(#837)。 - 修复了在没有将 Surface 附加到播放器的情况下从加密内容切换到清晰内容时出现的
ERROR_DRM_SESSION_NOT_OPENED
问题。该错误是由于错误地使用安全解码器播放清晰内容所致。
- 将针对虚假 ClearKey
- 会话:
- 界面:
- DASH 扩展程序:
- 在 DASH 清单中将“f800”解析为杜比声道的声道数为 5 (#688)。
- 解码器扩展(FFmpeg、VP9、AV1、MIDI 等):
- Cast 扩展程序:
- 对
Timeline
的创建进行了排错,以便在投放设备上加载媒体失败时应用不会崩溃 (#708)。
- 对
版本 1.2.0
2023 年 11 月 15 日
- 通用库:
- 向
Log.Logger
接口中的方法添加了@Nullable Throwable
参数。这些方法的message
参数不再包含传递给Log.{d,i,w,e}()
方法的Throwable
的任何信息,因此实现需要根据需要手动附加此信息(可能使用Logger.appendThrowableString(String, Throwable)
)。 - 修复了 Kotlin 兼容性问题,即可为 null 的泛型类型形参和可为 null 的数组元素类型未被检测为可为 null。例如
TrackSelectorResult
和SimpleDecoder
方法参数 (#6792)。 - 更改了
Util.shouldShowPlayButton
中的默认界面和通知行为,以便在暂时禁止播放(例如由于音频焦点暂时丢失)时显示“播放”按钮。您可以使用PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
或MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
来保留旧版行为 (#11213)。 - 将
androidx.annotation:annotation-experimental
升级为1.3.1
,以修复 https://issuetracker.google.com/251172715 中的问题。 - 将
ExoPlayer.setAudioAttributes
移至Player
接口。
- 向
- ExoPlayer:
- 修复了因未正确识别仅解码的示例而导致的 AC4 串流跳转问题 (#11000)。
- 添加了在通过
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
启用此功能时,抑制在不合适的音频输出设备(例如 Wear OS 设备上的内置扬声器)上播放的功能。如果在没有合适的音频输出设备可用时尝试播放,或者在播放期间所有合适的输出设备都断开连接,则播放抑制原因将更新为Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
。连接合适的输出后,系统会移除屏蔽原因。 - 添加
MediaSource.canUpdateMediaItem
和MediaSource.updateMediaItem
,以便在通过Player.replaceMediaItem(s)
创建后接受MediaItem
更新。 - 允许对库通过
Player.replaceMediaItem(s)
提供的所有MediaSource
类进行MediaItem
更新 (#33、#9978)。 - 将
MimeTypes.TEXT_EXOPLAYER_CUES
改名为MimeTypes.APPLICATION_MEDIA3_CUES
。 - 添加
PngExtractor
,将整个 PNG 文件发送并读取到TrackOutput
中作为一个示例。 - 将
SequenceableLoader
接口中的SequenceableLoader.continueLoading(long)
方法增强为SequenceableLoader.continueLoading(LoadingInfo loadingInfo)
。除了现有的playbackPositionUs
之外,LoadingInfo
还包含其他参数,包括playbackSpeed
和lastRebufferRealtimeMs
。 - 将
ChunkSource
接口中的ChunkSource.getNextChunk(long, long, List, ChunkHolder)
方法增强为ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
。 - 向通用媒体客户端数据 (CMCD) 日志记录添加了其他字段:缓冲区饥饿 (
bs
)、截止期限 (dl
)、播放速率 (pr
) 和启动 (su
) (#8699)。 - 向
ColorInfo
添加了 luma 和 chroma 位深 (#491)。 - 向通用媒体客户端数据 (CMCD) 日志记录添加了其他字段:下一个对象请求 (
nor
) 和下一个范围请求 (nrr
) (#8699)。 - 添加了使用查询参数传输通用媒体客户端数据 (CMCD) 数据的功能 (#553)。
- 修复了
ExperimentalBandwidthMeter
中的ConcurrentModificationException
(#612)。 - 向
CompositeMediaSource.getMediaTimeForChildMediaTime
添加了MediaPeriodId
参数。 - 在
ConcatenatingMediaSource2
中支持ClippingMediaSource
(以及具有周期/时间段时间偏移的其他来源)(#11226)。 - 更改
BaseRenderer.onStreamChanged()
,使其也接收MediaPeriodId
参数。
- 转换器:
- 解析图片输入的 EXIF 旋转数据。
- 移除了
TransformationRequest.HdrMode
注解类型及其关联的常量。请改用Composition.HdrMode
及其关联常量。 - 简化了
OverlaySettings
,以解决旋转问题。 - 将
SampleConsumer.queueInputBitmap
的frameRate
和durationUs
参数更改为TimestampIterator
。
- 轨道选择:
- 添加了
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
,以明确允许或禁止非流畅自适应。默认值保持为当前的true
行为。
- 添加了
- 提取器:
- MPEG-TS:通过将数据流的最后一个访问单元传递给样本队列,确保渲染最后一个帧 (#7909)。
- 修复了确定
rotationDegrees
时的拼写错误。将projectionPosePitch
更改为projectionPoseRoll
(#461)。 - 移除了假设
Extractor
实例可以使用instanceof
直接检查的假设。如果您希望在运行时访问Extractor
的实现详情,则必须先调用Extractor.getUnderlyingInstance
。 - 添加了
BmpExtractor
。 - 添加了
WebpExtractor
。 - 添加了
HeifExtractor
。 - 向
Mp4Extractor
添加了 QuickTime 经典版支持。
- 音频:
- 在 MP4 和 Matroska 中添加了对 24/32 位大端 PCM 的支持,并在 MP4 中为
lpcm
解析 PCM 编码。 - 添加了对从 MP4 中提取 Vorbis 音频的支持。
- 添加了
AudioSink.getFormatOffloadSupport(Format)
,用于检索下水道可以通过DefaultAudioOffloadSupportProvider
为格式提供的卸载支持级别。它会返回包含isFormatSupported
、isGaplessSupported
和isSpeedChangeSupported
的新AudioOffloadSupport
。 - 添加了
AudioSink.setOffloadMode()
,用于配置音频接收器上的分流配置。默认值为AudioSink.OFFLOAD_MODE_DISABLED
。 - 您可以通过
TrackSelectionParameters
中的setAudioOffloadPreference
启用分流。如果设置的偏好设置为启用,设备支持相应格式的分流,并且轨道选择是单个音轨,则系统会启用音频分流。 - 如果
audioOffloadModePreference
设置为AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
,则DefaultTrackSelector
仅会选择音轨,并且仅当该轨道的格式受分流支持时才会选择。如果分流不支持任何音轨,则不会选择任何音轨。 - 由于轨道转换后出现播放位置问题,因此在 API 级别低于 33 时停用了对分流的无缝支持。
- 从
DefaultRenderersFactory.buildAudioSink
方法签名中移除了参数enableOffload
。 - 移除了方法
DefaultAudioSink.Builder.setOffloadMode
。 - 移除了 intdef 值
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
。 - 添加了对分流播放期间 Opus 无缝元数据的支持。
- 如果首次写入失败,通过停用分流来允许呈现程序恢复 (#627)。
- 默认情况下,为纯音频分流播放启用分流调度。
- 删除
ExoPlayer.experimentalSetOffloadSchedulingEnabled
和AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
。 - 将
onExperimentalSleepingForOffloadChanged
重命名为onSleepingForOffloadChanged
,将onExperimentalOffloadedPlayback
重命名为onOffloadedPlayback
。 - 将与音频分流模式相关的
TrackSelectionParameters
接口和定义移到了内部AudioOffloadPreferences
类。 - 将
onAudioTrackInitialized
和onAudioTrackReleased
回调添加到AnalyticsListener
、AudioRendererEventListener
和AudioSink.Listener
。 - 修复了 DTS Express 音频缓冲区下溢问题 (#650)。
- 修复了 E-AC3-JOC 的功能检查会抛出
IllegalArgumentException
的 bug (#677)。
- 在 MP4 和 Matroska 中添加了对 24/32 位大端 PCM 的支持,并在 MP4 中为
- 视频:
- 允许
MediaCodecVideoRenderer
使用自定义VideoFrameProcessor.Factory
。 - 修复了以下 bug:如果音频流以负时间戳开头,则无法渲染第一个帧 (#291)。
- 允许
- 文本:
- 移除了
ExoplayerCuesDecoder
。现在,包含sampleMimeType = application/x-media3-cues
的文本轨道由TextRenderer
直接处理,而无需SubtitleDecoder
实例。
- 移除了
- 元数据:
- 系统不会再针对“仅解码”示例调用
MetadataDecoder.decode
,因为实现始终必须返回 null。
- 系统不会再针对“仅解码”示例调用
- 影响:
- 添加了按时间戳排队位图输入的
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
。 - 将
VideoFrameProcessor.registerInputStream()
更改为非阻塞操作。应用必须实现VideoFrameProcessor.Listener#onInputStreamRegistered()
。 - 将
VideoFrameProcessor.queueInputBitmap
的frameRate
和durationUs
参数更改为TimestampIterator
。
- 添加了按时间戳排队位图输入的
- IMA 扩展程序:
- 修复了以下 bug:不是播放列表中第一个项的多时段 DASH 直播可能会抛出异常 (#571)。
- 在调用
AdsLoader.destroy()
之前释放 StreamManager - 将 IMA SDK 版本提升至 3.31.0。
- 会话:
- 在
DefaultMediaNotificationProvider
中将通知前台服务行为设置为FOREGROUND_SERVICE_IMMEDIATE
(#167)。 - 仅使用 API 31 以上的
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
,以避免在三星设备上出现已废弃 API 的问题 (#167)。 - 使用媒体通知控制器作为代理来设置用于填充通知和平台会话的可用命令和自定义布局。
- 转换 Media3 中由
MediaSessionService.onStartCommand()
接收的媒体按钮事件,而不是将其路由到平台会话并返回 Media3。这样一来,调用方控制器始终是媒体通知控制器,并且应用可以在所有受支持的 API 级别上以相同的方式轻松识别来自通知的调用。 - 修复了以下 bug:连接到旧版
MediaSessionCompat
时MediaController.getCurrentPosition()
不推进。 - 添加了
MediaLibrarySession.getSubscribedControllers(mediaId)
以方便使用。 - 替换
MediaLibrarySession.Callback.onSubscribe()
以断言控制器订阅的父 ID 的可用性。如果成功,系统会接受订阅,并立即调用notifyChildrenChanged()
以通知浏览器 (#561)。 - 为 Automotive OS 添加了会话演示模块,并为 Android Auto 启用了会话演示。
- 如果媒体通知控制器无法使用
COMMAND_GET_TIMELINE
,请勿设置框架会话的队列。将 Android Auto 用作从框架会话读取的客户端控制器后,Android Auto 界面中不会显示queue
按钮 (#339)。 - 默认使用
DataSourceBitmapLoader
,而不是SimpleBitmapLoader
(#271、#327)。 - 添加了
MediaSession.Callback.onMediaButtonEvent(Intent)
,以允许应用替换默认的媒体按钮事件处理。
- 在
- 界面:
- 为 Wear OS 设备添加了
Player.Listener
实现,该实现通过启动系统对话框来处理因Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
而导致的播放抑制,以允许用户连接合适的音频输出设备(例如蓝牙耳机)。如果在可配置的超时时间(默认为 5 分钟)内连接了合适的设备,监听器将自动恢复播放。
- 为 Wear OS 设备添加了
- 下载内容:
- 为
DownloadService
声明“data sync”前台服务类型,以实现与 Android 14 的兼容性。使用此服务时,应用还需要在清单中将dataSync
添加为foregroundServiceType
,并添加FOREGROUND_SERVICE_DATA_SYNC
权限 (#11239)。
- 为
- HLS 扩展程序:
- 使用从上次加载开始时间(而非上次加载完成时间)计算得出的时间间隔刷新 HLS 直播播放列表 (#663)。
- DASH 扩展程序:
- 允许细分模板网址中包含多个相同的短划线标识符。
- 添加了对提取过程中解析字幕的实验性支持。这为合并重叠的字幕提供了更好的支持,包括解决在字幕片段之间转换时出现的闪烁问题。您可以使用
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
启用此功能 (#288)。
- RTSP 扩展程序:
- 解码器扩展(FFmpeg、VP9、AV1、MIDI 等):
- 发布 MIDI 解码器模块,该模块支持使用 Jsyn 库合成音频来播放标准 MIDI 文件。
- 添加了
DecoderOutputBuffer.shouldBeSkipped
,以直接标记不需要呈现的输出缓冲区。这比将被弃用的C.BUFFER_FLAG_DECODE_ONLY
更为理想。 - 添加了
Decoder.setOutputStartTimeUs
和SimpleDecoder.isAtLeastOutputStartTimeUs
,以允许解码器在开始时间之前丢弃仅解码的样本。这应优先于将被弃用的Buffer.isDecodeOnly
。 - 修复了将 MIDI 解码器工件发布到 Maven 制品库时出现的 bug。工件已重命名为
media3-exoplayer-midi
(#734)。
- Leanback 扩展:
- 修复了停用 Surface 可能会导致 Leanback 代码中出现
ArithmeticException
的 bug (#617)。
- 修复了停用 Surface 可能会导致 Leanback 代码中出现
- 测试实用程序:
- 使
TestExoPlayerBuilder
和FakeClock
与 Espresso 界面测试和 Compose 界面测试兼容。这修复了在 Espresso 或 Compose 视图互动期间播放进度非确定性推进的 bug。
- 使
- 移除了已废弃的符号:
- 移除了
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
和TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
。请改用Composition.Builder.setHdrMode(int)
,并将Composition
传递给Transformer.start(Composition, String)
。 - 移除了已废弃的
DownloadNotificationHelper.buildProgressNotification
方法,改用接受notMetRequirements
参数的非废弃方法。
- 移除了
版本 1.2.0-rc01
2023 年 11 月 1 日
使用 1.2.0 稳定版。
版本 1.2.0-beta01
2023 年 10 月 19 日
使用 1.2.0 稳定版。
版本 1.2.0-alpha02
2023 年 9 月 29 日
使用 1.2.0 稳定版。
版本 1.2.0-alpha01
2023 年 8 月 17 日
使用 1.2.0 稳定版。
版本 1.1.0
版本 1.1.1
2023 年 8 月 16 日
- 通用库:
- 从所有模块中移除了意外添加的
multidex
依赖项 (#499)。
- 从所有模块中移除了意外添加的
- ExoPlayer:
- 修复了
PlaybackStatsListener
中在清除播放列表后创建了虚假PlaybackStats
的问题。 - 向 Common Media Client Data (CMCD) 日志记录添加了其他字段:流式传输格式 (sf)、流式传输类型 (st)、版本 (v)、最高比特率 (tb)、对象时长 (d)、测量吞吐量 (mtp) 和对象类型 (ot) (#8699)。
- 修复了
- 音频:
- 修复了播放非常短的文件时
Player.getState()
永远不会转换为STATE_ENDED
的 bug (#538)。
- 修复了播放非常短的文件时
- 音频分流:
- 根据 RFC 7845 将 Ogg ID 标头和注释标头页附加到比特流,以便进行分流式 Opus 播放。
- 视频:
- H.265/HEVC:修复了解析 SPS 短期和长期参考图片信息的问题。
- 文本:
- CEA-608:更改了 cue 截断逻辑,以仅考虑可见文本。以前,在将提示长度限制为 32 个字符时,系统会将缩进和制表符偏移量包含在内(从技术层面来说,这符合规范)(#11019)。
- IMA 扩展程序:
- 将 IMA SDK 版本提升至 3.30.3。
- 会话:
- 向控制器的状态添加自定义布局,并提供用于访问它的 getter。当自定义布局发生变化时,系统会调用
MediaController.Listener.onCustomLayoutChanged
。如果应用想要向不同的 Media3 控制器发送不同的自定义布局,可以在MediaSession.Callback.onConnect
中使用AcceptedResultBuilder
来执行此操作,以确保在连接完成时自定义布局可供控制器使用。 - 修复了
MediaLibraryServiceLegacyStub
向不支持此操作的Result
发送错误并生成UnsupportedOperationException
的情况 (#78)。 - 通过同时使用旧版命令 (
COMMAND_ADJUST_DEVICE_VOLUME
和COMMAND_SET_DEVICE_VOLUME
) 和新命令 (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
和COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) 确定volumeControlType
,修复了PlayerWrapper
创建VolumeProviderCompat
的方式 (#554)。
- 向控制器的状态添加自定义布局,并提供用于访问它的 getter。当自定义布局发生变化时,系统会调用
版本 1.1.0
2023 年 7 月 5 日
- 通用库:
- 添加了因音频路线不合适而被抑制的理由,并更改了因被抑制时间过长而被抑制的理由。(#15)。
- 向玩家添加命令:
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)
。 - 修复了以下 bug:如果在输入帧待处理时发出了视频流结束信号,转换可能会卡住(导致多路复用器超时)。
- 通过
MediaCodecList
查询编解码器,而不是使用findDecoder/EncoderForFormat
实用程序,以扩大支持范围。 - 移除了
DefaultEncoderFactory
中的 B 帧配置,因为它在某些设备上不起作用。
- 移除了
- 轨道选择:
- 添加了
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
(默认处于停用状态)。启用后,当渲染程序功能发生变化时,DefaultTrackSelector
将触发新的轨道选择。
- 添加了
- 提取器:
- 音频:
- 修复了以下 bug:启用隧道传输且
AudioProcessors
处于活动状态时,某些播放会失败,例如无缝剪辑 (#10847)。 - 在直接播放(分流)中将 Opus 帧封装在 Ogg 数据包中。
- 使用分流调度在休眠期间推断当前位置。
- 添加了
Renderer.release()
和AudioSink.release()
,以便在播放器生命周期结束时释放资源。 - 监听
DefaultAudioSink
中的音频功能更改。在DefaultAudioSink
的构造函数中添加一个必需参数context
,DefaultAudioSink
将使用该参数注册为AudioCapabilitiesReceiver
的监听器,并在收到功能更改通知时更新其audioCapabilities
属性。 - 通过
AudioSink.Listener
接口中的新事件onAudioCapabilitiesChanged
和用于触发onRendererCapabilitiesChanged
事件的新接口RendererCapabilities.Listener
传播音频功能更改。 - 添加了
ChannelMixingAudioProcessor
,用于对音频通道应用缩放/混音。 - 向
DecoderDiscardReasons
添加了新的 int 值DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
,以便在音频功能发生变化后,在可能的情况下舍弃音频解码器。 - 添加了对 DTS Express 和 DTS:X 的直接播放支持 (#335)。
- 修复了以下 bug:启用隧道传输且
- 视频:
- 使
MediaCodecVideoRenderer
在渲染程序停用时报告宽度和高度均为 0 的VideoSize
。当Player.getVideoSize()
发生变化时,系统会相应地调用Player.Listener.onVideoSizeChanged
。进行此更改后,当Player.getCurrentTracks
不支持视频或尚未确定支持的视频轨道的大小时,ExoPlayer 的视频大小(使用MediaCodecVideoRenderer
)的宽度和高度均为 0。
- 使
- DRM:
- 降低了
DefaultDrmSession
上几个仅限内部的方法的可见性,这些方法不应从 DRM 软件包外部调用:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- 降低了
- 多路复用器:
- 添加了一个可用于创建 MP4 容器文件的新多路复用器库。
- IMA 扩展程序:
- 为 DAI 启用多时段直播 DASH 串流。请注意,当前实现尚不支持在直播中跳转 (#10912)。
- 修复了以下 bug:由于连续时间轴中计算的内容位置略有不同,系统会在直播中插入新的广告组。
- 会话:
- 添加辅助方法
MediaSession.getControllerForCurrentRequest
以获取当前调用Player
方法的控制器的相关信息。 - 添加了
androidx.media3.session.MediaButtonReceiver
,以便应用能够通过蓝牙耳机等发送的媒体按钮事件实现播放恢复 (#167)。 - 向
MediaSession.Callback.onAddMediaItems
添加了默认实现,以允许在请求的MediaItems
具有LocalConfiguration
(例如 URI)时将其传递给Player
(#282)。 - 默认情况下,在 Android 12 及更低版本的紧凑媒体通知视图中添加“跳转到前面”和“跳转到后面”命令按钮 (#410)。
- 向
MediaSession.Callback.onAddMediaItems
添加了默认实现,以允许在请求的MediaItems
具有LocalConfiguration
(例如 URI)时将其传递给Player
(#282)。 - 默认情况下,在 Android 12 及更低版本的紧凑媒体通知视图中添加“跳转到前面”和“跳转到后面”命令按钮 (#410)。
- 添加辅助方法
- 界面:
- 添加了 Util 方法
shouldShowPlayButton
和handlePlayPauseButtonAction
,以编写带有播放/暂停按钮的自定义界面元素。
- 添加了 Util 方法
- RTSP 扩展程序:
- DASH 扩展程序:
- 针对多时段 DASH 串流,从
MediaLoadData.startTimeMs
和MediaLoadData.endTimeMs
中移除媒体时间偏移。 - 修复了重新准备多时段直播 Dash 媒体源会产生
IndexOutOfBoundsException
的 bug (#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
软件包、java.nio.charset.StandardCharsets
或com.google.common.base.Charsets
中的 Kotlin 字符集。 - 移除了已废弃的
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)。
- 会话:
- 修复了以下问题:当连接到会更新其操作的旧版
MediaSessionCompat
时,MediaController
不会更新其可用命令。 - 修复了导致
MediaLibraryService
无法在 API 30 上针对从系统界面到Callback.onGetLibraryRoot
的调用返回 null 的 bug (#355)。params.isRecent == true
- 修复了
MediaSessionService
或MediaLibraryService
的内存泄漏问题 (#346)。 - 修复了以下 bug:在
MediaSession
中组合使用Timeline
和位置更新可能会导致MediaController
抛出IllegalStateException
。
- 修复了以下问题:当连接到会更新其操作的旧版
版本 1.0.1
2023 年 4 月 18 日
发布了 androidx.media3:media3-*:1.0.1
。版本 1.0.1 中包含这些提交内容。
此版本与 ExoPlayer 2.18.6 版本相对应。
- 核心库:
- 在跳转到默认位置时重置目标直播替换项 (#11051)。
- 修复了以下 bug:媒体中的空示例串流可能会导致播放卡住。
- 会话:
- 修复了由旧版
MediaSessionCompat
发布的多个相同队列项导致MediaController
中出现异常的 bug (#290)。 - 向旧版
MediaControllerCompat.Callback.onSessionEvent
添加了缺少的MediaSession.broadcastCustomCommand
转发 (#293)。 - 修复了调用
MediaSession.setPlayer
不会更新可用命令的 bug。 - 修复了以下问题:如果从
MediaController
发送的TrackSelectionOverride
实例引用了使用Format.metadata
的组,则会被忽略 (#296)。 - 修复了需要
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
才能通过旧版MediaSessionCompat
访问元数据的问题。 - 修复了以下问题:后台线程上的
MediaSession
实例在MediaSessionService
中使用时会导致崩溃 (#318)。 - 修复了以下问题:库声明了媒体按钮接收器,但应用并未打算这样做 (#314)。
- 修复了由旧版
- DASH:
- 修复了对空细分时间轴的处理方式 (#11014)。
- RTSP:
- 如果使用 UDP 的 RTSP 设置失败并出现 RTSP 错误 461 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(支持 Google TV)和联想 M10 FHD Plus 上导致 60fps AVC 串流被标记为不受支持的设备问题的权宜解决方法 (#10898)。
- 修复了在以远高于屏幕刷新率的帧速率播放媒体时出现的帧释放性能问题。
- 将 HEVC HDR10 格式映射到
- Cast:
- 修复了在媒体内容之间转换时出现的瞬时
STATE_IDLE
(#245)。
- 修复了在媒体内容之间转换时出现的瞬时
- RTSP:
- 捕获在解析无效的 RTSP Describe 响应消息时抛出的 IllegalArgumentException (#10971)。
- 会话:
- 修复了以下 bug:通知播放/暂停按钮不会随播放器状态更新 (#192)。
- IMA 扩展程序:
- 修复了一个 bug,该 bug 会导致未包含任何广告的 DAI 直播无法启动,因为未收到第一个(在没有广告的情况下是唯一的)
LOADED
事件。
- 修复了一个 bug,该 bug 会导致未包含任何广告的 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 Atom 时缺少必需的示例说明 (stsd),则抛出
ParserException
,而非NullPointerException
。 - 在 fMP4 中直接跳转到同步帧时会正确跳过示例 (#10941)。
- 如果示例表 (stbl) 在解析 trak Atom 时缺少必需的示例说明 (stsd),则抛出
- 音频:
- 使用压缩音频格式比特率来计算直接播放(直通)中
AudioTrack
的最小缓冲区大小。
- 使用压缩音频格式比特率来计算直接播放(直通)中
- 文本:
- 修复了当字幕文件不包含任何提示时,向
Subtitle.getEventTime
传递无效(负数)索引的TextRenderer
。 - SubRip:如果 UTF-16 文件以字节顺序标记开头,请添加对此类文件的支持。
- 修复了当字幕文件不包含任何提示时,向
- 元数据:
- 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
- 添加了
MediaMetadata.mediaType
,以指示内容类型或元数据描述的文件夹类型。 - 添加了
MediaMetadata.isBrowsable
,以替代MediaMetadata.folderType
。下一个版本中将废弃文件夹类型。
- DASH:
- 为图片适配集添加了完整的解析,包括图块计数 (#3752)。
- 界面:
- 会话:
- 添加了抽象
SimpleBasePlayer
,以帮助为自定义播放器实现Player
接口。 - 添加了辅助方法,用于将平台会话令牌转换为 Media3
SessionToken
(#171)。 - 使用
onMediaMetadataChanged
来触发平台媒体会话的更新 (#219)。 - 将媒体会话添加为
DefaultMediaNotificationProvider
的getMediaButtons()
的参数;为清楚起见,还使用了不可变列表 (#216)。 - 添加了
onSetMediaItems
回调监听器,以便修改/设置MediaItem
列表,同时按会话启动索引和位置,然后再设置到播放器上 (#156)。 - 避免针对非蓝牙媒体按钮事件执行两次点按检测 (#233)。
- 提高了
QueueTimeline
在出现可疑的旧版会话状态时的稳健性 (#241)。
- 添加了抽象
- 元数据:
- 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
- 添加了
MediaMetadata.mediaType
,以指示内容类型或元数据描述的文件夹类型。 - 添加了
MediaMetadata.isBrowsable
,以替代MediaMetadata.folderType
。下一个版本中将废弃文件夹类型。
- Cast 扩展程序:
- 将 Cast SDK 版本升级到 21.2.0。
- IMA 扩展程序:
- 移除了应用线程上
ImaServerSideAdInsertionMediaSource
的播放器监听器,以避免出现线程问题。 - 为
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder
添加focusSkipButtonWhenAvailable
属性,以请求将 TV 设备上的“跳过”按钮设置为焦点,并将其默认设置为 true。 - 将
focusSkipButton()
方法添加到ImaServerSideAdInsertionMediaSource.AdsLoader
,以便通过程序化方式请求将“跳过”按钮设置为焦点。 - 将 IMA SDK 版本提升至 3.29.0。
- 移除了应用线程上
- 演示版应用:
- 在运行时请求下载通知的通知权限 (#10884)。
版本 1.0.0-beta03
2022 年 11 月 22 日
发布了 androidx.media3:media3-*:1.0.0-beta03
。版本 1.0.0-beta03 中包含这些提交内容。
此版本与 ExoPlayer 2.18.2 版本相对应。
- 核心库:
- 添加了
ExoPlayer.isTunnelingEnabled
以检查当前所选轨道是否已启用隧道技术 (#2518)。 - 添加了
WrappingMediaSource
以简化封装单个MediaSource
的过程 (#7279)。 - 在播放因可用内存不足而卡住之前舍弃返回缓冲区。
- 在已启用分流的情况下关闭用于跟踪“doSomeWork”块的功能。
- 修复了
PlaybackStatsListener
中快速跳转的会话跟踪问题 (#180)。 - 在单项播放列表中调用
seekToNext
或seekToPrevious
时,发送缺失的onMediaItemTransition
回调 (#10667)。 - 添加了
Player.getSurfaceSize
,用于返回呈现视频时所用 Surface 的大小。 - 修复了在播放器释放期间移除监听器可能会导致
IllegalStateException
的 bug (#10758)。
- 添加了
- build:
- 强制执行最低
compileSdkVersion
以避免编译错误 (#10684)。 - 避免于包含在另一 Gradle build 中时发布块。
- 强制执行最低
- 轨道选择:
- 如果显示设备不支持杜比视界,请改选轨道。 (#8944)。
- 下载内容:
- 视频:
- 如果显示设备不支持杜比视界,请尝试改用替代解码器。 (#9794)。
- 音频:
- 使用
SingleThreadExecutor
释放AudioTrack
实例,以免同时释放多个播放器时出现 OutOfMemory 错误 (#10057)。 - 为 AudioTrack 分流状态添加了
AudioOffloadListener.onExperimentalOffloadedPlayback
。 (#134)。 - 将
AudioTrackBufferSizeProvider
设为公共接口。 - 添加了
ExoPlayer.setPreferredAudioDevice
以设置首选音频输出设备 (#135)。 - 将
androidx.media3.exoplayer.audio.AudioProcessor
重命名为androidx.media3.common.audio.AudioProcessor
。 - 在所有 Android 版本上,将 8 声道和 12 声道音频分别映射到 7.1 和 7.1.4 声道掩码 (#10701)。
- 使用
- 元数据:
- 现在可以将
MetadataRenderer
配置为在元数据可用后立即渲染。创建一个具有MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
的实例,以指定渲染程序是尽早输出元数据还是与播放器位置同步元数据。
- 现在可以将
- DRM:
- 解决了 Android 13 ClearKey 实现中会返回非空但无效许可网址的 bug。
- 修复了在播放列表中的 DRM 方案之间切换时(例如从 Widevine 切换为 ClearKey)出现的
setMediaDrmSession failed: session not opened
错误。
- 文本:
- CEA-608:确保正确处理字段 2 上的服务切换命令 (#10666)。
- DASH:
- 从清单中解析
EventStream.presentationTimeOffset
(#10460)。
- 从清单中解析
- 界面:
- 使用播放器的当前替换值作为
TrackSelectionDialogBuilder
中的预设值 (#10429)。
- 使用播放器的当前替换值作为
- 会话:
- 确保命令始终以正确顺序执行,即使某些命令需要异步解析也是如此 (#85)。
- 添加了
DefaultMediaNotificationProvider.Builder
以构建DefaultMediaNotificationProvider
实例。构建器可以配置提供程序使用的通知 ID、通知渠道 ID 和通知渠道名称。此外,还添加了方法DefaultMediaNotificationProvider.setSmallIcon(int)
以设置通知小图标。(#104)。 - 确保不会丢弃在
MediaController.release()
之前发送的命令 (#99)。 SimpleBitmapLoader
可以从file://
URI 加载位图 (#108)。- 修复了阻止
MediaController
在一段时间内查找广告的断言 (#122)。 - 播放结束后,系统会从前台停止
MediaSessionService
,并显示通知以重新开始播放最近播放过的媒体项 (#112)。 - 不启动具有待处理的暂停 intent 的前台服务 (#167)。
- 手动隐藏与
DefaultNotificationProvider
在 API 26 和 API 27 上创建的通知关联的“标记”(在 API 28 及更高级别上,标记会自动隐藏)(#131)。 - 修复了从旧版 MediaSession 到 Media3 MediaController 的第二项 binder 连接导致 IllegalStateException 的 bug (#49)。
- RTSP:
- IMA:
- FFmpeg 扩展程序:
- 添加了新的必需标志,以将 FFmpeg 库与 NDK 23.1.7779620 及更高版本关联 (#9933)。
- AV1 扩展程序:
- 更新了 CMake 版本,以免与最新的 Android Studio 版本不兼容 (#9933)。
- Cast 扩展程序:
- 实现了
getDeviceInfo()
,以便能在使用MediaController
控制播放时识别CastPlayer
(#142)。
- 实现了
- 转换器:
- 添加了多路复用器监控定时器,以检测生成输出样本的速度是否过慢。
- 移除了已废弃的符号:
- 移除了
Transformer.Builder.setOutputMimeType(String)
。此功能已被移除。使用默认多路复用器时,MIME 类型将始终为 MP4 格式。
- 移除了
版本 1.0.0-beta02
2022 年 7 月 21 日
发布了 androidx.media3:media3-*:1.0.0-beta02
。版本 1.0.0-beta02 中包含这些提交内容。
此版本与 ExoPlayer 2.18.1 版本相对应。
- 核心库:
- 确保使用
ExoPlayer.setShuffleOrder
更改ShuffleOrder
后会导致使用reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
对Player.Listener#onTimelineChanged
进行调用 (#9889)。 - 对于渐进式媒体,仅在缓冲位置添加所选轨道 (#10361)。
- 允许将自定义日志记录器用于所有 ExoPlayer 日志输出 (#9752)。
- 修复了在
DefaultMediaSourceFactory
中实现setDataSourceFactory
的问题,后者以前在某些情况下无法正常运行 (#116)。
- 确保使用
- 提取器:
- DASH:
- 从清单中解析 ClearKey 许可网址 (#10246)。
- 界面:
- 确保 TalkBack 在播放控件菜单中公布当前有效的速度选项 (#10298)。
- RTSP:
- 添加了 VP8 碎片化数据包处理机制 (#110)。
- Leanback 扩展:
- 监听
LeanbackAdapter
中的playWhenReady
更改 (10420)。
- 监听
- Cast:
版本 1.0.0-beta01
2022 年 6 月 16 日
发布了 androidx.media3:media3-*:1.0.0-beta01
。版本 1.0.0-beta01 中包含这些提交内容。
这与 ExoPlayer 2.18.0 版本相对应。
- 核心库:
- 通过
MediaMetricsManager
启用了对 Android 平台诊断信息的支持。ExoPlayer 会将播放事件和性能数据转发到平台,这有助于在设备上提供系统性能和调试信息。如果设备用户启用了使用情况和诊断信息数据分享功能,Google 可能也会收集上述数据。应用可以选择不通过ExoPlayer.Builder.setUsePlatformDiagnostics(false)
为 ExoPlayer 提供平台诊断信息。 - 修复了使用
MergingMediaSource
时轨道重置太频繁的 bug,例如侧载 (side-loading) 字幕和播放过程中更改所选字幕时 (#10248)。 - 停止在 API 29 和 30 上检测 5G-NSA 网络类型。这些播放将假设使用 4G 网络。
- 禁止将
null
传递给MediaSource.Factory.setDrmSessionManagerProvider
和MediaSource.Factory.setLoadErrorHandlingPolicy
。如果需要,可以显式传递DefaultDrmSessionManagerProvider
和DefaultLoadErrorHandlingPolicy
的实例。 - 添加了
MediaItem.RequestMetadata
来表示在确切LocalConfiguration
未知的情况下播放媒体所需的元数据。此外,还移除了MediaMetadata.mediaUrl
,因为它现在已包含在RequestMetadata
中。 - 添加了
Player.Command.COMMAND_SET_MEDIA_ITEM
,使播放器允许设置单个媒体项。
- 通过
- 轨道选择:
- 已将
TrackSelectionOverrides
类扁平化为TrackSelectionParameters
,并将TrackSelectionOverride
提升为顶级类。 - 已将
TracksInfo
重命名为Tracks
,并将TracksInfo.TrackGroupInfo
重命名为Tracks.Group
。Player.getCurrentTracksInfo
和Player.Listener.onTracksInfoChanged
也已重命名为Player.getCurrentTracks
和Player.Listener.onTracksChanged
。这包括“取消废弃” (un-deprecating)Player.Listener.onTracksChanged
方法名称,但使用的是不同的参数类型。 - 更改了
DefaultTrackSelector.buildUponParameters
和DefaultTrackSelector.Parameters.buildUpon
以返回DefaultTrackSelector.Parameters.Builder
,而不是已废弃的DefaultTrackSelector.ParametersBuilder
。 - 添加了
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
(默认处于启用状态)。启用后,DefaultTrackSelector
会优先选用声道数不超过设备输出功能的音轨。在手持设备上,DefaultTrackSelector
会优先选用立体声/单声道,而非多声道音频格式,除非该多声道格式可以空间化(Android 12L 及更高版本)或属于杜比环绕声格式。此外,在支持音频空间化的设备上,DefaultTrackSelector
将监控空间化程序属性的变化,并在出现这些变化时触发新的音轨选择。具有television
界面模式的设备不受这些限制的约束,系统会优先选用声道数最多的格式。如需启用此功能,必须使用Context
构建DefaultTrackSelector
实例。
- 已将
- 视频:
- 已将
DummySurface
重命名为PlaceholderSurface
。 - 为
MediaCodecVideoRenderer.getCodecMaxInputSize
添加了 AV1 支持。
- 已将
- 音频:
- 使用宣传非标准 MIME 类型的 LG AC3 音频解码器。
- 将
AudioAttributes.getAudioAttributesV21()
的返回值类型从android.media.AudioAttributes
更改为新的AudioAttributesV21
封装容器类,以防止 ART 验证速度在级别低于 21 的 API 上变慢。 - 对平台(级别为 29 及以上的 API)进行查询,或在未设置格式声道数的情况(在启用 HLS 无块准备时会发生)下对音频透传的音频编码声道数进行假设 (10204)。
- 解码器输出为 12 声道 PCM 音频时使用声道掩码
AudioFormat.CHANNEL_OUT_7POINT1POINT4
来配置AudioTrack
(#10322)。
- DRM
- 确保格式更改后始终能够立即正确更新 DRM 会话 (10274)。
- 文本:
- 更改了
Player.getCurrentCues()
以返回CueGroup
,而不是List<Cue>
。 - SSA:支持
BorderStyle == 3
(即OutlineColour
设置 cue 文件的背景)时的OutlineColour
样式设置 (#8435)。 - CEA-708:将数据解析为多个服务块,并忽略与当前所选服务号码无关的块。
- 移除了过去仅用于处理 Google 内部字幕格式的
RawCcExtractor
。
- 更改了
- 提取器:
- 界面:
- 修复了
useController=false
时将事件传递给PlayerView
上设置的OnClickListener
的问题 (#9605)。此外,还修复了针对所有视图配置将事件传递给OnLongClickListener
的问题。 - 修复了将
ACTION_UP
之前退出PlayerView
边界的一系列触摸事件错误处理为点击的问题 (#9861)。 - 修复了点按操作可能会切换播放,而不是隐藏控件的
PlayerView
无障碍功能问题 (#8627)。 - 重写了
TrackSelectionView
和TrackSelectionDialogBuilder
,以使用Player
接口(而不是ExoPlayer
)。这样做将允许视图与其他Player
实现一起使用,并移除界面模块对 ExoPlayer 模块的依赖关系。这是一项重大变更。 - 不在
PlayerView
轨道选择器中显示强制文字轨道;如果选择了“None”,则保留一个合适的强制文字轨道 (#9432)。
- 修复了
- DASH:
- 解析了 DTS
AudioChannelConfiguration
元素中的声道数。这会为 DTS 流重新启用音频透传 (#10159)。 - 禁止将
null
传递给DashMediaSource.Factory.setCompositeSequenceableLoaderFactory
。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory
的实例。
- 解析了 DTS
- HLS:
- 如果播放列表 CODECS 属性不包含音频编解码器,则回退到分块准备 (#10065)。
- 禁止将
null
传递给HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
、HlsMediaSource.Factory.setPlaylistParserFactory
和HlsMediaSource.Factory.setPlaylistTrackerFactory
。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory
、DefaultHlsPlaylistParserFactory
或对DefaultHlsPlaylistTracker.FACTORY
的引用。
- 流畅的流式传输:
- 禁止将
null
传递给SsMediaSource.Factory.setCompositeSequenceableLoaderFactory
。如果需要,可以显式传递DefaultCompositeSequenceableLoaderFactory
的实例。
- 禁止将
- RTSP:
- 添加了适用于 H263 的 RTP 读取器 (#63)。
- 添加了适用于 MPEG4 的 RTP 读取器 (#35)。
- 添加了适用于 HEVC 的 RTP 读取器 (#36)。
- 添加了适用于 AMR 的 RTP 读取器。目前仅支持单声道非交错 AMR 流。不支持复合 AMR RTP 载荷。 (#46)。
- 添加了适用于 VP8 的 RTP 读取器 (#47)。
- 添加了适用于 WAV 的 RTP 读取器 (#56)。
- 修复了 RTSP 基本授权标头。 (#9544)。
- 停止检查必填 SDP 字段,因为 ExoPlayer 不需要这些字段 (#10049)。
- 解析 RTSP 时间时会抛出受检异常 (#10165)。
- 添加了适用于 VP9 的 RTP 读取器 (#47)。
- 添加了适用于 OPUS 的 RTP 读取器 (#53)。
- 数据源:
- 已将
DummyDataSource
重命名为PlaceholderDataSource
。 - 添加了 OkHttp 中断处理的解决方法。
- 已将
- 会话:
- 将
MediaSession.MediaItemFiller
替换为MediaSession.Callback.onAddMediaItems
,以允许异步解析请求。 - 当
MediaController
连接到旧版媒体会话时,支持setMediaItems(s)
方法。 - 移除了
MediaController.setMediaUri
和MediaSession.Callback.onSetMediaUri
。使用MediaController.setMediaItem
和MediaSession.Callback.onAddMediaItems
可实现相同的功能。 - 转发旧版
MediaController
调用,以便将媒体播放到MediaSession.Callback.onAddMediaItems
(而非onSetMediaUri
)。 - 添加了
MediaNotification.Provider
和DefaultMediaNotificationProvider
,以支持通知自定义。 - 添加了
BitmapLoader
和SimpleBitmapLoader
,用于下载海报图片。 - 添加了
MediaSession.setCustomLayout()
,以向后兼容旧版会话。 - 添加了
MediaSession.setSessionExtras()
,以提供与旧版会话相当的功能。 - 已将
MediaSession.MediaSessionCallback
重命名为MediaSession.Callback
,并将MediaLibrarySession.MediaLibrarySessionCallback
重命名为MediaLibrarySession.Callback
,将MediaSession.Builder.setSessionCallback
重命名为setCallback
。 - 修复了
MediaControllerImplLegacy
中的 NPE (#59)。 - 在时间轴发生更改时会更新会话位置 (#51)。
- 修复了释放控制器后
MediaControllerImplBase
中的 NPE (#74)。
- 将
- 广告播放/IMA:
- 将广告轮询频率从每 100 毫秒减少到每 200 毫秒,以便与美国媒体评定委员会 (MRC) 建议保持一致。
- FFmpeg 扩展程序:
- 将 CMake 版本更新为
3.21.0+
,以避免 CMake bug 导致 Android Studio 的 Gradle 同步失败 (#9933)。
- 将 CMake 版本更新为
- 移除了已废弃的符号:
- 移除了
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
。改用Player.Listener.onTracksChanged(Tracks)
。 - 移除了
Player.getCurrentTrackGroups
和Player.getCurrentTrackSelections
。改用Player.getCurrentTracks
。您也可以继续使用ExoPlayer.getCurrentTrackGroups
和ExoPlayer.getCurrentTrackSelections
,尽管这些方法已废弃。 - 移除了
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 Atom 的数据流 emsg 示例元数据可能会以错误的顺序输出的问题 (#9996)。
- 文本:
- 修复了
SingleSampleMediaSource.Factory.setTrackId
和MediaItem.SubtitleConfiguration.Builder.setId
的互动以优先处理SubtitleConfiguration
字段,如果未设置,回退到Factory
值 (#10016)。
- 修复了
- 广告播放:
- 修复了直播 HLS SSAI 数据流中广告时段之间的音频欠载问题。
版本 1.0.0-alpha02
2022 年 3 月 2 日
发布了 androidx.media3:media3-*:1.0.0-alpha02
。版本 1.0.0-alpha02 中包含这些提交内容。
这与 ExoPlayer 2.17.0 版本相对应。
- 核心库:
- 添加了受保护的方法
DefaultRenderersFactory.getCodecAdapterFactory()
,这样,替换buildVideoRenderers()
或buildAudioRenderers()
的DefaultRenderersFactory
子类就可以访问编解码器适配器工厂,并将其传递给它们创建的MediaCodecRenderer
实例。 - 将 ICY 标头字段
name
和genre
分别传播到MediaMetadata.station
和MediaMetadata.genre
,以便它们通过Player.Listener.onMediaMetadataChanged()
到达应用 (#9677)。 - 从
DefaultHttpDataSource#getResponseHeaders
中移除了 null 键。 - 在创建
MediaCodec
实例失败时会休眠并重试。这可解决在将 Surface 从一个安全的编解码器切换到另一个编解码器时,某些设备上会出现的问题 (#8696)。 - 添加了
MediaCodecAdapter.getMetrics()
以允许用户从MediaCodec
获取指标数据。(#9766)。 - 修复了 Maven 依赖项解析 (#8353)。
- 如果直播既没有低延迟功能也没收到要设置速度的用户请求,则停用直播的自动速度调整功能 (#9329)。
- 已将
DecoderCounters#inputBufferCount
重命名为queuedInputBufferCount
。 - 将
SimpleExoPlayer.renderers
设为了不公开。可通过ExoPlayer.getRenderer
访问渲染程序。 - 更新了一些
AnalyticsListener.EventFlags
常量值,以与Player.EventFlags
中的值匹配。 - 将
AnalyticsCollector
拆分为一个接口和默认实现,以允许它在不为应用所需时由 R8 去掉。
- 添加了受保护的方法
- 轨道选择:
- 支持在轨道选择中使用首选视频角色标志 (#9402)。
- 将视频轨道选择逻辑更新为:在选择多个视频轨道用于自适应调整时,考虑首选的 MIME 类型和角色标志 (#9519)。
- 将视频和音频轨道选择逻辑更新为:仅为解码器和硬件支持的级别相同的自适应选择项选择格式 (#9565)。
- 将视频轨道选择逻辑更新为:如果主要的硬件加速解码器支持多个编解码器,则优先选用效率较高的编解码器 (#4835)。
- 相较于技术轨道选择约束(例如,首选的 MIME 类型或频道数量上限),优先选用音频内容偏好设置(例如,“默认”音轨或某个与系统语言区域的语言相匹配的轨道)。
- 修复了以下轨道选择问题:替换一个轨道组不会停用同一类型的其他轨道组 (#9675)。
- 修复了以下轨道选择问题:同时存在非空和空轨道替换时无法正确应用 (#9649)。
- 禁止
TrackGroupArray
中有重复的TrackGroup
。始终可通过在TrackGroup
构造函数中设置id
而使TrackGroup
可区分开。这修复了以下问题:通过活跃轨道替换使应用转入后台再继续播放时会发生崩溃 (#9718)。 - 修正了
AdaptiveTrackSelection
中的逻辑,在网络带宽足够的情况下允许提高质量,即使播放质量已非常接近当时的极限时也是如此 (#9784)。
- 视频:
- 修复了杜比视界的解码器回退逻辑,以在需要时使用兼容的 H264/H265 解码器。
- 音频:
- 提取器:
- 文本:
- DRM:
- 从
DrmSessionManager.(pre)acquireSession
中移除了playbackLooper
。 当自定义的MediaSource
中的应用使用DrmSessionManager
时,需要改为将playbackLooper
传递给DrmSessionManager.setPlayer
。
- 从
- 广告播放/IMA:
- 添加了对 IMA 动态广告插播 (DAI) 的支持 (#8213)。
- 向
AdPlaybackState
中添加了一个允许重置广告组的方法,以便广告组可以再次播放 (#9615)。 - 在广告播放期间强制保持 1.0 的播放速度 (#9018)。
- 修复了以下问题:未能加载广告组导致播放立即重置 (#9929)。
- 界面:
- DASH:
- HLS:
- RTSP:
- 转换器:
- 将要求的最低 API 版本提高到 21。
TransformationException
现已用于描述转换期间发生的错误。- 添加了
TransformationRequest
以指定转换选项。 - 允许注册多个监听器。
- 修复了当读取了部分编解码器输出内容时转换器卡住的问题。
- 修复了在释放多路复用器抛出项时
Transformer.getProgress
中潜在的 NPE 问题。 - 添加了用于应用转换的演示版应用。
- MediaSession 扩展程序:
- 默认情况下,
MediaSessionConnector
现会在停止时清除播放列表。希望保留播放列表的应用可以在连接器上调用setClearMediaItemsOnStop(false)
。
- 默认情况下,
- Cast 扩展程序:
- FFmpeg 扩展程序:
- 让
build_ffmpeg.sh
依赖于 LLVM(而非 GNU)的 bin utils (#9933)。
- 让
- Android 12 兼容性:
- 将 Cast 扩展程序升级为依赖于
com.google.android.gms:play-services-cast-framework:20.1.0
。早期版本的play-services-cast-framework
与以 Android 12 为目标平台的应用不兼容,会在创建PendingIntent
时崩溃并产生IllegalArgumentException
(#9528)。
- 将 Cast 扩展程序升级为依赖于
- 移除了已废弃的符号:
- 移除了
Player.EventListener
。改用Player.Listener
。 - 移除了
MediaSourceFactory#setDrmSessionManager
、MediaSourceFactory#setDrmHttpDataSourceFactory
和MediaSourceFactory#setDrmUserAgent
。改用MediaSourceFactory#setDrmSessionManagerProvider
。 - 移除了
MediaSourceFactory#setStreamKeys
。改用MediaItem.Builder#setStreamKeys
。 - 移除了
MediaSourceFactory#createMediaSource(Uri)
。改用MediaSourceFactory#createMediaSource(MediaItem)
。 - 从
DashMediaSource
、HlsMediaSource
和SsMediaSource
中移除了setTag
。改用MediaItem.Builder#setTag
。 - 移除了
DashMediaSource#setLivePresentationDelayMs(long, boolean)
。使用MediaItem.Builder#setLiveConfiguration
和MediaItem.LiveConfiguration.Builder#setTargetOffsetMs
替换清单,或使用DashMediaSource#setFallbackTargetLiveOffsetMs
提供回退值。 - 移除了
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
。无法再选择停用线程强制执行。 - 移除了
ActionFile
和ActionFileUpgradeUtil
。使用 ExoPlayer 2.16.1 或更低版本,以利用ActionFileUpgradeUtil
将旧版操作文件合并到DefaultDownloadIndex
中。 - 移除了
ProgressiveMediaSource#setExtractorsFactory
。改用ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
构造函数。 - 移除了
ProgressiveMediaSource.Factory#setTag
和ProgressiveMediaSource.Factory#setCustomCacheKey
。改用MediaItem.Builder#setTag
和MediaItem.Builder#setCustomCacheKey
。 - 移除了
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
和DefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
构造函数。改用DefaultRenderersFactory(Context)
构造函数、DefaultRenderersFactory#setExtensionRendererMode
和DefaultRenderersFactory#setAllowedVideoJoiningTimeMs
。 - 移除了所有公开的
CronetDataSource
构造函数。改用CronetDataSource.Factory
。
- 移除了
- 将以下
IntDefs
更改为仅限@Target(TYPE_USE)
。这可能会破坏相应 Kotlin 代码的编译,解决方法是将注解更改为对类型 (Int
) 进行注解。@AacAudioObjectType
@Ac3Util.SyncFrameInfo.StreamType
@AdLoadException.Type
@AdtsExtractor.Flags
@AmrExtractor.Flags
@AspectRatioFrameLayout.ResizeMode
@AudioFocusManager.PlayerCommand
@AudioSink.SinkFormatSupport
@BinarySearchSeeker.TimestampSearchResult.Type
@BufferReplacementMode
@C.BufferFlags
@C.ColorRange
@C.ColorSpace
@C.ColorTransfer
@C.CryptoMode
@C.Encoding
@C.PcmEncoding
@C.Projection
@C.SelectionReason
@C.StereoMode
@C.VideoOutputMode
@CacheDataSource.Flags
@CaptionStyleCompat.EdgeType
@DataSpec.Flags
@DataSpec.HttpMethods
@DecoderDiscardReasons
@DecoderReuseResult
@DefaultAudioSink.OutputMode
@DefaultDrmSessionManager.Mode
@DefaultTrackSelector.SelectionEligibility
@DefaultTsPayloadReaderFactory.Flags
@EGLSurfaceTexture.SecureMode
@EbmlProcessor.ElementType
@ExoMediaDrm.KeyRequest.RequestType
@ExtensionRendererMode
@Extractor.ReadResult
@FileTypes.Type
@FlacExtractor.Flags
(在com.google.android.exoplayer2.ext.flac
软件包中)@FlacExtractor.Flags
(在com.google.android.exoplayer2.extractor.flac
软件包中)@FragmentedMp4Extractor.Flags
@HlsMediaPlaylist.PlaylistType
@HttpDataSourceException.Type
@IllegalClippingException.Reason
@IllegalMergeException.Reason
@LoadErrorHandlingPolicy.FallbackType
@MatroskaExtractor.Flags
@Mp3Extractor.Flags
@Mp4Extractor.Flags
@NotificationUtil.Importance
@PlaybackException.FieldNumber
@PlayerNotificationManager.Priority
@PlayerNotificationManager.Visibility
@PlayerView.ShowBuffering
@Renderer.State
@RendererCapabilities.AdaptiveSupport
@RendererCapabilities.Capabilities
@RendererCapabilities.DecoderSupport
@RendererCapabilities.FormatSupport
@RendererCapabilities.HardwareAccelerationSupport
@RendererCapabilities.TunnelingSupport
@SampleStream.ReadDataResult
@SampleStream.ReadFlags
@StyledPlayerView.ShowBuffering
@SubtitleView.ViewType
@TextAnnotation.Position
@TextEmphasisSpan.MarkFill
@TextEmphasisSpan.MarkShape
@Track.Transformation
@TrackOutput.SampleDataPart
@Transformer.ProgressState
@TsExtractor.Mode
@TsPayloadReader.Flags
@WebvttCssStyle.FontSizeUnit
版本 1.0.0-alpha01
2021 年 10 月 27 日
发布了 androidx.media3:media3-*:1.0.0-alpha01
。版本 1.0.0-alpha01 中包含这些提交内容。
新功能
Media3 是面向媒体支持库(包括 ExoPlayer)的新平台。首个 Alpha 版包含用于实现媒体用例的库的早期功能实现,包括:
- ExoPlayer - 一种适用于 Android 的应用级媒体播放器,可轻松自定义和扩展。
- 用于公开和控制播放的媒体会话功能。这一新的会话模块使用与 ExoPlayer 相同的
Player
接口。 - 用于构建媒体播放界面的界面组件。
- 其他库中用于 ExoPlayer 的模块封装功能,例如通过 IMA SDK 插入广告。
如需了解详情,请参阅 Media3 GitHub 项目。
之前,ExoPlayer 托管在单独的 ExoPlayer GitHub 项目中。在 Media3 中,其软件包名称为 androidx.media3.exoplayer
。我们计划在一段时间内继续维护和发布 ExoPlayer GitHub 项目,以便让应用有时间迁移到 Media3。Media3 取代了所有 ExoPlayer 模块,但旧版 media2 和 mediasession 扩展程序除外,后者已被新的 media3-session
模块取代。这可以实现播放器和媒体会话之间的直接集成,而无需使用适配器/连接器类。