Media3

媒体用例的支持库。
最新更新 稳定版本 候选版本 Beta 版本 Alpha 版本
2024 年 8 月 27 日 1.4.1 - - -

声明依赖项

要添加对 Media3 的依赖项,您必须将 Google Maven 存储库添加到您的项目中。阅读 Google 的 Maven 存储库 以了解更多信息。

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

Groovy

dependencies {
    def media3_version = "1.4.1"

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

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

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

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

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

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

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

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

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

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.4.1"

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

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

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

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

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

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

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

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

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

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
}

有关依赖项的更多信息,请参阅 添加构建依赖项.

反馈

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

版本 1.4.0

版本 1.4.1

2024 年 8 月 27 日

androidx.media3:media3-*:1.4.1 已发布。版本 1.4.1 包含 这些提交.

  • ExoPlayer
    • PreloadMediaSource 中异步处理预加载回调 (#1568).
    • 在加载失败时允许播放,无论缓冲持续时间如何 (#1571).
  • 提取器
    • MP3:通过基于 Info 帧中的长度字段正确忽略尾随的非 MP3 数据来修复 Searched too many bytes 错误 (#1480).
  • 文本
    • TTML:修复对百分比 tts:fontSize 值的处理,以确保它们从具有百分比 tts:fontSize 值的父节点正确继承。
    • 修复 LegacySubtitleUtil 中的 IndexOutOfBoundsException,原因是错误地处理了请求的输出开始时间大于或等于 Subtitle 中的最终事件时间的情况 (#1516).
  • DRM
    • 修复 API 31+ 设备上播放 L1 Widevine 内容时的 android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE 错误。此错误是由框架 MediaDrm.requiresSecureDecoder 方法的实现不完整引起的 (#1603).
  • 效果
    • GlObjectsProvider 添加 release() 方法。
  • 会话
    • KEYCODE_HEADSETHOOK 的双击转换为“跳转到下一个”操作,如 文档中所述 (#1493).
    • MediaButtonReceiver中,将KEYCODE_HEADSETHOOK视为“播放”命令,以决定是否忽略它,从而避免出现ForegroundServiceDidNotStartInTimeException (#1581).
  • RTSP 扩展
    • 在 SDP 解析过程中跳过无效的媒体描述 (#1087).

版本 1.4.0

2024 年 7 月 25 日

androidx.media3:media3-*:1.4.0 已发布。版本 1.4.0 包含这些提交

  • 通用库
    • 将假定的无操作查找调用转发到受保护的BasePlayer.seekTo()SimpleBasePlayer.handleSeek() 方法,而不是忽略它们。如果您正在自定义播放器中实现这些方法,您可能需要使用 mediaItemIndex == C.INDEX_UNSET 处理这些额外的调用。
    • 删除对增强版 Java 8 反糖的编译依赖项 (#1312).
    • 确保传递给 MediaItem.Builder.setImageDurationMs() 的持续时间对于非图像 MediaItem 被忽略(如文档所述)。
    • 添加 Format.customData 以存储应用程序提供的关于 Format 实例的自定义信息。
  • ExoPlayer
    • 添加 BasePreloadManager,它根据其 rankingData 定义的优先级协调多个来源的预加载。可以通过扩展此类进行自定义。添加 DefaultPreloadManager,它使用 PreloadMediaSource 将来源的媒体样本预加载到内存中,并使用一个整数 rankingData,它指示 UI 上项目的索引。
    • PlayerId 添加到 LoadControl 的大多数方法,以使 LoadControl 实现能够支持多个播放器。
    • 删除 Buffer.isDecodeOnly()C.BUFFER_FLAG_DECODE_ONLY。无需设置此标志,因为渲染器和解码器将根据时间戳决定跳过缓冲区。自定义 Renderer 实现应该检查缓冲区时间是否至少为 BaseRenderer.getLastResetPositionUs(),以决定是否应该显示样本。自定义 SimpleDecoder 实现可以检查 isAtLeastOutputStartTimeUs()(如果需要)或用 DecoderOutputBuffer.shouldBeSkipped 标记其他缓冲区以跳过它们。
    • 允许 TargetPreloadStatusControl.getTargetPreloadStatus(T) 返回空值,以指示不要预加载具有给定 rankingDataMediaSource
    • remove(MediaSource) 添加到 BasePreloadManager
    • reset() 添加到 BasePreloadManager,以释放所有保持的来源,同时保留预加载管理器实例。
    • 添加 ExoPlayer.setPriority()(以及 Builder.setPriority())以定义在 PriorityTaskManager 中使用和从 API 35 开始的 MediaCodec 重要性的优先级值。
    • 修复了更新上次重新缓冲时间的错误,导致 CMCD 中的 bs(缓冲区饥饿)键不正确 (#1124).
    • 添加 PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource),以指示来源已加载到末尾。这允许 DefaultPreloadManager 和自定义 PreloadMediaSource.PreloadControl 实现预加载下一个来源或采取其他操作。
    • 修复了在项目末尾跳过静音会导致播放异常的错误。
    • clear 添加到 PreloadMediaSource,以丢弃预加载时间段。
    • 添加新的错误代码 PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED,当为优先级更高的任务回收编解码器资源时使用。
    • 允许 AdsMediaSource 在初始内容媒体准备完成之前加载前贴广告 (#1358).
    • 修复了在原始时间段已从清单中移除后重新准备多时间段 DASH 直播流时,播放移至 STATE_ENDED 的错误。
    • onTimelineRefreshed() 重命名为 onSourcePrepared(),将 onPrepared() 重命名为 onTracksSelected(),位于 PreloadMediaSource.PreloadControl 中。相应地重命名 DefaultPreloadManager.Stage 中的 IntDefs。
    • 添加对动态调度的实验性支持,以更好地将工作与 CPU 唤醒周期对齐,并将唤醒延迟到渲染器可以进行时。您可以在设置 ExoPlayer 实例时使用 experimentalSetDynamicSchedulingEnabled() 启用此功能。
    • 添加 Renderer.getDurationToProgressUs()。一个 Renderer 可以实现此方法以返回到 ExoPlayer 渲染器要进行的播放必须前进的持续时间。如果 ExoPlayer 设置为 experimentalSetDynamicSchedulingEnabled(),则 ExoPlayer 会在计算调度工作任务的时间时调用此方法。
    • 添加 MediaCodecAdapter#OnBufferAvailableListener,以在 MediaCodecRenderer 可使用输入和输出缓冲区时发出警报。 MediaCodecRenderer 在收到这些回调时会向 ExoPlayer 发出信号,如果 ExoPlayer 设置为 experimentalSetDynamicSchedulingEnabled(),则 ExoPlayer 会安排其工作循环,因为渲染器可以取得进展。
    • 使用数据类代替单个参数,用于 LoadControl 方法。
    • 添加 ExoPlayer.isReleased() 以检查是否已调用 Exoplayer.release()
    • 添加 ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() 以配置 seekToPrevious() 将其查找到上一个项目的最大位置 (#1425).
    • 修复了一些音频焦点不一致,例如,在播放器暂停时未报告完全或短暂焦点丢失 (#1436).
    • 修复了在提取器在初始准备步骤之后报告了额外的轨道导致的潜在 IndexOutOfBoundsException (#1476).
    • EffectsExoPlayer.setVideoEffect() 中将接收已移除渲染器偏移的时间戳 (#1098).
    • 修复了在处理提前读取到另一个播放列表项目中的播放器错误时,可能导致的潜在 IllegalArgumentException (#1483).
  • 转换器
    • audioConversionProcessvideoConversionProcess 添加到 ExportResult,以指示输出文件中的相应轨道是如何生成的。
    • 放松修剪优化 H.264 等级检查。
    • 添加对在序列中更改 SDR 和 HDR 输入媒体的支持。
    • 添加对合成级音频效果的支持。
    • 添加对将超高清 HDR 图像转换为 HDR 视频的支持。
    • 修复了 DefaultAudioMixer 在重置和重复使用后未输出正确字节数的问题。
    • 解决了解码器错误,在处理 PCM 输入时,音频通道数限制为立体声。
    • ExoPlayerAssetLoader 中选择轨道时,忽略音频通道数量约束,因为它们仅适用于播放。
    • androidx.media3.muxer.Muxer 替换 androidx.media3.transformer.Muxer 接口,并删除 androidx.media3.transformer.Muxer
    • 修复了从内容 URI 方案加载 HEIC 图像的问题。 (#1373).
    • 调整 AudioGraphInput 中的音频轨道持续时间以改善 AV 同步。
    • 删除 ExportResult.processedInputs 字段。如果您将此字段用于编解码器详细信息,请改用 DefaultDecoderFactory.listener。在编解码器异常的情况下,编解码器详细信息将在 ExportException.codecInfo 中提供。
  • 提取器
    • MPEG-TS:向前推进更改,通过将流的最后一个访问单元传递给样本队列来确保渲染最后一帧 (#7909)。合并了修复程序,以解决在仅 I 帧 HLS 流 (#1150) 和 H.262 HLS 流 (#1126) 中出现的错误。
    • MP3:优先考虑 Info 帧中的数据大小,而不是底层流报告的大小(例如文件大小或 HTTP Content-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 规范指出,无论流中是否存在值,都应假设 rowLockcolumnLock 都为真(columnLock 支持未实现,因此实际上始终假设为假)。
      • 这最初包含在 1.3.0-alpha01 版本说明中,但更改在 1.3.0-rc01 版本发布之前意外回滚。现在已修复,因此更改再次出现。
    • CEA-708:避免 ExoPlayer 对“设置笔位置”命令的简单处理添加重复的换行符(#1315)。
    • 修复当 WebVTT 字幕样本不包含提示(例如作为 DASH 流的一部分)时,LegacySubtitleUtil 中的 IllegalArgumentException#1516)。
  • 元数据
    • 修复 MP4 到 ID3 排序标签的映射。以前,'专辑排序'(soal)、'艺术家排序'(soar)和 '专辑艺术家排序'(soaa)MP4 标签被错误地映射到 TSO2TSOATSOP ID3 标签(#1302)。
    • 修复当值为多个字节时,读取 MP4(/iTunes) 数字 gnre(流派)和 tmpo(速度)标签。
    • 将 ID3 TCON 帧传播到 MediaMetadata.genre#1305)。
  • 图像
    • 添加对非正方形 DASH 缩略图网格的支持(#1300)。
    • 添加对 API 34+ 的 AVIF 的支持。
    • 允许将 null 作为参数传递给 ExoPlayer.setImageOutput() 以清除先前设置的 ImageOutput
  • 数据源
    • 实现对 android.resource://package/id 原始资源 URI 的支持,其中 package 与当前应用程序的包不同。这以前没有记录为有效,但它是访问另一个包中资源的比按名称更有效的方式。
    • DataSpec 构造函数中,尽早检查 url 是否不为空。此参数已标注为非空。
    • 允许 ByteArrayDataSourceopen() 期间将 URI 解析为字节数组,而不是在构造时硬编码(#1405)。
  • DRM
    • 允许在 DefaultDrmSessionManagerProvider 上设置 LoadErrorHandlingPolicy#1271)。
  • 效果
    • 支持在 SpeedChangeEffect 中的相同 EditedMediaItemComposition 内进行多次速度更改。
    • 支持从超 HDR 位图输入输出 HLG 和 PQ。
    • 添加对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,这在 ExoPlayer.setVideoEffect 和 Transformer 的调试 SurfaceView 中改进了 HLG 表面输出。
    • 更新覆盖矩阵实现,使其通过翻转在 setOverlayFrameAnchor() 中应用的 x 和 y 值来与文档保持一致。如果使用 OverlaySettings.Builder.setOverlayFrameAnchor(),请将它们的 x 和 y 值翻转,方法是将它们乘以 -1
    • 修复当与 ExoPlayer#setVideoEffects 一起使用时,TimestampWrapper 会崩溃的错误(#821)。
    • 将默认的 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。还提供第三个选项以保留原始颜色空间。
    • 允许定义 EditedMediaItemSequences 的不确定 z 顺序(#1055)。
    • 在不同的 HDR 内容片段中保持一致的亮度范围(使用 HLG 范围)。
    • 添加对 HDR 内容上的超 HDR(位图)覆盖的支持。
    • 允许在 API 26 之前使用 SeparableConvolution 效应。
    • 删除未使用的 OverlaySettings.useHdr,因为覆盖和帧的动态范围必须匹配。
    • 添加对 TextOverlay 的 HDR 支持。可以使用 OverlaySettings.Builder.setHdrLuminanceMultiplier() 调整文本覆盖的亮度。
  • IMA 扩展
    • 将应用播放 DAI 广告流 所需的 API 提升为稳定状态。
    • 添加 replaceAdTagParameters(Map <String, String>)ImaServerSideAdInsertionMediaSource.AdLoader,允许在运行时替换广告标签参数。
    • 修复在广告播放期间发生播放器错误时,未调用 VideoAdPlayer.VideoAdPlayerCallback.onError() 的错误(#1334)。
    • 将 IMA SDK 版本更新为 3.33.0,以修复使用 data:// 广告标签 URI 时出现的 NullPointerException#700)。
  • 会话
    • CommandButton.enabled 的默认值更改为 true,并确保即使关联的命令可用,该值也可以保持为 false,用于控制器。
    • 添加用于 CommandButton 的图标常量,应使用这些常量而不是自定义图标资源。
    • 添加 MediaSessionService.isPlaybackOngoing(),让应用查询服务是否需要在 onTaskRemoved() 中停止(#1219)。
    • 添加 MediaSessionService.pauseAllPlayersAndStopSelf(),它方便地允许暂停所有会话的播放,并调用 stopSelf() 来终止 MediaSessionService 的生命周期。
    • 覆盖 MediaSessionService.onTaskRemoved(Intent) 以提供一个安全的默认实现,如果播放正在进行,则使服务保持在前景,否则停止服务。
    • 通过不在平台会话元数据中设置持续时间来隐藏直播流的媒体通知中的进度条(#1256)。
    • 对齐 MediaMetadataMediaDescriptionCompat 的转换,以在选择元数据属性时使用与 media1 中相同的首选顺序和逻辑。
    • 添加 MediaSession.sendError(),允许向 Media3 控制器发送非致命错误。当使用通知控制器(参见 MediaSession.getMediaNotificationControllerInfo())时,自定义错误用于将平台会话的 PlaybackState 更新为具有给定错误信息的错误状态(#543)。
    • 添加 MediaSession.Callback.onPlayerInteractionFinished() 以通知会话来自特定控制器的播放器交互序列何时完成。
    • 添加 SessionError 并将其用于 SessionResultLibraryResult,而不是错误代码,以提供有关错误的更多信息以及如何解决错误(如果可能)。
    • 发布媒体 3 控制器测试应用程序的代码,该应用程序可用于测试与发布媒体会话的应用程序的交互。
    • 将传递给 media3 的 MediaSession[Builder].setSessionExtras() 的额外信息传播到 media1 控制器的 PlaybackStateCompat.getExtras()
    • 将致命错误和非致命错误映射到平台会话,并从平台会话映射到致命错误和非致命错误。将 PlaybackException 映射到 PlaybackStateCompat 的致命错误状态。将 SessionError 使用 MediaSession.sendError(ControllerInfo, SessionError) 发送到媒体通知控制器,将映射到 PlaybackStateCompat 中的非致命错误,这意味着错误代码和消息已设置,但平台会话的状态仍然不同于 STATE_ERROR
    • 允许每个控制器设置会话活动以覆盖全局会话活动。可以在连接时通过创建具有 AcceptedResultBuilder.setSessionActivivty(PendingIntent)ConnectionResult 来为控制器定义会话活动。连接后,可以使用 MediaSession.setSessionActivity(ControllerInfo, PendingIntent) 更新会话活动。
    • 改进对 MediaLibrarySession.Callback 的调用的错误复制。现在可以通过使用 MediaLibrarySession.Builder.setLibraryErrorReplicationMode() 来配置错误复制,以选择错误类型或选择退出错误复制(默认情况下为开启)。
  • UI
    • 当连接到 ExoPlayer 时,将图像显示支持添加到 PlayerView#1144)。
    • 通过 xml 属性自定义 PlayerControlView 中的各种图标,以允许每个 PlayerView 实例使用不同的可绘制对象,而不是全局覆盖(#1200)。
    • 解决在 API 34 上的 Compose AndroidView 内使用 SurfaceView 时导致视频拉伸/裁剪的平台错误(#1237)。
  • 下载
    • 确保 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 样本以不正确的偏移量委托,导致 IndexOutOfBoundsExceptionIllegalArgumentException 的错误(#1002)。
    • 修复非主要播放列表对 LL-HLS 流保持重新加载的错误(#1240)。
    • 修复为具有初始化段的 HLS 启用 CMCD 会导致 Source ErrorIllegalArgumentException 的错误。
    • 修复了在直播播放期间未刷新非主播放列表的错误 (#1240).
    • 修复了为 HLS 直播流启用 CMCD 会导致 ArrayIndexOutOfBoundsException 的错误 (#1395).
  • DASH 扩展
    • 修复了重新准备多时段直播流可能会抛出 IndexOutOfBoundsException 的错误 (#1329).
    • 添加对 dashif:Laurl 许可证 URL 的支持 (#1345).
  • Cast 扩展
    • 修复了将 MediaQueueItem 的专辑标题转换为 Media3 媒体项目中的艺术家信息的错误 (#1255).
  • 测试工具
    • FakeRenderer 中实现 onInit()onRelease()
    • TestPlayerRunHelper.runUntil()/playUntil() 方法更改为在非致命错误时失败(例如报告给 AnalyticsListener.onVideoCodecError() 的错误)。使用新的 TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() 方法链来禁用此行为。
  • 演示应用
    • 在简短形式的演示应用中使用 DefaultPreloadManager
    • 允许使用命令行中的 Intent 参数设置重复模式 (#1266).
    • 当设备支持时,使用 HttpEngineDataSource 作为 HttpDataSource
  • 移除弃用的符号
    • 移除 CronetDataSourceFactory。使用 CronetDataSource.Factory 代替。
    • 移除一些 DataSpec 构造函数。使用 DataSpec.Builder 代替。
    • DefaultHttpDataSourceOkHttpDataSourceCronetDataSource 中移除 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.DUMMYgetDummyDrmSessionManager() 方法。使用 DrmSessionManager.DRM_UNSUPPORTED 代替。
    • 移除 AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)AudioRendererEventListener.onAudioInputFormatChanged(Format)VideoRendererEventListener.onVideoInputFormatChanged(Format)。使用带有 DecoderReuseEvaluation 的重载方法代替。
    • 移除 RendererSupport.FormatSupport IntDef 和 FORMAT_HANDLEDFORMAT_EXCEEDS_CAPABILITIESFORMAT_UNSUPPORTED_DRMFORMAT_UNSUPPORTED_SUBTYPEFORMAT_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
    • 修复了 PreloadMediaPeriod 在再次预加载时无法保留流的问题。
    • 在轨道重新选择中将正确的相应 TrackSelectionResult 应用于播放时段。
    • 在媒体项目之间转换时,仅在推进播放时段之后才启动提前启用的渲染器 (#1017).
    • DefaultVideoFrameProcessor.Factory.Builder.build() 添加缺失的返回类型到 proguard -keepclasseswithmembers 规则 (#1187).
  • 转换器
    • 添加解决方法以解决由于 MediaMuxer 在 API 30 之前不支持负表示时间戳而导致的异常。
  • 轨道选择
    • DefaultTrackSelector:优先考虑具有“合理”帧率(>=10fps)的视频轨道,而不是具有较低或未设置帧率的轨道。这确保播放器在从包含两个 HEVC 轨道的运动照片中提取的 MP4 中选择“真实”视频轨道,其中一个轨道具有更高的分辨率,但帧数非常少 (#1051).
  • 提取器
    • 修复了从 WAV 文件读取奇数大小的块时跳过填充的问题 (#1117).
    • MP3:从元数据帧(例如 XINGVBRI)填充 Format.averageBitrate
    • MPEG-TS:恢复旨在通过将流的最后一个访问单元传递到样本队列来确保渲染最后一帧的更改 (#7909). 这是由于更改导致了仅包含 I 帧的 HLS 流 (#1150) 和 H.262 HLS 流 (#1126) 的新问题。
  • 音频
    • 允许通过在卸载模式下音频轨道初始化失败时禁用卸载来恢复渲染器。
  • 视频
    • 添加解决方法以解决 Galaxy Tab S7 FE、Chromecast with Google TV 和 Lenovo M10 FHD Plus 上的设备问题,该问题导致 60fps H265 流被标记为不支持。
    • 添加解决方法以确保即使设备没有像 API 所要求的那样自动执行此操作,在隧道传输期间也能始终渲染第一帧 (#1169). (#966).
    • 修复了 HDR 颜色信息处理导致编解码器行为错误并阻止 SDR 视频轨道自适应格式切换的问题 (#1158).
  • 文本
    • WebVTT:防止直接连续的提示从 WebvttParser.parse 创建虚假额外的 CuesWithTiming 实例 (#1177).
  • DRM
    • 解决一些 Android 14 设备上 MediaDrm 框架抛出的 NoSuchMethodError,而不是 ResourceBusyExceptionNotProvisionedException (#1145).
  • 效果
    • 通过转换颜色空间改进 PQ 到 SDR 的色调映射。
  • 会话
    • 修复了控制器替换当前项目时当前位置跳回的问题 (#951).
    • 修复了仅包含非空 extrasMediaMetadata 未在媒体控制器和会话之间传输的问题 (#1176).
  • UI
    • 如果 Locale 无法识别显示名称,则回退以包含音频轨道语言名称 (#988).
  • DASH 扩展
    • 将清单中的所有 Label 元素填充到 Format.labels 中 (#1054).
  • RTSP 扩展
    • 在 SDP 解析中跳过空会话信息值(i 标记)(#1087).
  • 编解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • 默认情况下禁用 MIDI 扩展作为本地依赖项,因为它需要配置额外的 Maven 存储库。需要从本地依赖项中使用此模块的用户 可以重新启用它

版本 1.3.0

2024 年 3 月 6 日

androidx.media3:media3-*:1.3.0 已发布。版本 1.3.0 包含 这些提交

  • 通用库
    • 实现对 android.resource://package/[type/]name 原始资源 URI 的支持,其中 package 与当前应用程序的包不同。这始终记录为可以工作,但直到现在才正确实现。
    • 将应用代码设置或从媒体读取的 MIME 类型标准化为全部小写。
    • AdPlaybackState 中使用完整的 MediaItem 来定义广告,而不是单个 Uri
    • minSdk 提高到 19(Android KitKat)。这与 所有其他 AndroidX 库保持一致,并且是我们升级到最新版本的 AndroidX 依赖项所必需的。
    • 当至少一个非空时,在 MediaMetadata.Builder.populate(MediaMetadata) 中填充 artworkUriartworkData (#964).
  • ExoPlayer
    • 添加 PreloadMediaSourcePreloadMediaPeriod,允许应用在播放之前以特定起始位置预加载内容媒体源。 PreloadMediaSource 负责准备内容媒体源以接收 Timeline,准备和缓存给定起始位置的时段,选择轨道并加载时段的媒体数据。应用通过实现 PreloadMediaSource.PreloadControl 来控制预加载进度,并将预加载的源设置为播放器的播放。
    • 添加 ExoPlayer.setImageOutput,允许应用设置 ImageRenderer.ImageOutput
    • DefaultRenderersFactory 现在默认情况下为播放器提供 ImageRenderer,带有空 ImageOutputImageDecoder.Factory.DEFAULT
    • 当跳过静音时,发出 Player.Listener.onPositionDiscontinuity 事件 (#765).
    • 添加对在提取期间解析字幕的实验性支持。可以使用 MediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 启用此功能。
    • 支持具有 PreloadMediaSource 的自适应媒体源。
    • 实现 HttpEngineDataSource,一个使用 HttpEngine API 的 HttpDataSource
    • 防止子类化 CompositeSequenceableLoader。此组件 以前是可扩展的,但从未在库内进行子类化。可以通过使用 装饰器模式 包装实例并实现自定义 CompositeSequenceableLoaderFactory 来完成自定义。
    • 修复了重复相同时间会导致该项目的元数据被清除的问题 (#1007).
    • BundledChunkExtractor.FactoryDefaultHlsExtractorFactory 上的 experimentalSetSubtitleParserFactory 方法重命名为 setSubtitleParserFactory,并禁止传递 null。使用新的 experimentalParseSubtitlesDuringExtraction(boolean) 方法来控制解析行为。
    • 添加支持自定义提取期间使用的 SubtitleParser.Factory。这可以通过 MediaSource.Factory.setSubtitleParserFactory() 实现。
    • 将源前缀添加到从 MergingMediaSource 生成的所有 Format.id 字段。这有助于识别哪个源产生了 Format (#883).
    • 通过修改正则表达式以仅检查连字符来修复用于验证自定义通用媒体客户端数据 (CMCD) 键名的正则表达式 (#1028).
    • 停止对 CMCD 查询参数进行双重编码 (#1075).
  • 转换器
    • 添加对扁平化 H.265/HEVC SEF 慢动作视频的支持。
    • 提高转码速度,特别是对于“删除视频”编辑。
    • 添加 API 以确保输出文件从视频帧开始。这可以使修剪操作的输出更兼容那些在视频帧的呈现时间戳之前不显示第一帧的播放器实现 (#829).
    • 添加对优化单个资产 MP4 修剪操作的支持。
    • 添加支持以确保视频帧在输出文件中具有第一个时间戳。修复了在基于 iOS 的播放器上输出文件以黑帧开头的问题 (#829).
  • 轨道选择
    • 添加 DefaultTrackSelector.selectImageTrack 以启用图像轨道选择。
    • 添加 TrackSelectionParameters.isPrioritizeImageOverVideoEnabled 以确定如果图像轨道和视频轨道都可用时是否选择图像轨道。默认值为 false,这意味着优先选择视频轨道。
  • 提取器
    • 向 MP4 提取器添加额外的 AV1C 解析以检索 ColorInfo.colorSpaceColorInfo.colorTransferColorInfo.colorRange 值 (#692).
    • MP3:对于具有 Info 标头的文件(Xing 标头的 CBR 等效项),使用恒定比特率 (CBR) 查找。之前我们使用 Info 标头中的查找表,但这会导致查找精度低于忽略它并假设文件是 CBR 的情况。
    • MPEG2-TS:添加 DTS、DTS-LBR 和 DTS:X Profile2 支持 (#275).
    • 从 TS 描述符中提取音频类型并将其映射到角色标志,允许用户做出更明智的音频轨道选择 (#973).
  • 音频
    • 使用平滑的音量斜坡改进静音跳过算法;保留了最小的静音和更自然的静音持续时间 (#7423).
    • 更确定地报告跳过的静音 (#1035).
  • 视频
    • 更改接收 VideoFrameProcessor.Factory 参数的 MediaCodecVideoRenderer 构造函数,并将其替换为接收 VideoSinkProvider 参数的构造函数。想要注入自定义 VideoFrameProcessor.Factory 的应用程序可以实例化一个使用自定义 VideoFrameProcessor.FactoryCompositingVideoSinkProvider,并将视频接收器提供者传递给 MediaCodecVideoRenderer
  • 文本
    • 修复位图提示的序列化以解决在使用 DefaultExtractorsFactory.setTextTrackTranscodingEnabled 时出现的 Tried to marshall a Parcel that contained Binder objects 错误 (#836).
    • CEA-708:忽略 rowLock 值。CEA-708-E S-2023 规范指出,无论流中是否存在值,都应假设 rowLockcolumnLock 都为真(columnLock 支持未实现,因此实际上始终假设为假)。
  • 图像
    • 添加对 DASH 缩略图的支持。网格图像被裁剪,单个缩略图在接近其呈现时间时被提供给 ImageOutput
  • 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
    • 修复了在直播流的 LiveConfiguration.min/maxOffset 范围之外手动查找会一直将偏移量调整回 min/maxOffset 的问题。
    • 修复了 OPUS 和 VORBIS 通道布局对于 3、5、6、7 和 8 个通道不正确的问题 (#8396).
    • 修复了在直播流中查找至零后,轨道选择会错误地让流从其默认位置开始的问题 (#9347).
    • 修复了 CmcdData.Factory 的新实例从块源接收 bufferedDurationUs 的负值,导致 IllegalArgumentException 的问题 (#888).
  • 转换器
    • 解决了一个问题,该问题导致编码器在配置时由于设置了较高的运行速率而抛出异常。
  • 提取器
    • 将 JPEG 动态照片中的辅助(不可播放)HEVC 轨道标记为 ROLE_FLAG_ALTERNATE,以防止它们由于其更高的分辨率而被自动选择用于播放。
    • 修复了 TS H264 流的关键帧检测错误 (#864).
    • 修复了时长超过 47721 秒的 TS 流的时长估计问题 (#855).
  • 音频
    • 修复了 SilenceSkippingAudioProcessor 在被多次调用时处理 EOS 的问题 (#712).
  • 视频
    • 为 Galaxy Tab S7 FE、Chromecast 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 错误。该错误是由于错误地使用安全解码器播放清除内容导致的。
  • 会话
    • MediaMetadataCompat 中的自定义键和值放入 MediaMetadata.extras,并将 MediaMetadata.extras 放入 MediaMetadataCompat (#756, #802).
    • 修复了为旧版控制器广播 notifyChildrenChanged 的问题 (#644).
    • 修复了在某些设备上设置通知的已禁用 setWhen 计时器的负时间会导致崩溃的问题 (#903).
    • 修复了当媒体通知控制器在请求第一个通知更新时尚未完成连接时出现的 IllegalStateException (#917).
  • UI
    • 修复了在使用 Material Design 在 BottomSheetDialogFragment 中使用时,前进和后退按钮不可见的问题 (#511).
    • 修复了 PlayerControlView 的快进按钮中的数字对齐错误的问题 (#547).
  • DASH 扩展
    • 在 DASH 清单中将“f800”解析为 Dolby 的通道数为 5 (#688).
  • 编解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • MIDI:修复了向前查找会跳过程序更改事件的问题 (#704).
    • 迁移到 FFmpeg 6.0 并将支持的 NDK 更新为 r26b (#707, #867).
  • 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 兼容性问题,其中可空泛型类型参数和可空数组元素类型未被检测为可空。例如,TrackSelectorResultSimpleDecoder 方法参数 (#6792).
    • 更改 Util.shouldShowPlayButton 中的默认 UI 和通知行为,以便在播放暂时被抑制时(例如,由于短暂的音频焦点丢失)显示“播放”按钮。可以通过使用 PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) 来保留旧的行为 (#11213).
    • androidx.annotation:annotation-experimental 升级到 1.3.1 以修复 https://issuetracker.google.com/251172715。
    • ExoPlayer.setAudioAttributes 移动到 Player 接口。
  • ExoPlayer
    • 修复了 AC4 流中由于未正确识别仅解码样本而导致的查找问题 (#11000).
    • 添加了在不合适的音频输出设备(例如,Wear OS 设备上的内置扬声器)上抑制播放的功能,当通过 ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput 启用此功能时。如果在没有合适的音频输出的情况下尝试播放,或者在播放期间所有合适的输出都断开连接,则播放抑制原因将更新为 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT。当连接了合适的输出时,将删除抑制原因。
    • 添加 MediaSource.canUpdateMediaItemMediaSource.updateMediaItem 以接受通过 Player.replaceMediaItem(s) 在创建后接受 MediaItem 更新。
    • 允许通过 Player.replaceMediaItem(s) 为库提供的全部 MediaSource 类更新 MediaItem (#33, #9978)。
    • MimeTypes.TEXT_EXOPLAYER_CUES 重命名为 MimeTypes.APPLICATION_MEDIA3_CUES
    • 添加 PngExtractor,它将整个 PNG 文件作为单个样本发送到并读取到 TrackOutput 中。
    • SequenceableLoader 接口中的 SequenceableLoader.continueLoading(long) 方法增强为 SequenceableLoader.continueLoading(LoadingInfo loadingInfo)。除了现有的 playbackPositionUs 外,LoadingInfo 还包含其他参数,包括 playbackSpeedlastRebufferRealtimeMs
    • ChunkSource 接口中的 ChunkSource.getNextChunk(long, long, List, ChunkHolder) 方法增强为 ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
    • 向通用媒体客户端数据 (CMCD) 日志添加其他字段:缓冲区饥饿 (bs)、截止日期 (dl)、播放速率 (pr) 和启动 (su) (#8699)。
    • ColorInfo 添加亮度和色度位深 (#491)。
    • 向通用媒体客户端数据 (CMCD) 日志添加其他字段:下一个对象请求 (nor) 和下一个范围请求 (nrr) (#8699)。
    • 添加使用查询参数传输通用媒体客户端数据 (CMCD) 数据的功能 (#553)。
    • 修复 ExperimentalBandwidthMeter 中的 ConcurrentModificationException (#612)。
    • CompositeMediaSource.getMediaTimeForChildMediaTime 添加 MediaPeriodId 参数。
    • ConcatenatingMediaSource2 中支持 ClippingMediaSource(以及其他具有周期/窗口时间偏移的源)(#11226)。
    • 更改 BaseRenderer.onStreamChanged() 以便也接收 MediaPeriodId 参数。
  • 转换器
    • 解析图像输入的 EXIF 旋转数据。
    • 移除 TransformationRequest.HdrMode 注释类型及其关联的常量。改用 Composition.HdrMode 及其关联的常量。
    • 简化 OverlaySettings 以修复旋转问题。
    • SampleConsumer.queueInputBitmapframeRatedurationUs 参数更改为 TimestampIterator
  • 轨道选择
    • 添加 DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness 以明确允许或禁止非无缝适应。默认情况下,它仍然保持当前的行为 true
  • 提取器
    • MPEG-TS:通过将流的最后一个访问单元传递给样本队列来确保渲染最后一个帧 (#7909)。
    • 修复确定 rotationDegrees 时的拼写错误。将 projectionPosePitch 更改为 projectionPoseRoll (#461)。
    • 移除对 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,其中包含 isFormatSupportedisGaplessSupportedisSpeedChangeSupported
    • 添加 AudioSink.setOffloadMode(),通过它配置音频接收器的卸载配置。默认值为 AudioSink.OFFLOAD_MODE_DISABLED
    • 卸载可以通过 TrackSelectionParameters 中的 setAudioOffloadPreference 来启用。如果设置的偏好是启用,设备支持格式的卸载,并且轨道选择是单个音频轨道,那么将启用音频卸载。
    • 如果 audioOffloadModePreference 设置为 AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED,那么 DefaultTrackSelector 将只选择音频轨道,并且只有在该轨道的格式在卸载中受支持的情况下才会选择。如果没有任何音频轨道在卸载中受支持,那么将不会选择任何轨道。
    • 由于轨道转换后播放位置问题,在 API 等级 33 之前禁用卸载的无缝支持。
    • DefaultRenderersFactory.buildAudioSink 方法签名中移除参数 enableOffload
    • 移除方法 DefaultAudioSink.Builder.setOffloadMode
    • 移除 intdef 值 DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
    • 添加对卸载播放期间的 Opus 无缝元数据的支持。
    • 允许通过在第一次写入失败时禁用卸载来恢复接收器 (#627)。
    • 默认情况下,为仅音频卸载播放启用卸载调度。
    • 删除 ExoPlayer.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
    • onExperimentalSleepingForOffloadChanged 重命名为 onSleepingForOffloadChanged,将 onExperimentalOffloadedPlayback 重命名为 onOffloadedPlayback
    • 将音频卸载模式相关的 TrackSelectionParameters 接口和定义移动到内部 AudioOffloadPreferences 类。
    • AnalyticsListenerAudioRendererEventListenerAudioSink.Listener 添加 onAudioTrackInitializedonAudioTrackReleased 回调。
    • 修复 DTS Express 音频缓冲区下溢问题 (#650)。
    • 修复 E-AC3-JOC 的功能检查抛出 IllegalArgumentException 的错误 (#677)。
  • 视频
    • 允许 MediaCodecVideoRenderer 使用自定义的 VideoFrameProcessor.Factory
    • 修复如果音频流以负时间戳开头,则无法渲染第一帧的错误 (#291)。
  • 文本
    • 移除 ExoplayerCuesDecoder。现在,sampleMimeType = application/x-media3-cues 的文本轨道由 TextRenderer 直接处理,而不需要 SubtitleDecoder 实例。
  • 元数据
    • 对于“仅解码”样本,MetadataDecoder.decode 将不再被调用,因为实现必须始终返回 null。
  • 效果
    • 添加 VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>),通过时间戳对位图输入进行排队。
    • 更改 VideoFrameProcessor.registerInputStream() 使其为非阻塞操作。应用程序必须实现 VideoFrameProcessor.Listener#onInputStreamRegistered()
    • VideoFrameProcessor.queueInputBitmapframeRatedurationUs 参数更改为 TimestampIterator
  • IMA 扩展
    • 修复多周期 DASH 直播流(不是播放列表中的第一个项目)可能会抛出异常的错误 (#571)。
    • 在调用 AdsLoader.destroy() 之前释放 StreamManager。
    • 将 IMA SDK 版本更新到 3.31.0。
  • 会话
    • DefaultMediaNotificationProvider 中将通知前台服务行为设置为 FOREGROUND_SERVICE_IMMEDIATE (#167)。
    • 在 API 31 以上仅使用 android.media.session.MediaSession.setMediaButtonBroadcastReceiver(),以避免在三星设备上出现与已弃用 API 相关的问题 (#167)。
    • 使用媒体通知控制器作为代理来设置可用的命令和用于填充通知和平台会话的自定义布局。
    • 将媒体按钮事件(由 Media3 中的 MediaSessionService.onStartCommand() 接收)转换为 Media3,而不是将它们路由到平台会话,然后再路由回 Media3。通过这样做,调用者控制器始终是媒体通知控制器,并且应用程序可以轻松地以相同的方式识别来自所有受支持 API 等级的通知的调用。
    • 修复 MediaController.getCurrentPosition() 在连接到旧版 MediaSessionCompat 时不会推进的错误。
    • 添加 MediaLibrarySession.getSubscribedControllers(mediaId) 以便于使用。
    • 覆盖 MediaLibrarySession.Callback.onSubscribe() 以断言控制器订阅的父 ID 的可用性。如果成功,则接受订阅并立即调用 notifyChildrenChanged() 以通知浏览器 (#561)。
    • 添加汽车操作系统会话演示模块,并为 Android Auto 启用会话演示。
    • 当媒体通知控制器不可用 COMMAND_GET_TIMELINE 时,不要设置框架会话的队列。当 Android Auto 作为从框架会话读取的客户端控制器时,这会导致 Android Auto UI 中的 queue 按钮不显示 (#339)。
    • 默认情况下使用 DataSourceBitmapLoader 而不是 SimpleBitmapLoader (#271, #327)。
    • 添加 MediaSession.Callback.onMediaButtonEvent(Intent),它允许应用程序覆盖默认的媒体按钮事件处理。
  • UI
    • 为 Wear OS 设备添加 Player.Listener 实现,该实现处理由于 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT 导致的播放抑制,方法是启动系统对话框以允许用户连接合适的音频输出(例如蓝牙耳机)。如果在可配置的超时时间内(默认值为 5 分钟)连接了合适的设备,则监听器将自动恢复播放。
  • 下载
    • 为 Android 14 兼容性声明 DownloadService 的“数据同步”前台服务类型。使用此服务时,应用程序还需要在清单中添加 dataSync 作为 foregroundServiceType,并在清单中添加 FOREGROUND_SERVICE_DATA_SYNC 权限 (#11239)。
  • HLS 扩展
    • 使用从上次加载开始时间而不是上次加载完成时间计算的间隔刷新 HLS 直播播放列表 (#663)。
  • DASH 扩展
    • 允许在段模板 URL 中使用多个相同的 DASH 标识符。
    • 在提取过程中添加对解析字幕的实验性支持。这对于合并重叠的字幕有更好的支持,包括解决字幕片段之间转换时的闪烁问题。您可以使用 DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288) 启用此功能。
  • RTSP 扩展
    • 修复了在回退到 TCP 时可能导致 IndexOutOfBoundsException 或在某些情况下导致播放挂起的竞争条件。
    • 在返回 RtspMediaPeriod 的加载状态时检查 RTSP 设置中的状态 (#577)。
    • 忽略 Options 响应公共标头中的自定义 Rtsp 请求方法 (#613)。
    • 在发送 keep-alive RTSP Options 请求的时间间隔内使用 RTSP Setup Response 超时值 (#662)。
  • 编解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • 发布 MIDI 解码器模块,该模块使用 Jsyn 库合成音频,支持标准 MIDI 文件的播放。
    • 添加 DecoderOutputBuffer.shouldBeSkipped 以直接标记不需要呈现的输出缓冲区。这优于即将弃用的 C.BUFFER_FLAG_DECODE_ONLY
    • 添加 Decoder.setOutputStartTimeUsSimpleDecoder.isAtLeastOutputStartTimeUs 以允许解码器在开始时间之前丢弃仅解码样本。这应该优于即将弃用的 Buffer.isDecodeOnly
    • 修复了将 MIDI 解码器工件发布到 Maven 存储库的错误。该工件已重命名为 media3-exoplayer-midi (#734)。
  • Leanback 扩展
    • 修复了禁用曲面会导致 Leanback 代码中出现 ArithmeticException 的错误 (#617)。
  • 测试工具
    • 使 TestExoPlayerBuilderFakeClock 与 Espresso UI 测试和 Compose UI 测试兼容。这修复了在 Espresso 或 Compose 视图交互期间播放非确定性地推进的错误。
  • 移除弃用的符号
    • 删除 TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)。使用 Composition.Builder.setHdrMode(int) 并在 Transformer.start(Composition, String) 中传递 Composition 代替。
    • 删除已弃用的 DownloadNotificationHelper.buildProgressNotification 方法,使用不推荐使用的方法,该方法使用 notMetRequirements 参数代替。

版本 1.2.0-rc01

2023 年 11 月 1 日

使用 1.2.0 稳定版

版本 1.2.0-beta01

2023 年 10 月 19 日

使用 1.2.0 稳定版

版本 1.2.0-alpha02

2023 年 9 月 29 日

使用 1.2.0 稳定版

版本 1.2.0-alpha01

2023 年 8 月 17 日

使用 1.2.0 稳定版

版本 1.1.0

版本 1.1.1

2023 年 8 月 16 日

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

版本 1.1.0

2023 年 7 月 5 日

  • 通用库
    • 添加了不适合的音频路由的抑制原因,以及为抑制时间过长添加了播放就绪更改原因。(#15)。
    • 向 Player 添加命令
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • 向 Player 添加重载方法,允许用户指定音量标志
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • 添加 Builder 用于 DeviceInfo,并弃用现有构造函数。
    • 添加 DeviceInfo.routingControllerId 以指定远程播放的路由控制器 ID。
    • 添加 Player.replaceMediaItem(s) 作为在同一位置添加和删除项目的快捷方式 (#8046)。
  • ExoPlayer
    • 允许 ExoPlayer 仅在明确选择加入的情况下才能控制设备音量方法。使用 ExoPlayer.Builder.setDeviceVolumeControlEnabled 访问
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int)setDeviceVolume(int, int)
      • increaseDeviceVolume(int)increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int)decreaseDeviceVolume(int, int)
    • 添加 FilteringMediaSource,允许从 MediaSource 过滤可用的音轨类型。
    • 添加对在自适应流格式 DASH、HLS 和 SmoothStreaming 的传出请求中包含通用媒体客户端数据 (CMCD) 的支持。已包含以下字段:brblcidrtpsid (#8699)。API 结构和 API 方法
      • CMCD 日志默认情况下处于禁用状态,使用 MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) 启用它。
      • 所有密钥默认情况下都处于启用状态,覆盖 CmcdConfiguration.RequestConfig.isKeyAllowed(String key) 以过滤要记录的密钥。
      • 覆盖 CmcdConfiguration.RequestConfig.getCustomData() 以启用自定义密钥记录。
    • 向主演示的清单添加其他操作,以更轻松地使用自定义 *.exolist.json 文件启动演示应用程序 (#439)。
    • 添加 ExoPlayer.setVideoEffects() 以在视频播放期间使用 Effect
    • 更新 SampleQueue 以将 sourceId 存储为 long 而不是 int。这会更改公共方法 SampleQueue.sourceIdSampleQueue.peekSourceId 的签名。
    • LoadControl 方法 shouldStartPlaybackonTracksSelected 添加参数,以允许将这些方法与相关的 MediaPeriod 关联。
    • 通过添加一个包含用作映射中密钥的 UID 的周期的时间线参数来更改 ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) 的签名。这是为了避免多周期直播的并发问题。
    • 弃用 EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)。可以改为调用没有 mediaTimeOffsetUs 的方法变体。请注意,即使对于已弃用的变体,偏移量也不会再添加到调度器分派的 MediaLoadData 对象的 startTimeUsendTimeUs 中。
    • ExoTrackSelection.blacklist 重命名为 excludeTrack,将 isBlacklisted 重命名为 isTrackExcluded
    • 修复了 ExoPlayer.setMediaItem(s)addMediaItem(s) 在空播放列表上调用时行为不一致的问题。
  • 转换器
    • 删除 Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)。使用 ExoPlayerAssetLoader.Factory(MediaSource.Factory)Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) 代替。
    • 删除 Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • 修复了在视频流的末尾在输入帧等待处理时发出信号时,转换可能会卡住(导致多路复用器超时)的错误。
    • 通过 MediaCodecList 查询编解码器,而不是使用 findDecoder/EncoderForFormat 工具,以扩展支持。
    • 删除 DefaultEncoderFactory 中的 B 帧配置,因为它在某些设备上不起作用。
  • 音轨选择
    • 添加 DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange,默认情况下处于禁用状态。启用后,DefaultTrackSelector 将在渲染器功能更改时触发新的音轨选择。
  • 提取器
    • Ogg:修复了在具有较长持续时间的文件中进行查找时的错误 (#391)。
    • FMP4:修复了 TimestampAdjuster 使用来自 emsg 原子的元数据样本时间初始化错误的时间戳偏移量的问题 (#356)。
  • 音频
    • 修复了在启用隧道并且 AudioProcessors 处于活动状态(例如,用于无缝修剪)时,某些播放会失败的错误 (#10847)。
    • 在直接播放(卸载)中将 Opus 帧封装在 Ogg 包裹中。
    • 使用卸载调度在睡眠期间推断当前位置。
    • 添加 Renderer.release()AudioSink.release() 用于在播放器生命周期的末尾释放资源。
    • DefaultAudioSink 中监听音频功能更改。在 DefaultAudioSink 的构造函数中添加一个必需的参数 contextDefaultAudioSink 将使用该参数作为监听器注册到 AudioCapabilitiesReceiver,并在收到功能更改通知时更新其 audioCapabilities 属性。
    • 通过 AudioSink.Listener 接口中的新事件 onAudioCapabilitiesChanged 传播音频功能更改,以及一个新的接口 RendererCapabilities.Listener,该接口触发 onRendererCapabilitiesChanged 事件。
    • 添加 ChannelMixingAudioProcessor 以对音频声道应用缩放/混合。
    • 在音频功能更改后,如果可能绕过模式,则将新的 int 值DISCARD_REASON_AUDIO_BYPASS_POSSIBLE添加到DecoderDiscardReasons中,以丢弃音频解码器。
    • 添加对 DTS Express 和 DTS:X 的直接播放支持(#335)。
  • 视频
    • 当渲染器被禁用时,使MediaCodecVideoRenderer 报告一个宽度和高度为 0 的VideoSize。当Player.getVideoSize() 发生变化时,Player.Listener.onVideoSizeChanged 将相应地被调用。有了这个改变,当Player.getCurrentTracks 不支持视频,或者支持的视频轨道的尺寸尚未确定时,ExoPlayer 的视频尺寸将为 0。
  • DRM
    • 降低DefaultDrmSession 上几个仅供内部使用的,且不应从 DRM 包外部调用的方法的可见性。
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer
    • 添加一个新的 muxer 库,可用于创建 MP4 容器文件。
  • IMA 扩展
    • 为 DAI 启用多时段直播 DASH 流。请注意,当前实现尚不支持在直播流中进行跳转(#10912)。
    • 修复在直播流中插入新的广告组的错误,因为连续时间轴中计算出的内容位置略有不同。
  • 会话
    • 添加辅助方法MediaSession.getControllerForCurrentRequest 以获取有关当前调用Player 方法的控制器的信息。
    • 添加androidx.media3.session.MediaButtonReceiver,使应用程序能够使用例如蓝牙耳机发送的媒体按钮事件实现播放恢复(#167)。
    • MediaSession.Callback.onAddMediaItems 中添加默认实现,以允许将请求的MediaItems 传递到Player,前提是它们具有LocalConfiguration(例如 URI)(#282)。
    • 在 Android 12 及以下版本中,默认情况下在紧凑型媒体通知视图上添加“跳转到上一首”和“跳转到下一首”命令按钮(#410)。
    • MediaSession.Callback.onAddMediaItems 中添加默认实现,以允许将请求的MediaItems 传递到Player,前提是它们具有LocalConfiguration(例如 URI)(#282)。
    • 在 Android 12 及以下版本中,默认情况下在紧凑型媒体通知视图上添加“跳转到上一首”和“跳转到下一首”命令按钮(#410)。
  • UI
    • 添加 Util 方法shouldShowPlayButtonhandlePlayPauseButtonAction 以使用带播放/暂停按钮的自定义 UI 元素。
  • RTSP 扩展
    • 对于 MPEG4-LATM,如果 DESCRIBE 响应 SDP 消息中没有,则使用默认的 profile-level-id 值(#302)。
    • 如果 DESCRIBE 响应头中存在,则使用基本 URI 从 RTSP 会话中解析相对路径(#11160)。
  • DASH 扩展
    • 从多时段 DASH 流的MediaLoadData.startTimeMsMediaLoadData.endTimeMs 中删除媒体时间偏移量。
    • 修复重新准备多时段直播 Dash 媒体源会导致IndexOutOfBoundsException 的错误(#10838)。
  • HLS 扩展
    • 添加HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) 以设置加载线程等待TimestampAdjuster 初始化的超时时间。如果初始化在超时前没有完成,则会抛出PlaybackException,以避免播放无休止地停顿。默认情况下,超时时间设置为 0(#323)。
  • 测试工具
    • DataSourceContractTest 中检查 URI 方案的大小写不敏感性。
  • 移除弃用的符号
    • 删除DefaultAudioSink 的构造函数,改为使用DefaultAudioSink.Builder
    • 删除HlsMasterPlaylist,改为使用HlsMultivariantPlaylist
    • 删除Player.stop(boolean)。改为使用Player.stop()Player.clearMediaItems()(如果resettrue)。
    • 删除两个已弃用的SimpleCache 构造函数,改为使用接受DatabaseProvider 的非弃用构造函数,以获得更好的性能。
    • 删除DefaultBandwidthMeter 的构造函数,改为使用DefaultBandwidthMeter.Builder
    • 删除DefaultDrmSessionManager 的构造函数,改为使用DefaultDrmSessionManager.Builder
    • 删除两个已弃用的HttpDataSource.InvalidResponseCodeException 构造函数,改为使用接受附加字段(causeresponseBody)的非弃用构造函数,以增强错误记录。
    • 删除DownloadHelper.forProgressiveDownloadHelper.forHlsDownloadHelper.forDashDownloadHelper.forSmoothStreaming,改为使用DownloadHelper.forMediaItem
    • 删除已弃用的DownloadService 构造函数,改为使用包含提供channelDescriptionResourceId 参数选项的非弃用构造函数。
    • 删除用于字符集的已弃用的字符串常量(ASCII_NAMEUTF8_NAMEISO88591_NAMEUTF16_NAMEUTF16LE_NAME),改为使用kotlin.text 包中的 Kotlin 字符集、java.nio.charset.StandardCharsetscom.google.common.base.Charsets
    • 删除已弃用的WorkManagerScheduler 构造函数,改为使用包含提供Context 参数选项的非弃用构造函数。
    • 删除用于实例化Format 类的已弃用的方法createVideoSampleFormatcreateAudioSampleFormatcreateContainerFormatcreateSampleFormat。改为使用Format.Builder 创建Format 的实例。
    • 删除已弃用的方法copyWithMaxInputSizecopyWithSubsampleOffsetUscopyWithLabelcopyWithManifestFormatInfocopyWithGaplessInfocopyWithFrameRatecopyWithDrmInitDatacopyWithMetadatacopyWithBitratecopyWithVideoSize,改为使用Format.buildUpon() 和 setter 方法。
    • 删除已弃用的ExoPlayer.retry(),改为使用prepare()
    • 删除已弃用的DefaultTrackSelector 的无参数构造函数,改为使用DefaultTrackSelector(Context)
    • 删除已弃用的OfflineLicenseHelper 的构造函数,改为使用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
    • 删除已弃用的DownloadManager 的构造函数,改为使用接受Executor 的构造函数。
    • 删除已弃用的Cue 的构造函数,改为使用Cue.Builder
    • 删除已弃用的OfflineLicenseHelper 的构造函数,改为使用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
    • 删除四个已弃用的AnalyticsListener 方法。
      • onDecoderEnabled,改为使用onAudioEnabled 和/或onVideoEnabled
      • onDecoderInitialized,改为使用onAudioDecoderInitialized 和/或onVideoDecoderInitialized
      • onDecoderInputFormatChanged,改为使用onAudioInputFormatChanged 和/或onVideoInputFormatChanged
      • onDecoderDisabled,改为使用onAudioDisabled 和/或onVideoDisabled
    • 删除已弃用的Player.Listener.onSeekProcessedAnalyticsListener.onSeekProcessed,改为使用onPositionDiscontinuityDISCONTINUITY_REASON_SEEK
    • 删除ExoPlayer.setHandleWakeLock(boolean),改为使用setWakeMode(int)
    • 删除已弃用的DefaultLoadControl.Builder.createDefaultLoadControl(),改为使用build()
    • 删除已弃用的MediaItem.PlaybackProperties,改为使用MediaItem.LocalConfiguration。已弃用的字段MediaItem.playbackProperties 现在为MediaItem.LocalConfiguration 类型。

版本 1.1.0-rc01

2023 年 6 月 21 日

使用 1.1.0 的稳定版本

版本 1.1.0-beta01

2023 年 6 月 7 日

使用 1.1.0 的稳定版本

版本 1.1.0-alpha01

2023 年 5 月 10 日

使用 1.1.0 的稳定版本

版本 1.0.0

版本 1.0.2

2023 年 5 月 18 日

发布了androidx.media3:media3-*:1.0.2版本 1.0.2 包含这些提交。

此版本对应于ExoPlayer 2.18.7 版本

此版本包含自1.0.1 版本以来的以下更改。

  • 核心库
    • 添加Buffer.isLastSample(),用于表示Buffer 是否包含标志C.BUFFER_FLAG_LAST_SAMPLE
    • 修复如果在不读取“流结束”样本的情况下将包含帧的最后一个样本出队,则可能无法渲染最后一帧的问题。(#11079)。
  • 提取器
    • 通过重新使用 RTSP 和 MP4 提取器已使用的解析逻辑,修复在 MPEG-TS 文件中解析 H.265 SPS 的问题(#303)。
  • 文本
    • SSA:如果文件以字节序标记开头,则添加对 UTF-16 文件的支持(#319)。
  • 会话
    • 修复MediaController 在连接到更新其操作的旧版MediaSessionCompat 时不更新其可用命令的问题。
    • 修复在 API 30 上阻止MediaLibraryService 为 System UI 对Callback.onGetLibraryRoot 的调用(其中params.isRecent == true)返回 null 的错误(#355)。
    • 修复MediaSessionServiceMediaLibraryService 的内存泄漏问题(#346)。
    • 修复在MediaSession 中组合的Timeline 和位置更新可能会导致MediaController 抛出IllegalStateException 的错误。

版本 1.0.1

2023 年 4 月 18 日

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

此版本对应于ExoPlayer 2.18.6 版本

  • 核心库
    • 在跳转到默认位置时重置目标直播流覆盖(#11051)。
    • 修复媒体中空样本流会导致播放卡住的错误。
  • 会话
    • 修复旧版MediaSessionCompat 发布的多个相同的队列项会导致MediaController 中出现异常的错误(#290)。
    • 添加对MediaSession.broadcastCustomCommand 到旧版MediaControllerCompat.Callback.onSessionEvent 的转发(#293)。
    • 修复调用MediaSession.setPlayer 不会更新可用命令的错误。
    • 修复从MediaController 发送的TrackSelectionOverride 实例在引用具有Format.metadata 的组时被忽略的问题(#296)。
    • 修复Player.COMMAND_GET_CURRENT_MEDIA_ITEM 需要可用才能通过旧版MediaSessionCompat 访问元数据的问题。
    • 修复在后台线程上的MediaSession 实例在MediaSessionService 中使用时会导致崩溃的问题(#318)。
    • 修复库声明媒体按钮接收器而应用程序没有意愿的问题(#314)。
  • DASH
    • 修复空段时序的处理 (#11014).
  • RTSP
    • 如果 RTSP 使用 UDP 设置失败,并出现 RTSP 错误 461 UnsupportedTransport,则重试使用 TCP (#11069).

版本 1.0.0

2023 年 3 月 22 日

androidx.media3:media3-*:1.0.0 发布。 版本 1.0.0 包含这些提交。

此版本对应于 ExoPlayer 2.18.5 版本

自 1.0.0-rc02 以来没有更改。

版本 1.0.0-rc02

2023 年 3 月 2 日

androidx.media3:media3-*:1.0.0-rc02 发布。 版本 1.0.0-rc02 包含这些提交。

此版本对应于 ExoPlayer 2.18.4 版本

  • 核心库
    • 修复 API 33 上的网络类型检测 (#10970).
    • 修复调用 ExoPlayer.isTunnelingEnabled 时出现的 NullPointerException (#10977).
  • 下载
    • SegmentDownloader 及其子类中,使要合并的两个片段的开始时间之间的最大差值可配置 (#248).
  • 音频
    • 修复三星设备上间隙播放 MP3 失败的问题 (#8594).
    • 修复在禁用音频后立即设置播放速度可能会被先前的速度更改覆盖的错误 (#10882).
  • 视频
    • 将 HEVC HDR10 格式映射到 HEVCProfileMain10HDR10 而不是 HEVCProfileMain10
    • 为 Chromecast with Google TV 和 Lenovo M10 FHD Plus 上导致 60fps AVC 流被标记为不支持的设备问题添加解决方法 (#10898).
    • 修复播放帧速率远高于屏幕刷新率的媒体时的帧释放性能问题。
  • Cast
    • 修复在媒体项之间切换时出现的短暂 STATE_IDLE (#245).
  • RTSP
    • 捕获解析无效 RTSP 描述响应消息时抛出的 IllegalArgumentException (#10971).
  • 会话
    • 修复通知播放/暂停按钮未随播放器状态更新的错误 (#192).
  • IMA 扩展
    • 修复由于未收到第一个(在没有广告的情况下也是唯一的)LOADED 事件,导致没有广告的 DAI 流无法启动的错误。

版本 1.0.0-rc01

2023 年 2 月 16 日

androidx.media3:media3-*:1.0.0-rc01 发布。 版本 1.0.0-rc01 包含这些提交。

此版本对应于 ExoPlayer 2.18.3 版本

  • 核心库
    • 调整渲染器的解码器排序逻辑,以维护 MediaCodecSelector 的偏好,即使解码器报告它可能无法以高性能播放媒体。例如,使用默认选择器,只有功能性支持的硬件解码器将优先于完全支持该格式的软件解码器 (#10604).
    • 添加 ExoPlayer.Builder.setPlaybackLooper,用于为新的 ExoPlayer 实例设置预先存在的播放线程。
    • 允许清除下载管理器助手 (#10776).
    • BasePlayer.seekTo 添加参数,以指示用于搜索的命令。
    • 在 API 21+ 上加载可绘制对象时使用主题 (#220).
    • 添加 ConcatenatingMediaSource2,它允许将多个媒体项合并为一个窗口 (#247).
  • 提取器
    • 如果样本表 (stbl) 在解析 trak 原子时缺少所需的样本描述 (stsd),则抛出 ParserException 而不是 NullPointerException
    • 在 fMP4 中直接搜索到同步帧时,正确跳过样本 (#10941).
  • 音频
    • 使用压缩音频格式比特率来计算直接播放 (直通) 中 AudioTrack 的最小缓冲区大小。
  • 文本
    • 修复 TextRenderer 如果字幕文件不包含提示,则将无效(负)索引传递给 Subtitle.getEventTime
    • SubRip:如果 UTF-16 文件以字节序标记开头,则添加对 UTF-16 文件的支持。
  • 元数据
    • 解析来自 ID3 帧的多个以 null 分隔的值,如 ID3 v2.4 所允许的那样。
    • 添加 MediaMetadata.mediaType,用于表示内容类型或元数据描述的文件夹类型。
    • 添加 MediaMetadata.isBrowsable 作为 MediaMetadata.folderType 的替代。文件夹类型将在下一个版本中弃用。
  • DASH
    • 添加对图像自适应集的完整解析,包括图块计数 (#3752).
  • UI
    • 修复弃用的 PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener),以确保可见性更改被传递给注册的监听器 (#229).
    • 修复使用从右到左 (RTL) 布局时 PlayerView 中中心播放器控件的顺序 (#227).
  • 会话
    • 添加抽象的 SimpleBasePlayer,以帮助为自定义播放器实现 Player 接口。
    • 添加帮助程序方法,用于将平台会话令牌转换为 Media3 SessionToken (#171).
    • 使用 onMediaMetadataChanged 触发平台媒体会话的更新 (#219).
    • 将媒体会话作为 DefaultMediaNotificationProvidergetMediaButtons() 的参数添加,并使用不可变列表以提高清晰度 (#216).
    • 添加 onSetMediaItems 回调监听器,以提供在将媒体项列表、起始索引和位置设置到播放器之前通过会话修改/设置它们的方法 (#156).
    • 避免为非蓝牙媒体按钮事件检测双击 (#233).
    • 在出现可疑的传统会话状态时,使 QueueTimeline 更加健壮 (#241).
  • 元数据
    • 解析来自 ID3 帧的多个以 null 分隔的值,如 ID3 v2.4 所允许的那样。
    • 添加 MediaMetadata.mediaType,用于表示内容类型或元数据描述的文件夹类型。
    • 添加 MediaMetadata.isBrowsable 作为 MediaMetadata.folderType 的替代。文件夹类型将在下一个版本中弃用。
  • Cast 扩展
    • 将 Cast SDK 版本更新为 21.2.0。
  • IMA 扩展
    • 删除 ImaServerSideAdInsertionMediaSource 在应用程序线程上的播放器监听器,以避免线程问题。
    • ImaServerSideAdInsertionMediaSource.AdsLoader.Builder 添加属性 focusSkipButtonWhenAvailable,用于请求在电视设备上聚焦跳过按钮,并将其默认设置为 true。
    • ImaServerSideAdInsertionMediaSource.AdsLoader 添加方法 focusSkipButton(),用于以编程方式请求聚焦跳过按钮。
    • 将 IMA SDK 版本更新为 3.29.0。
  • 演示应用
    • 在运行时请求下载通知的通知权限 (#10884).

版本 1.0.0-beta03

2022 年 11 月 22 日

androidx.media3:media3-*:1.0.0-beta03 发布。 版本 1.0.0-beta03 包含这些提交。

此版本对应于 ExoPlayer 2.18.2 版本

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

版本 1.0.0-beta02

2022 年 7 月 21 日

androidx.media3:media3-*:1.0.0-beta02 已发布。版本 1.0.0-beta02 包含这些提交。

此版本对应于 ExoPlayer 2.18.1 版本

  • 核心库
    • 确保使用 ExoPlayer.setShuffleOrder 更改 ShuffleOrder 会导致调用 Player.Listener#onTimelineChanged,其中 reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED。(#9889)。
    • 对于渐进式媒体,仅将选定轨道包含在缓冲位置。(#10361)。
    • 允许为所有 ExoPlayer 日志输出使用自定义记录器。(#9752)。
    • 修复 DefaultMediaSourceFactorysetDataSourceFactory 的实现,该实现某些情况下不起作用。(#116)。
  • 提取器
    • 修复解析 H265 短期参考图片集。(#10316)。
    • 修复从 esds 框解析比特率。(#10381)。
  • DASH
    • 从清单解析 ClearKey 许可证 URL。(#10246)。
  • UI
    • 确保 TalkBack 在播放控制菜单中宣布当前活动的速率选项。(#10298)。
  • RTSP
    • 添加 VP8 分片包处理。(#110)。
  • Leanback 扩展
    • LeanbackAdapter 中侦听 playWhenReady 更改。(10420)。
  • Cast
    • CastTimeline 中使用已传递到播放列表方法的 MediaItem 作为 Window.mediaItem。(#25#8212)。
    • 支持 Player.getMetadata()Listener.onMediaMetadataChanged()CastPlayer。(#25)。

版本 1.0.0-beta01

2022 年 6 月 16 日

androidx.media3:media3-*:1.0.0-beta01 已发布。版本 1.0.0-beta01 包含这些提交。

这对应于 ExoPlayer 2.18.0 版本

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

版本 1.0.0-alpha03

2022年3月14日

androidx.media3:media3-*:1.0.0-alpha03已发布。 版本 1.0.0-alpha03 包含这些提交。

这对应于ExoPlayer 2.17.1 版本

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

版本 1.0.0-alpha02

2022年3月2日

androidx.media3:media3-*:1.0.0-alpha02已发布。 版本 1.0.0-alpha02 包含这些提交。

这对应于ExoPlayer 2.17.0 版本

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

版本 1.0.0-alpha01

2021 年 10 月 27 日

androidx.media3:media3-*:1.0.0-alpha01 发布。 版本 1.0.0-alpha01 包含这些提交。

新功能

Media3 是媒体支持库的新家,包括 ExoPlayer。第一个 Alpha 版本包含用于实现媒体用例的库的早期功能实现,包括

  • ExoPlayer,一个面向 Android 的应用程序级媒体播放器,易于自定义和扩展。
  • 媒体会话功能,用于公开和控制播放。这个新的会话模块使用与 ExoPlayer 相同的 Player 接口。
  • 用于构建媒体播放用户界面的 UI 组件。
  • 包装其他库中的功能以供 ExoPlayer 使用的模块,例如通过 IMA SDK 插入广告。

有关更多信息,请参阅 Media3 GitHub 项目

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