Media3

适用于媒体用例的支持库。
最近更新时间 稳定版 候选版 Beta 版 Alpha 版
2025 年 7 月 2 日 1.7.1 - 1.8.0-beta01 1.8.0-alpha01

声明依赖项

如需添加 Media3 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库

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

Groovy

dependencies {
    def media3_version = "1.6.1"

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

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

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

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

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

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

    // For 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.6.1"

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

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

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

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

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

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

    // For 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.8.0

版本 1.8.0-beta01

2025 年 7 月 2 日

发布了 androidx.media3:media3-*:1.8.0-beta01。版本 1.8.0-beta01 中包含这些提交内容

  • 通用库:
    • 添加了对替换 ForwardingSimpleBasePlayer 中播放器的支持。
  • ExoPlayer:
    • 添加了对使用从传递到 ExoPlayer.BuilderContext 获取的虚拟设备 ID 的支持。
    • 在清理模式下默认启用动态调度。
    • 避免在搜索到项末尾时不必要地重新加载来源。
    • 在清理模式下默认使用 MediaCodec.BUFFER_FLAG_DECODE_ONLY
    • PreloadMediaSourceExoPlayer 播放且播放线程与预加载线程不同时,抛出 IllegalStateException (#2495)。
    • ShuffleMode 添加了 cloneAndMove,并提供默认实现 (#2226)。
    • 更改了 Renderer.getMinDurationToProgressUs 的默认行为,如果不需要调用 render,则返回更大的值。
    • 修复了以下 bug:在暂停状态下搜索到末尾时,内部调度会延迟最后一帧。目前,只有在启用 ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled 的情况下,此 bug 修复才会生效。
  • 转换器:
    • 添加了 CodecDbLite,可针对视频编码设置实现特定于芯片组的优化。
    • DefaultEncoderFactory 添加 setEnableCodecDbLite 标志,以启用 CodecDB Lite 设置优化。此标志默认设置为 false。
  • 提取器:
    • 添加了对在具有多个 sidx atom 的分段 MP4 中进行搜索的支持。 您可以在 FragmentedMp4Extractor 上使用 FLAG_MERGE_FRAGMENTED_SIDX 标志来启用此行为 (#9373)。
    • 忽略 FLAC 文件中的空搜索表(包括仅包含占位符搜索点的搜索表),并在已知文件时长的情况下回退到二分搜索(#2327)。
    • 修复了 H.265 SEI 单元的解析,以完全跳过无法识别的 SEI 类型 (#2456)。
    • 更新了 WavExtractor,以便在解析 WAVE_FORMAT_EXTENSIBLE 类型的文件时使用标头扩展名的 SubFormat 数据作为音频格式。
    • MP4:添加了对定义原始 PCM 音轨(不支持 64 位浮点 PCM)的 ipcmfpcm box 的支持。
    • MP4:处理同时旋转和反射视频的 tkhd 转换矩阵的旋转部分。这样可确保 iPhone 前置摄像头拍摄的反射视频以正确的方向显示,但在 y 轴上错误地反射 (#2012)。
  • 音频:
    • ChannelMappingAudioProcessorTrimmingAudioProcessor 中添加了对所有线性 PCM 采样格式的支持。
    • CompositionPlayer 中添加了对音频间隙的支持。
    • BaseAudioProcessor#reset() 中移除了对 BaseAudioProcessor#flush() 的虚假调用。
  • 视频:
    • 改进了启动时音频样本未在确切的请求位置开始时平滑的视频帧释放。
    • 将分离表面问题解决方法扩展到“realme”设备 (#2059)。
  • 文本:
    • 修复了以下问题:当字幕片段最初未能加载,但后来成功加载,随后出现多个空字幕片段时,播放会停滞 (#2517)。
  • 元数据:
    • 添加了对检索媒体时长和 Timeline 的支持,并将其迁移到基于实例的 AutoCloseable API。MetadataRetriever使用新的 BuilderMediaItem 创建实例,然后调用 retrieveTrackGroups()retrieveTimeline()retrieveDurationUs() 来获取元数据的 ListenableFuture。之前的静态方法现已弃用 (#2462)。
  • 图片:
    • BitmapFactoryImageDecoder 中解码的位图限制为显示大小,以避免应用在尝试显示非常大(例如 5000 万像素)的图片时因 PlayerView 中的 Canvas: trying to draw too large bitmap. 而崩溃。
    • 更改 DefaultRenderersFactory.getImageDecoderFactory() 的签名,以接受 Context 参数。
    • 使 CompositionPlayer 中使用的最大位图输出大小与 Transformer 中已使用的最大位图输出大小保持一致(这意味着 CompositionPlayer 在解码位图时不考虑显示大小,这与 ExoPlayer 不同)。
  • 多路复用器:
    • 修复了以下 bug:未为分段 MP4 中的音频样本设置正确的样本标志。
  • 会话:
    • 修复了以下 bug:当从不同于主线程的应用线程运行播放器时,从主线程调用 setSessionExtras 会导致 IllegalStateException (#2265)。
    • 如果玩家设置了媒体项,但未准备或播放这些媒体项,则不会自动显示通知 (#2423https://github.com/androidx/media/issues/2423)。此行为可通过 MediaSessionService.setShowNotificationForIdlePlayer 进行配置。
    • 为所有或所选控制器添加自定义 PlaybackException
    • 修复了在 MediaController 上直播中进行搜索可能会导致 IllegalArgumentException 的 bug。
    • 对于直播,停止发布播放位置以及在当前项中搜索的功能,以避免 Android Auto 界面(以及其他使用平台媒体会话中此信息的控制器)中出现位置伪影 (#1758)。
  • Cronet 扩展:
    • 添加了自动 Cookie 处理功能 (#5975)。
  • HLS 扩展程序:
    • 修复了播放列表解析,以接受带引号的字符串属性值中的 \f(换页符)(#2420)。
    • 支持更新具有相同 ID 的插页式广告 (#2427)。
    • 修复了以下 bug:当直播流没有可加载的片段时,有时不会传播播放列表加载错误 (#2401https://github.com/androidx/media/issues/2401)。
    • 按 NAME 标记对字幕版本进行分组,类似于音频版本的分组方式 (#1666)。
  • DASH 扩展程序:
    • 修复了以下 bug:当渲染流水线已读取超出新时长的样本时,缩短 DASH 时段时长可能会抛出异常 (#2440)。
    • 修复了使用 CMCD 查询参数时未遵循重定向的 bug (#2475)。
  • RTSP 扩展程序:
    • 修复了 RtspClient,以在处理 HTTP 302 响应时使用提供的位置 URI (#2398)。
  • 解码器扩展程序(FFmpeg、VP9、AV1 等):
    • 修复了 DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange 对音频解码器扩展没有效果的 bug (#2258)。
  • Cast 扩展程序:
    • 添加了对 setVolume()getVolume() 的支持 (#2279)。
    • 防止 CastPlayer 在时间轴为空时进入 STATE_BUFFERING 状态。
  • 测试实用程序:
    • advance(player).untilPositionAtLeastuntilMediaItemIndex 添加到 TestPlayerRunHelper,以便将播放器推进到指定位置。在大多数情况下,这些方法比现有的 untilPositionuntilStartOfMediaItem 方法更可靠。
    • FakeDownloader 移至 test-utils-robolectric 模块,以便在其他测试中重复使用。

版本 1.8.0-alpha01

2025 年 5 月 19 日

发布了 androidx.media3:media3-*:1.8.0-alpha01。版本 1.8.0-alpha01 中包含这些提交内容

  • ExoPlayer:
    • 添加了 ExoPlayer.setScrubbingModeEnabled(boolean) 方法。这样可以针对许多频繁的搜索操作(例如,用户拖动滑块)优化播放器。您可以使用 ExoPlayerExoPlayer.Builder 上的 setScrubbingModeParameters(..) 自定义拖动模式的行为。
    • 允许在擦洗模式下自定义分数搜索容差。
    • 在快进/快退模式下提高编解码器运行速率。
    • 修复了 AdsMediaSource 内容中的准备错误可能永远不会报告的 bug (#2337)。
    • 修复了 MergingMediaSource 中的内存泄漏问题,例如在侧载字幕时使用该方法时会出现此问题 (#2338)。
    • 允许 CmcdConfiguration.Factory 返回 null,以针对特定媒体项停用 CMCD 日志记录 (#2386)。
    • 将默认图片缓冲区大小从 128kB(文本轨道中的复制粘贴错误)增加到 26MB,这足以容纳 50MP Ultra HDR 图片 (#2417)。
    • 添加了 PreCacheHelper,允许应用预缓存具有指定开始位置和时长的单个媒体。
  • 转换器:
    • 现在,如需使用静音音频填充初始间隙(通过 addGap() 添加),必须在 EditedMediaItemSequence.Builder 中明确设置 experimentalSetForceAudioTrack(true)。如果缺口位于序列中间,则不需要此标志。
    • Muxer 接口从 media3-transformer 移至 media3-muxer
    • 将设置 MediaItem.Builder().setImageDuration(long) 设为强制性,以便将媒体内容作为图片导入。
    • 添加了 Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean),其中包含修剪时的 MP4 编辑列表,用于指示播放器忽略修剪开始点之前的关键帧与修剪开始点之间的样本。
    • 更新了 Composition Demo 应用,使其使用 Kotlin 和 Jetpack Compose,并添加了自定义 VideoCompositorSettings 以将序列排列到 2x2 或 PiP 布局中。
  • 提取器:
    • MP3:在因 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) 而回退到恒定比特率搜索时,使用来自不可搜索的 Xing、VBRI 和类似可变比特率元数据的时长和数据大小 (#2194)。
  • 音频:
    • 允许在 DefaultAudioMixer 中进行恒定功率上混/下混。
    • ChannelMappingAudioProcessorTrimmingAudioProcessorToFloatPcmAudioProcessor 设为公开 (#2339)。
    • AudioTrackPositionTracker 中使用 AudioTrack#getUnderrunCount() 来检测 DefaultAudioSink 中的欠载,而不是尽力估计。
    • 改进了音频时间戳平滑处理,以应对音频输出设备意外的位置漂移。
    • 修复了以下 bug:连接到蓝牙设备时,从暂停状态恢复后,前 10 秒的音频/视频同步出现问题。
    • 修复了 AnalyticsListener.onAudioPositionAdvancing 未报告音频开始前进的时间,而是报告了首次测量的时间的 bug。
  • 视频:
    • 添加了实验性 ExoPlayer API,以便在将仅解码输入缓冲区排入队列时包含 MediaCodec.BUFFER_FLAG_DECODE_ONLY 标志。此标志会向解码器发出信号,让其跳过仅解码缓冲区,从而加快搜索速度。使用 DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag 启用该功能。
    • 改进了软件视频编解码器的编解码器性能检查。这可能会导致一些额外的轨道被标记为 EXCEEDS_CAPABILITIES
    • 修复了部分设备上的 VP9 Widevine 播放错误 (#2408)。
  • 文本:
    • 修复了 SSA 和 SubRip,以便在启用字幕时显示正在进行的 cue (#2309)。
    • 修复了以下问题:当从存在字幕错误的流切换到具有空字幕轨道的直播时,播放会卡住 (#2328)。
    • 修复了播放包含 B 帧的 H.262 流时 CEA-608 字幕乱码的问题 (#2372)。
    • 在 Matroska 文件中添加了对使用 CodecId = S_TEXT/SSA 的 SSA 字幕的支持。之前,MatroskaExtractor 仅支持 CodecId = S_TEXT/ASS,后者旨在表示 SubStation Alpha 字幕的“高级”(v4+) 变体(但 ExoPlayer 的解析逻辑对于这两种变体是相同的)(#2384)。
    • 在 SubStation Alpha (SSA) 字幕文件中添加对 layer 属性的支持,该属性用于定义多个 cue 同时显示在屏幕上时的 z 顺序 (#2124)。
  • 效果:
    • 添加了 Presentation.createForShortSide(int),用于创建 Presentation,以确保最短边始终与给定值匹配,无论输入方向如何。
  • 多路复用器:
    • writeSampleData() API 现在使用特定于混音器的 BufferInfo 类,而不是 MediaCodec.BufferInfo
    • 添加 Muxer.Factory#supportsWritingNegativeTimestampsInEditList,默认值为 false。
  • IMA 扩展程序:
    • 修复了以下 bug:一个广告中的加载错误可能会意外导致另一个广告组失效。
    • 修复了以下 bug:VOD 窗口结束后,广告组导致播放停滞。 开始时间晚于窗口时间的广告组不再加入 MediaPeriodQueue 中(#2215)。
  • 会话:
    • 修复了以下 bug:将 null 传递到连接到旧版 MediaBrowserServiceCompatMediaBrowsergetLibraryRoot 中会产生 NullPointerException
    • 修复了以下 bug:发送自定义操作、搜索结果或 getItem 请求导致旧版会话应用崩溃并出现 ClassNotFoundException
    • 修复了 MediaItem.LocalConfiguration.uri 被共享到平台会话的 MediaMetadata 的 bug。如需有意共享 URI 以允许控制器重新请求媒体,请改为设置 MediaItem.RequestMetadata.mediaUri
  • 界面:
    • 修复了以下 Compose bug:在设置初始按钮状态和观察状态变化(例如图标形状或是否启用)之间存在差距。现在,系统会拾取在观测期之外对播放器所做的任何更改 (#2313)。
    • media3-ui-compose 模块添加 SeekBackButtonStateSeekForwardButtonState 的状态持有者和可组合项。
    • PlayerControlView 添加了对 ExoPlayer 的拖动模式的支持。启用后,当用户开始拖动进度条时,播放器会进入快进/快退模式,每次移动都会发出 player.seekTo 调用,然后在触摸操作从屏幕上抬起时退出快进/快退模式。您可以通过 XML 中的 time_bar_scrubbing_enabled = true 或 Java/Kotlin 中的 setTimeBarScrubbingEnabled(boolean) 方法来启用此集成。
    • 使 PlayerSurface 接受可为 null 的 Player 实参。
  • 下载内容:
    • 为渐进式流添加了部分下载支持。应用可以使用 DownloadHelper 准备渐进式流,并向辅助程序请求 DownloadRequest,同时指定下载应涵盖的基于时间的媒体开始和结束位置。返回的 DownloadRequest 包含已解析的字节范围,可使用该范围创建 ProgressiveDownloader 并相应地下载内容。
    • 添加了 DownloadHelper.Factory,用于替换静态 DownloadHelper.forMediaItem() 方法。
    • SegmentDownloader 实现添加了 Factory
    • 为自适应流添加了部分下载支持。应用可以使用 DownloadHelper 准备自适应流,并指定下载应涵盖的基于时间的媒体开始和结束位置,向辅助程序请求 DownloadRequest。返回的 DownloadRequest 包含已解析的时间范围,可使用该时间范围创建具体的 SegmentDownloader 并相应地下载内容。
  • HLS 扩展程序:
    • 支持 X-ASSET-LIST 和包含 HlsInterstitialsAdsLoader 的直播。
  • RTSP 扩展程序:
    • 为包含尾随空白字符的 SessionDescription 添加了解析支持 (#2357)。
  • Cast 扩展程序:
    • 添加了对 getDeviceVolume()setDeviceVolume()getDeviceMuted()setDeviceMuted() 的支持 (#2089)。
  • 测试实用程序:
    • 移除了 transformer.TestUtil.addAudioDecoders(String...)transformer.TestUtil.addAudioEncoders(String...)transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)。请改用 ShadowMediaCodecConfig 配置影子编码器和解码器。
    • ShadowMediaCodecConfig 报告的编解码器名称中的“exotest”前缀替换为“media3”。
  • 移除了已废弃的符号:
    • 移除了已弃用的 SegmentDownloader 构造函数 SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) 以及其子类 DashDownloaderHlsDownloaderSsDownloader 中的相应构造函数。
    • 移除了已弃用的 Player.hasNext()Player.hasNextWindow()。请改用 Player.hasNextMediaItem()
    • 移除了已弃用的 Player.next()。请改用 Player.seekToNextMediaItem()
    • 移除了已弃用的 Player.seekToPreviousWindow()。改用 Player.seekToPreviousMediaItem()
    • 移除了已弃用的 Player.seekToNextWindow()。改用 Player.seekToNextMediaItem()
    • 移除了 exoplayer 模块中已弃用的 BaseAudioProcessor。在 common 模块下使用 BaseAudioProcessor
    • 移除了已弃用的 MediaCodecVideoRenderer 构造函数 MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)

版本 1.7.0

版本 1.7.1

2025 年 5 月 16 日

此版本的代码与 1.6.1 相同,发布此版本是为了确保它显示为比 1.7.0“更新”的版本,而 1.7.0 是意外标记为稳定版的 Alpha 版(请参阅下文)。

版本 1.7.0

2025 年 5 月 16 日

此版本本应为 1.7.0-alpha01,但意外在 maven.google.com 上标记为 1.7.0(即稳定版)。请勿使用此版本。继续使用 1.6.1 或升级到 1.7.1(该版本与 1.6.1 具有相同的代码)。

版本 1.6.0

1.6.1

2025 年 4 月 14 日

发布了 androidx.media3:media3-*:1.6.1。版本 1.6.1 中包含这些提交内容

  • 通用库:
    • 添加了 PlaybackParameters.withPitch(float) 方法,以便轻松复制具有新 pitch 值的 PlaybackParameters (#2257)。
  • ExoPlayer:
    • 修复了以下问题:由于在初始化下一个媒体项期间出现可恢复的渲染器错误,导致媒体项过渡失败 (#2229)。
    • 修复了 ProgressiveMediaPeriodPreloadMediaSource 尝试调用其 getBufferedDurationUs() 之前抛出 IllegalStateException 的问题(#2315)。
    • 修复了在针对 DASH、HLS 和 SmoothStreaming 的清单请求中发送 CmcdData 的问题 (#2253)。
    • 确保在移除广告组后仍可使用 AdPlaybackState.withAdDurationsUs(long[][])。用户仍需传入已移除广告组的时长数组,该数组可以为空或为 null (#2267)。
  • 提取器:
    • MP4:从 tkhd 框中解析 alternate_group 并将其作为每个轨道 Format.metadata 中的 Mp4AlternateGroupData 条目公开 (#2242)。
  • 音频:
    • 修复了在播放短内容播放列表时位置可能会卡住的分流问题 (#1920)。
  • 会话:
    • 将平台 MediaSession 回调的较低聚合超时时间从 500 毫秒降至 100 毫秒,并添加一个实验性 setter 以允许应用配置此值。
    • 修复了通知在被用户关闭后重新出现的问题 (#2302)。
    • 修复了以下 bug:当封装的播放器实际上为空时,会话返回单项时间轴。当封装的播放器没有可用的 COMMAND_GET_TIMELINE,但有可用的 COMMAND_GET_CURRENT_MEDIA_ITEM 且封装的播放器为空时,会发生此问题 (#2320)。
    • 修复了以下 bug:在与服务进行其他互动(例如 setForegroundServiceTimeoutMs)后,调用 MediaSessionService.setMediaNotificationProvider 会被静默忽略 (#2305)。
  • 界面:
    • 使 PlayerSurface 能够与 ExoPlayer.setVideoEffectsCompositionPlayer 搭配使用。
    • 修复了无法使用新的 Player 重新组合 PlayerSurface 的 bug。
  • HLS 扩展程序:
    • 修复了以下问题:未在 CmcdData 中为 HLS 媒体设置块时长,导致在处理加密的媒体段时出现断言失败 (#2312)。
  • RTSP 扩展程序:
    • 添加对采用 RTSPT 方案的 URI 的支持,以配置使用 TCP 的 RTSP 会话 (#1484)。
  • Cast 扩展程序:
    • 添加了对播放列表元数据的支持 (#2235)。

1.6.0

2025 年 3 月 26 日

发布了 androidx.media3:media3-*:1.6.0。版本 1.6.0 中包含这些提交内容

  • 通用库:
    • 添加了 AudioManagerCompatAudioFocusRequestCompat 以替换 androidx.media 中的等效类。
    • 将 Kotlin 从 1.9.20 升级到 2.0.20,并使用 Compose 编译器 Gradle 插件。将 KotlinX Coroutines 库从 1.8.1 升级到 1.9.0。
    • 移除了 Format.toBundle(boolean excludeMetadata) 方法,改用 Format.toBundle()
    • 修复了 SimpleBasePlayer 中的 bug,该 bug 会导致在 setPlaylist 之后使用 null MediaMetadataState 中设置新的 currentMediaItemIndex 时,不会重新评估元数据 (#1940)。
    • SimpleBasePlayer.State 访问权限从受保护更改为公开,以便更轻松地处理其他类中的更新 (#2128)。
  • ExoPlayer:
    • 添加 MediaExtractorCompat,这是一个新类,可提供与平台 MediaExtractor 等效的功能。
    • 添加了实验性“ExoPlayer”预热支持,以便使用 MediaCodecVideoRenderer 进行播放。您可以通过 experimentalSetEnableMediaCodecVideoRendererPrewarming 配置 DefaultRenderersFactory,以向 ExoPlayer 提供辅助 MediaCodecVideoRenderer。如果启用,ExoPlayer 会在播放期间预处理连续媒体项的视频,以减少媒体项过渡延迟。
    • DefaultLoadControlbufferForPlaybackMsbufferForPlaybackAfterRebufferMs 的默认值分别减小为 1000 和 2000 毫秒。
    • 异步初始化 DeviceInfo 和设备音量(如果使用 setDeviceVolumeControlEnabled 启用)。这些值在 ExoPlayer.Builder.build() 之后不会立即提供,Player.Listener 会通过 onDeviceInfoChangedonDeviceVolumeChanged 通知更改。
    • 创建播放器后,初始音频会话 ID 不再立即可用。如果需要,您可以使用 AnalyticsListener.onAudioSessionIdChanged 来监听初始更新。
    • 选择视频轨道时,请考虑语言。默认情况下,选择与所选音轨语言相匹配的“主要”视频轨道(如果有)。可以使用 TrackSelectionParameters.Builder.setPreferredVideoLanguage(s) 明确表达视频语言偏好设置。
    • DefaultTrackSelector.selectVideoTrack() 方法添加了 selectedAudioLanguage 参数。
    • MediaSourceEventListener.onLoadStarted 和相应的 MediaSourceEventListener.EventDispatcher 方法添加了 retryCount 参数。
    • 修复了以下 bug:在多周期 DASH 流中,如果播放列表项或周期的时长与实际内容不匹配,可能会导致在项结束时出现帧冻结问题 (#1698)。
    • BasePreloadManager.Listener 移至顶层 PreloadManagerListener
    • RenderersFactory.createSecondaryRenderer 可用于为预热提供辅助渲染器。预热功能可在播放期间实现更快的媒体项过渡。
    • 启用在自适应流式传输格式 DASH、HLS 和 SmoothStreaming 的清单请求中发送 CmcdData (#1951)。
    • 提供将在 MediaCodecRenderer.onReadyToInitializeCodec 中初始化的编解码器的 MediaCodecInfo (#1963)。
    • AdsMediaSource 更改为允许通过附加广告组来增加 AdPlaybackStates。检测到无效的修改并抛出异常。
    • 修复了以下问题:在播放中贴片广告后过渡到内容媒体时,可能会连续快速显示额外的仅解码帧。
    • 使 DefaultRenderersFactory 添加两个 MetadataRenderer 实例,以使应用默认接收两种不同的元数据方案。
    • 重新评估在暂停播放时是否应取消正在进行的块加载(#1785)。
    • ClippingMediaSource 添加了选项,以允许在不可搜索的媒体中进行剪辑。
    • 修复了以下 bug:使用预热功能进行搜索可能会阻止后续媒体项过渡。
    • 修复了 ExoPlayer.isLoading() 在已转换为 STATE_IDLESTATE_ENDED 时仍保持 true 的 bug (#2133)。
    • LoadControl.Parameter 添加了 lastRebufferRealtimeMs#2113)。
  • 转换器:
    • 添加了对转封装为替代的向后兼容格式的支持。
    • 添加对转码和转封装杜比视界(配置文件 8)格式的支持。
    • 更新了 VideoFrameProcessor.registerInputStreamVideoFrameProcessor.Listener.onInputStreamRegistered 的参数,以使用 Format
    • 使用 DefaultEncoderFactory 时生成 HDR 静态元数据。
    • 通过 MediaMetricsManager 启用了对 Android 平台诊断信息的支持。Transformer 会将编辑事件和性能数据转发到平台,这有助于在设备上提供系统性能和调试信息。如果设备用户启用了使用情况和诊断信息数据分享功能,Google 可能也会收集上述数据。应用可以选择不通过 Transformer.Builder.setUsePlatformDiagnostics(false) 为 Transformer 提供平台诊断信息。
    • InAppMuxer 分为 InAppMp4MuxerInAppFragmentedMp4Muxer。 您可以使用 InAppMp4Muxer 生成非分段式 MP4 文件,而 InAppFragmentedMp4Muxer 用于生成分段式 MP4 文件。
    • Muxer 接口从 media3-muxer 移至 media3-transformer
    • 添加了 MediaProjectionAssetLoader,该功能可提供来自 MediaProjection 的媒体以用于屏幕录制,并向 Transformer 演示应用添加了对屏幕录制的支持。
    • Codec 接口添加了 #getInputFormat()
    • DefaultVideoFrameProcessorDefaultVideoCompositor 中,尽可能将释放 GlObjectsProvider 的责任转移到调用方。
  • 提取器:
    • AVI:修复了以下问题:对于具有恒定比特率压缩音频的文件,流标头存储的是字节数而不是块数。
    • 修复了以 1 或 2 字节(而非 4 字节)表示长度的 NAL 单元的处理。
    • 修复了当编辑列表从没有前置同步帧的非同步帧开始时,MP4 编辑列表中的 ArrayIndexOutOfBoundsException (#2062)。
    • 修复了 TS 流在某些设备上可能会卡住的问题 (#2069)。
    • FLAC:添加了对 32 位 FLAC 文件的支持。之前,这些视频无法通过 IllegalStateException: Playback stuck buffering and not loading 播放(#2197)。
  • 音频:
    • 修复了 onAudioPositionAdvancing,使其在播放恢复时调用(之前是在播放暂停时调用)。
    • SpeedChangingAudioProcessor 配置了默认参数时,不绕过 SonicAudioProcessor
    • 修复了 Sonic#getOutputSize() 中可能导致 DefaultAudioSink 停滞的下溢问题。
    • 修复了 MediaCodecAudioRenderer.getDurationToProgressUs()DecoderAudioRenderer.getDurationToProgressUs(),以便搜索正确重置提供的时长。
    • androidx.media3.common.audio.SonicAudioProcessor 设为最终版本。
    • ChannelMappingAudioProcessorTrimmingAudioProcessor 添加了对浮点 PCM 的支持。
  • 视频:
    • MediaCodecVideoRenderer.shouldUsePlaceholderSurface 更改为受保护,以便应用可以替换以阻止使用占位符界面 (#1905)。
    • 添加了实验性 ExoPlayer AV1 样本依赖项解析,以加快搜索速度。使用新的 DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies API 启用该功能。
    • 添加了实验性 ExoPlayer API,用于舍弃未依赖的后期 MediaCodecVideoRenderer 解码器输入缓冲区。使用 DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs 启用该功能。
    • 修复了以下问题:没有界面的播放器会立即就绪,并非常缓慢地解码任何待处理的帧 (#1973)。
    • 从分离式 Surface 模式中排除小米和 OPPO 设备,以避免屏幕闪烁 (#2059)。
  • 文本:
    • 添加了对 VobSub 字幕的支持 (#8260)。
    • 停止急切加载所有配置了 MediaItem.Builder.setSubtitleConfigurations 的字幕文件,而是仅在轨道选择选择了一个字幕文件时才加载该文件 (#1721)。
    • TTML:添加了对使用 style 引用 tts:origintts:extent 的支持 (#2953)。
    • 将 WebVTT 和 SubRip 时间戳限制为精确到小数点后 3 位。 之前,我们会错误地解析任意数量的小数位数,但始终假设该值以毫秒为单位,从而导致时间戳不正确 (#1997)。
    • 修复了当播放列表包含带有 CEA-608 或 CEA-708 字幕的剪辑项时,播放挂起的问题。
    • 修复了当 SSA 文件包含时长为零(开始时间和结束时间相同)的 cue 时的 IllegalStateException 问题 (#2052)。
    • 当字幕与音频和视频复用到同一容器中时,抑制(并记录)字幕解析错误 (#2052)。
    • 修复了使用 CR 行尾的 WebVTT 文件中多字节 UTF-8 字符的处理问题 (#2167)。
  • DRM:
    • 修复了在 API < 27 设备上播放 ClearKey 内容时出现的 MediaCodec$CryptoException: Operation not supported in this configuration 错误 (#1732)。
  • 效果:
    • OverlaySettings 的功能移至 StaticOverlaySettingsOverlaySettings 可以创建子类,以实现动态叠加层设置。
  • 多路复用器:
    • MuxerException 移出了 Muxer 接口,以避免出现过长的完全限定名称。
    • Mp4Muxer.BuilderFragmentedMp4Muxer.Builder 中的 setSampleCopyEnabled() 方法重命名为 setSampleCopyingEnabled()
    • Mp4Muxer.addTrack()FragmentedMp4Muxer.addTrack() 现在返回 int 轨道 ID,而不是 TrackToken
    • Mp4MuxerFragmentedMp4Muxer 不再实现 Muxer 接口。
    • 默认停用 Mp4Muxer 样本批处理和复制。
    • 修复了 FragmentedMp4Muxer 中的一个 bug,该 bug 会在仅写入音轨时创建大量 fragment。
  • 会话:
    • 在播放暂停、停止或失败时,额外保持 10 分钟的前台服务状态。这样一来,用户可以在此超时时限内恢复播放,而不会面临各种设备上的前台服务限制。请注意,在替换 onTaskRemoved 时,仅调用 player.pause() 已无法在 stopSelf() 之前停止前台服务,请改用 MediaSessionService.pauseAllPlayersAndStopSelf()
    • 当播放进入错误或停止状态时,保持通知可见。仅当播放列表被清除或播放器被释放时,通知才会被移除。
    • 改进了对 Android 平台 MediaSession 操作 ACTION_PLAY 和 ACTION_PAUSE 的处理,以根据可用命令仅设置其中一个,并且还接受仅设置其中一个的情况。
    • Context 添加为 MediaButtonReceiver.shouldStartForegroundService 的参数 (#1887)。
    • 修复了以下 bug:在连接到旧版会话的 MediaController 上调用 Player 方法时,会舍弃待处理更新中的更改。
    • 使 MediaSession.setSessionActivity(PendingIntent) 接受 null (#2109)。
    • 修复了在清除播放列表后过时的通知仍保持可见的 bug (#2211)。
  • 界面:
    • media3-ui-compose 模块添加了 PlayerSurfacePresentationStatePlayPauseButtonStateNextButtonStatePreviousButtonStateRepeatButtonStateShuffleButtonStatePlaybackSpeedState 的状态持有者和可组合项。
  • 下载内容:
    • 修复了 CacheWriter 中的 bug,该 bug 会在数据源抛出 IOException 以外的 Exception 时,使数据源保持打开状态并锁定缓存区域 (#9760)。
  • HLS 扩展程序:
    • 添加 HlsInterstitialsAdsLoader 的第一个版本。广告加载器会读取 HLS 媒体播放列表的 HLS 插页式广告,并将其映射到传递给 AdsMediaSourceAdPlaybackState。此初始版本仅支持具有 X-ASSET-URI 属性的 HLS VOD 流。
    • 添加了 HlsInterstitialsAdsLoader.AdsMediaSourceFactory。应用可以使用它以方便安全的方式创建使用 HlsInterstitialsAdsLoaderAdsMediaSource 实例。
    • 解析 HLS 播放列表中的 SUPPLEMENTAL-CODECS 标记以检测 Dolby Vision 格式 (#1785)。
    • 放宽了在 HLS 流中跳转到同步位置的条件 (#2209)。
  • DASH 扩展程序:
    • 为 DASH 添加了 AC-4 Level-4 格式支持 (#1898)。
    • 修复了在多周期直播中计算广告插播更新间隔时出现的问题 (#1698)。
    • 从 DASH 清单中解析 scte214:supplementalCodecs 属性,以检测杜比视界格式 (#1785)。
    • 改进了对直播中周期转换的处理,其中周期包含超出声明周期时长的媒体样本 (#1698)。
    • 修复了以下问题:标记为 adaptation-set-switching 但语言或角色标志不同的自适应集会合并在一起 (#2222)。
  • 解码器扩展程序(FFmpeg、VP9、AV1 等):
    • 添加了 MPEG-H 解码器模块,该模块使用内置的 MPEG-H 解码器来解码 MPEG-H 音频 (#1826)。
  • MIDI 扩展程序:
    • 将自定义 AudioSinkAudioRendererEventListener 实例接入 MidiRenderer
  • Cast 扩展程序:
    • play-services-cast-framework 依赖项提升到 21.5.0,以修复在搭载 Google Play 服务(已安装但已停用)的设备上,以 API 34 及更高版本为目标平台的应用中发生的 FLAG_MUTABLE 崩溃问题 (#2178)。
  • 演示版应用:
    • 通过添加更多按钮来扩展 demo-compose,并通过缩放和快门支持来增强 PlayerSurface 集成。
  • 移除了已废弃的符号:
    • 移除了已废弃的 AudioMixer.create() 方法。改用 DefaultAudioMixer.Factory().create()
    • 移除了以下已废弃的 Transformer.Builder 方法:
      • setTransformationRequest(),请改用 setAudioMimeType()setVideoMimeType()setHdrMode()
      • setAudioProcessors(),在 EditedMediaItem.Builder.setEffects() 中设置音频处理器,然后将其传递给 Transformer.start()
      • setVideoEffects(),在 EditedMediaItem.Builder.setEffects() 中设置视频效果,并将其传递给 Transformer.start()
      • setRemoveAudio(),请改用 EditedMediaItem.Builder.setRemoveAudio() 从传递给 Transformer.start()EditedMediaItem 中移除音频。
      • setRemoveVideo(),请改用 EditedMediaItem.Builder.setRemoveVideo() 从传递给 Transformer.start()EditedMediaItem 中移除视频。
      • setFlattenForSlowMotion(),请改用 EditedMediaItem.Builder.setFlattenForSlowMotion() 来展平传递给 Transformer.start()EditedMediaItem
      • setListener(),请改用 addListener()removeListener()removeAllListeners()
    • 移除了以下已废弃的 Transformer.Listener 方法:
      • onTransformationCompleted(MediaItem),请改用 onCompleted(Composition, ExportResult)
      • onTransformationCompleted(MediaItem, TransformationResult),请改用 onCompleted(Composition, ExportResult)
      • onTransformationError(MediaItem, Exception),请改用 onError(Composition, ExportResult, ExportException)
      • onTransformationError(MediaItem, TransformationException),请改用 onError(Composition, ExportResult, ExportException)
      • 废弃了 onTransformationError(MediaItem, TransformationResult, TransformationException),改用 onError(Composition, ExportResult, ExportException)
      • 废弃了 onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest),改用 onFallbackApplied(Composition, TransformationRequest, TransformationRequest)
    • 移除了已弃用的 TransformationResult 类。请改用 ExportResult
    • 移除了已弃用的 TransformationException 类。请改用 ExportException
    • 移除了已废弃的 Transformer.PROGRESS_STATE_NO_TRANSFORMATION。改用 Transformer.PROGRESS_STATE_NOT_STARTED
    • 移除了已废弃的 Transformer.setListener()。请改用 Transformer.addListener()Transformer.removeListener()Transformer.removeAllListeners()
    • 移除了已废弃的 Transformer.startTransformation()。改用 Transformer.start(MediaItem, String)
    • 移除了已废弃的 SingleFrameGlShaderProgram。改用 BaseGlShaderProgram
    • 移除了 Transformer.flattenForSlowMotion。改用 EditedMediaItem.flattenForSlowMotion
    • 移除了 ExoPlayer.VideoComponentExoPlayer.AudioComponentExoPlayer.TextComponentExoPlayer.DeviceComponent
    • 移除了 androidx.media3.exoplayer.audio.SonicAudioProcessor
    • 移除了以下已废弃的 DownloadHelper 方法:
      • 构造函数 DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]),请改用 DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)
      • getRendererCapabilities(RenderersFactory),可以通过创建具有 RenderersFactoryDefaultRendererCapabilitiesList 并调用 DefaultRendererCapabilitiesList.getRendererCapabilities() 来实现等效功能。
    • 移除了 PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat) 方法。请改用 PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) 并传入 (MediaSession.Token) compatToken.getToken()

1.6.0-rc02

2025 年 3 月 19 日

使用 1.6.0 稳定版

1.6.0-rc01

2025 年 3 月 12 日

使用 1.6.0 稳定版

1.6.0-beta01

2025 年 2 月 26 日

使用 1.6.0 稳定版

版本 1.6.0-alpha03

2025 年 2 月 6 日

使用 1.6.0 稳定版

版本 1.6.0-alpha02

2025 年 1 月 30 日

使用 1.6.0 稳定版

版本 1.6.0-alpha01

2024 年 12 月 20 日

使用 1.6.0 稳定版

版本 1.5

版本 1.5.1

2024 年 12 月 19 日

发布了 androidx.media3:media3-*:1.5.1。版本 1.5.1 中包含这些提交内容

  • ExoPlayer:
    • 停用 MediaCodec 中异步解密的使用,以避免此平台 API 出现报告的编解码器超时问题 (#1641)。
  • 提取器:
    • MP3:当 VBRI 帧的内容表未涵盖文件中的所有 MP3 数据时,不要过早停止播放 (#1904)。
  • 视频:
    • 回滚了在处理 onOutputFormatChanged 时使用提供的 MediaCodecAdapter 像素宽高比值的问题 (#1371)。
  • 文本:
    • 修复了 ReplacingCuesResolver.discardCuesBeforeTimeUs 中的 bug,该 bug 会导致在 timeUs 处于活动状态(开始时间早于 timeUs,但尚未结束)的 cue 被错误地舍弃 (#1939)。
  • 元数据:
    • 从 Vorbis 注释中提取光盘/轨道编号和流派到 MediaMetadata 中 (#1958)。

版本 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 和当前 TracksMetadata,而不是构建播放列表结构。
    • minSdk 增加到 21(Android Lollipop)。这与所有其他 AndroidX 库保持一致。
    • 添加了 androidx.media3:media3-common-ktx 制品,该制品在 Common 库的基础上构建了 Kotlin 特有的功能
    • 添加 Player.listen 挂起扩展函数,以启动协程来监听 media3-common-ktx 库的 Player.Events
    • 从手动实现为 out-of-lined 的内部类中移除了 @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 有时会被报告为“意外运行时错误”。
    • 传递 bufferedDurationUs 而不是 bufferedPositionUs(使用 PreloadMediaSource.PreloadControl.onContinueLoadingRequested())。此外,还将 DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS 更改为 DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS,这样一来,应用就需要传递一个表示特定时长的值(从默认起始位置开始),相应媒体源必须使用此 IntDef 进行预加载,而不是位置。
    • 添加了将所有方法调用转发到另一个渲染器的 ForwardingRenderer 实现 (1703)。
    • 为播放列表中的下一个项目添加了播放列表预加载。应用可以通过相应地调用 ExoPlayer.setPreloadConfiguration(PreloadConfiguration) 来启用预加载。 默认情况下,预加载处于停用状态。选择启用后,为了不干扰播放,DefaultLoadControl 会限制预加载,仅当播放器未加载以进行播放时才开始并继续预加载。应用可以通过相应地实现 LoadControl.shouldContinuePreloading()(例如在 DefaultLoadControl 中替换此方法时)来更改此行为。如果应用使用 LoadControl 的自定义实现,LoadControl 的默认实现会停用预加载。
    • 添加方法 MediaSourceEventListener.EventDispatcher.dispatchEvent() 以允许调用子类监听器的事件 (1736)。
    • 添加了 DefaultPreloadManager.Builder,用于构建具有一致共享配置的 DefaultPreloadManagerExoPlayer 实例。
    • LoadControl.onTracksSelected() 中移除了 Renderer[] 参数,因为 DefaultLoadControl 实现可以从 ExoTrackSelection[] 中检索流类型。
    • 弃用了 DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) 并将方法标记为最终状态,以防止被替换。 应改用新的 DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
    • MergingMediaSource 中报告来自次要来源的 MediaSourceEventListener 事件。这会导致系统针对旁加载的字幕(使用 MediaItem.LocalConfiguration.subtitleConfigurations 添加的字幕)报告加载开始/错误/取消/完成事件,这些事件可能会显示为从 AnalyticsListener 发出的重复加载事件。
    • 防止字幕和元数据错误完全停止播放。 而是停用有问题的轨道,并继续播放其余轨道 (#1722)。
      • 在新的字幕处理(提取期间)中,关联的解析错误(例如,无效的字幕数据)和加载错误(例如,HTTP 404)通过 onLoadError 回调发出。
      • 在旧版字幕处理(渲染期间)中,仅通过 onLoadError 回调发出关联的加载错误,而解析错误会被静默忽略(这是预先存在的行为)。
    • 修复了以下 bug:在多周期 DASH 流中,如果播放列表项或周期的时长与实际内容不匹配,可能会导致在项结束时出现帧冻结问题 (#1698)。
    • SntpClient 添加了一个 setter,用于设置自上次更新以来经过的最大时间,超过此时间后,客户端会重新初始化 (#1794)。
  • 转换器:
    • 添加了 SurfaceAssetLoader,该类支持通过 Surface 将视频数据排队到 Transformer。
    • ImageAssetLoader 通过 AssetLoader.onError 报告不受支持的输入,而不是抛出 IllegalStateException
    • 使使用 MediaItem.Builder.setImageDurationMs 设置图片时长成为图片导出的强制性要求。
    • 添加了对音频 EditedMediaItem 序列中缺口的导出支持。
  • 轨道选择:
    • DefaultTrackSelector:在其他因素相同的情况下,优先选择基于对象的音频,而不是基于声道的音频。
  • 提取器:
    • 允许 Mp4ExtractorFragmentedMp4Extractor 识别未被后续样本用作参考的 H264 样本。
    • AmrExtractor 中添加了启用基于索引的搜索的选项。
    • 将有效帧之间超过 128kB 的 MP3 文件视为截断文件(而非无效文件)。这意味着,如果文件末尾包含非 MP3 数据,但没有其他元数据来指示 MP3 字节的长度,现在会在 MP3 数据末尾停止播放,而不是因 ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} 而失败 (#1563)。
    • 修复了在处理 MP4 文件中的编辑列表时,针对非关键帧媒体起始位置的预播放广告示例处理问题 (#1659)。
    • 通过使用 Mp4ExtractorFragmentedMp4Extractormdhd box 的媒体时长,改进了帧速率计算 (#1531)。
    • 修复了 MP4 编辑列表中的 media_time 缩放比例不正确的问题。虽然 segment_duration 之前已使用影片时间尺度正确缩放,但现在 media_time 会使用轨道时间尺度正确缩放,如 MP4 格式标准中所指定 (#1792)。
    • 处理具有编辑列表的 MP4 的 endIndices 计算中的无序帧 (#1797)。
    • 修复了 MP4 文件 mdhd 框中的媒体时长解析,以处理 -1 值 (#1819)。
    • 添加了对识别 MP4 文件中 h263 box 的支持,以用于 H.263 视频 (#1821)。
    • 添加了 AC-4 Level-4 ISO 基本媒体文件格式支持 (#1265)。
  • DataSource:
    • 更新 HttpEngineDataSource 以允许从版本 S 扩展 7 开始使用,而不是从 API 级别 34 开始使用 (#1262)。
    • DataSourceContractTest:断言 DataSource.getUri() 返回已解析的 URI(如文档中所述)。如果此值与所请求的 URI 不同,测试可以使用新的 DataSourceContractTest.TestResource.Builder.setResolvedUri() 方法来指明这一点。
    • DataSourceContractTest:断言 DataSource.getUri()getResponseHeaders() 在对 open() 的调用失败(由于资源“未找到”)后以及在后续 close() 调用之前返回其“打开”值。
      • 替换 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 中具有非常大的字幕时间戳(以微秒表示并乘以 90,000 MPEG 时基时会溢出 64 位 long)的 WebVTT 字幕 (#1763)。
    • 支持杜比视界内容中的 CEA-608 字幕 (#1820)。
    • 修复了以下问题:在启用 CEA-608 字幕的情况下,播放 DASH 多周期流时会挂起 (#1863)。
  • 元数据:
    • 为包含 icy 或 vnd.dvb.ait 内容的轨道分配 C.TRACK_TYPE_METADATA 类型。
  • 图片:
    • 添加 ExternallyLoadedImageDecoder 以简化与 Glide 或 Coil 等外部图片加载库的集成。
  • DataSource:
    • 添加了 FileDescriptorDataSource,这是一种可用于从 FileDescriptor 读取数据的新 DataSource (#3757)。
  • 效果:
    • 针对轻微的 SurfaceTexture 缩放添加了 DefaultVideoFrameProcessor 解决方法。SurfaceTexture 可能包含一个小的缩放比例,用于剪切裁剪后的缓冲区边缘周围的 1 像素边框。现在,系统会处理这种情况,使输出结果更接近预期。
    • 加快 DefaultVideoFrameProcessor.queueInputBitmap()。因此,使用 Transformer 将图片导出为视频的速度更快。
  • IMA 扩展程序:
    • 修复了以下 bug:清除播放列表可能会导致 ImaServerSideAdInsertionMediaSource 中出现 ArrayIndexOutOfBoundsException
    • 修复了以下 bug:如果服务器端插入的 DAI 直播没有前贴片广告,则在播放到最后一个中贴片广告之后可能会导致 ArrayIndexOutOfBoundsException (#1741)。
  • 会话:
    • 添加了 MediaButtonReceiver.shouldStartForegroundService(Intent),以允许应用通过替换此方法来禁止传入的用于恢复播放的播放命令。默认情况下,服务始终处于启动状态,并且在系统因 ForegroundServiceDidNotStartInTimeException 而使服务崩溃之前,无法抑制播放 (#1528)。
    • 修复了以下 bug:当连接到旧版服务时,导致从 MediaBrowser 发送的自定义命令被调度到 MediaSessionCompat.Callback 而不是方法的 MediaBrowserServiceCompat 变体。这导致 MediaBrowser 无法接收旧版服务发回的实际返回值 (#1474)。
    • 处理了在为媒体按钮 intent 设置广播接收器时,某些制造商的设备抛出的 IllegalArgumentException (#1730)。
    • 为媒体内容添加了命令按钮。这会添加 Media3 API,以支持之前称为 Custom browse actions 的内容,并使用 MediaBrowserCompat 的旧版库。请注意,对于 MediaBrowserMediaController,Media3 命令按钮均可用于媒体项。请参阅 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:如果存在应用定义的文字轨道选择偏好设置,则文字选择中的“无”选项无法正常运行。
  • DASH 扩展程序:
    • 添加了对从细分中间开始的周期的支持 (#1440)。
  • 流畅的流式传输扩展:
    • 修复了播放带有文本轨道的 SmoothStreaming 流时出现的 Bad magic number for Bundle 错误 (#1779)。
  • RTSP 扩展程序:
    • 修复了包含经过编码的 @ 字符的网址的用户信息移除问题 (#1138)。
    • 修复了在解析带有标头扩展的 RTP 数据包时发生的崩溃问题 (#1225)。
  • 解码器扩展程序(FFmpeg、VP9、AV1 等):
    • 添加 IAMF 解码器模块,该模块支持使用 libiamf 原生库合成音频来播放包含 IAMF 轨道的 MP4 文件。
      • 播放功能已启用,支持立体声布局和 5.1 声道空间化,还可选择启用头部追踪功能,但目前不支持双耳播放。
    • 为 Android 15 上的解码器扩展程序添加了 16 KB 页面支持 (#1685)。
  • Cast 扩展程序:
    • 在 CastSession 断开连接后停止清理时间轴,这使发送方应用能够在断开连接后恢复本地播放。
    • 当提供 Context 时,填充 CastPlayer 的 DeviceInfo。这使得可以将 MediaSession 关联到 RoutingSession,这是集成输出切换器所必需的 (#1056)。
  • 测试实用程序:
    • DataSourceContractTest 现在包含用于验证以下内容的测试:
      • 输入源 read position 已更新。
      • 输出缓冲区 offset 是否已正确应用。
  • 演示版应用
    • 解决了演示版短视频应用中的内存泄漏问题 (#1839)。
  • 移除了已废弃的符号:
    • 移除了已废弃的 Player.hasPreviousPlayer.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:
    • PreloadMediaSource 中异步处理预加载回调 (#1568)。
    • 允许在加载失败时播放,无论缓冲时长如何 (#1571)。
  • 提取器:
    • MP3:通过根据 Info 帧中的长度字段正确忽略尾随的非 MP3 数据,修复了 Searched too many bytes 错误 (#1480)。
  • 文本:
    • TTML:修复了百分比 tts:fontSize 值的处理,以确保它们可以正确地从具有百分比 tts:fontSize 值的父节点继承。
    • 修复了 LegacySubtitleUtil 中因错误处理请求的输出开始时间大于或等于 Subtitle 中的最终事件时间的情况而导致的 IndexOutOfBoundsException 问题 (#1516)。
  • DRM:
    • 修复了在播放 L1 Widevine 内容的 API 31 及更高版本的设备上出现的 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 时,将 KEYCODE_HEADSETHOOK 作为“播放”命令进行处理 (#1581)。
  • RTSP 扩展程序:
    • 在 SDP 解析中跳过无效的媒体说明 (#1087)。

版本 1.4.0

2024 年 7 月 25 日

发布了 androidx.media3:media3-*:1.4.0。版本 1.4.0 中包含这些提交内容

  • 通用库:
    • 将假定为无操作的 seek 调用转发到受保护的 BasePlayer.seekTo()SimpleBasePlayer.handleSeek() 方法,而不是忽略它们。如果您在自定义播放器中实现这些方法,可能需要使用 mediaItemIndex == C.INDEX_UNSET 处理这些额外的调用。
    • 移除了对增强型 Java 8 脱糖的编译依赖项 (#1312)。
    • 确保对于非图片 MediaItem,系统会忽略传递给 MediaItem.Builder.setImageDurationMs() 的时长(如文档中所述)。
    • 添加了 Format.customData 以存储应用提供的有关 Format 实例的自定义信息。
  • ExoPlayer:
    • 添加 BasePreloadManager,用于根据多个来源的 rankingData 定义的优先级来协调预加载。 您可以通过扩展此类进行自定义。添加了 DefaultPreloadManager,该方法使用 PreloadMediaSource 将来源的媒体样本预加载到内存中,并使用一个整数 rankingData 来指示界面上某个项的索引。
    • LoadControl 的大多数方法添加了 PlayerId,以使 LoadControl 实现能够支持多名玩家。
    • 移除了 Buffer.isDecodeOnly()C.BUFFER_FLAG_DECODE_ONLY。无需设置此标志,因为渲染器和解码器会根据时间戳决定是否跳过缓冲区。自定义 Renderer 实现应检查缓冲时间是否至少为 BaseRenderer.getLastResetPositionUs(),以决定是否应显示示例。自定义 SimpleDecoder 实现可以根据需要检查 isAtLeastOutputStartTimeUs(),也可以使用 DecoderOutputBuffer.shouldBeSkipped 标记其他缓冲区以跳过它们。
    • 允许 TargetPreloadStatusControl.getTargetPreloadStatus(T) 返回 null 值,以指示不使用给定的 rankingData 预加载 MediaSource
    • remove(MediaSource) 添加到 BasePreloadManager 中。
    • BasePreloadManager 添加 reset() 以释放所有持有来源,同时保留预加载管理器实例。
    • 添加了 ExoPlayer.setPriority()(和 Builder.setPriority()),用于定义 PriorityTaskManager 中使用的优先级值,以及自 API 35 起的 MediaCodec 重要性。
    • 修复了更新上次重新缓冲时间时导致 CMCD 中 bs(缓冲区饥饿)键不正确的问题 (#1124)。
    • 添加 PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) 以指示来源已加载到末尾。这样一来,DefaultPreloadManager 和自定义 PreloadMediaSource.PreloadControl 实现就可以预加载下一个来源或执行其他操作。
    • 修复了以下 bug:在项末尾跳过静音可能会触发播放异常。
    • PreloadMediaSource 添加 clear 以舍弃预加载周期。
    • 添加了新的错误代码 PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED,当回收编解码器资源以用于更高优先级的任务时,会使用该错误代码。
    • 允许 AdsMediaSource 在初始内容媒体准备完成之前加载前贴片广告 (#1358)。
    • 修复了以下 bug:在从清单中移除原始时段后重新准备多时段 DASH 直播时,播放会移至 STATE_ENDED
    • PreloadMediaSource.PreloadControl 中的 onTimelineRefreshed() 重命名为 onSourcePrepared(),并将 onPrepared() 重命名为 onTracksSelected()。同时相应地重命名 DefaultPreloadManager.Stage 中的 IntDef。
    • 添加了对动态调度的实验性支持,以更好地使工作与 CPU 唤醒周期保持一致,并延迟唤醒,直到渲染器可以继续运行。您可以在设置 ExoPlayer 实例时使用 experimentalSetDynamicSchedulingEnabled() 启用此功能。
    • 添加了 Renderer.getDurationToProgressUs()Renderer 可以实现此方法,以向 ExoPlayer 返回渲染器必须推进的播放时长,才能取得进展。如果 ExoPlayer 设置为 experimentalSetDynamicSchedulingEnabled(),则 ExoPlayer 在计算安排工作任务的时间时会调用此方法。
    • 添加 MediaCodecAdapter#OnBufferAvailableListener 以在输入和输出缓冲区可供 MediaCodecRenderer 使用时发出提醒。MediaCodecRenderer 会在收到这些回调时向 ExoPlayer 发出信号,如果 ExoPlayer 设置了 experimentalSetDynamicSchedulingEnabled(),则 ExoPlayer 会安排其工作循环,以便渲染器可以取得进展。
    • 使用数据类来表示 LoadControl 方法,而不是使用各个参数。
    • 添加 ExoPlayer.isReleased() 以检查 Exoplayer.release() 是否已被调用。
    • 添加了 ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() 以配置 seekToPrevious() 查找上一个项目的最大位置 (#1425)。
    • 修复了一些音频焦点不一致的问题,例如在播放器暂停时未报告完全或短暂的焦点丢失 (#1436)。
    • 修复了提取器在初始准备步骤后报告其他轨道可能导致的 IndexOutOfBoundsException 问题 (#1476)。
    • ExoPlayer.setVideoEffect() 中的 Effects 将接收已移除渲染器偏移量的时间戳 (#1098)。
    • 修复了在预读到另一个播放列表项时处理播放器错误时可能出现的 IllegalArgumentException (#1483)。
  • 转换器:
    • ExportResult 添加了 audioConversionProcessvideoConversionProcess,用于指明输出文件中相应轨道是如何制作的。
    • 放宽了剪辑优化 H.264 级别检查。
    • 添加了对在序列中更改 SDR 和 HDR 输入媒体的支持。
    • 添加了对合成级音频效果的支持。
    • 添加了对将 Ultra HDR 图片转码为 HDR 视频的支持。
    • 修复了以下问题:DefaultAudioMixer 在重置并重新使用后,不会输出正确的字节数。
    • 解决了解码器在处理 PCM 输入时音频声道数上限为立体声的 bug。
    • 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 帧中的数据大小,而不是底层流(例如文件大小或 HTTP Content-Length 标头)报告的大小。这有助于从恒定比特率搜索计算中排除不可播放的预告片数据(例如专辑封面),从而使搜索更加准确 (#1376)。
    • MP3:使用 Info 帧中的帧数和其他数据(如果存在)来计算恒定比特率搜索的平均比特率,而不是从 Info 帧之后的帧的比特率(可能人为地较小,例如 PCUT 帧 [#1376])进行外推。
    • 修复了 AVI 容器中 PCM 音频格式的提取问题。
  • 音频:
    • 修复了透传播放的 DTS:X Profile 2 编码属性 (#1299)。
    • 对于分流播放,请在调用 AudioTrack.stop() 之前重置 DefaultAudioSink 中用于跟踪数据流完成情况的字段,以便 AudioTrack.StreamEventCallback#onPresentationEnded 正确识别所有待处理数据何时已播放完毕。
    • 修复了 SilenceSkippingAudioProcessor 中的 bug,即不同音频格式(例如立体声到单声道)之间的过渡可能会导致处理器抛出异常 (#1352)。
    • 实现 MediaCodecAudioRenderer.getDurationToProgressUs(),以便 ExoPlayer 能够动态安排其主工作循环,使其在 MediaCodecAudioRenderer 可以取得进展时运行。
  • 视频:
    • 修复了在播放过程中切换界面时 Listener.onRenderedFirstFrame() 过早到达的问题。
    • 修复了杜比视界的解码器回退逻辑,以在需要时使用兼容的 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 均为 true(columnLock 支持未实现,因此实际上假定其始终为 false)。
      • 此更改最初包含在 1.3.0-alpha01 版本说明中,但在 1.3.0-rc01 版本发布之前被意外还原。此问题现已修复,因此相应变更会再次显示。
    • CEA-708:避免因 ExoPlayer 对“设置笔位置”命令的简单处理而添加重复的换行符 (#1315)。
    • 修复了当 WebVTT 字幕样本不包含任何提示时(例如,作为 DASH 流的一部分)来自 LegacySubtitleUtilIllegalArgumentException (#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
  • DataSource:
    • 实现对 android.resource://package/id 原始资源 URI 的支持,其中 package 不同于当前应用的软件包。 之前未记录此方法可行,但与按名称访问其他软件包中的资源相比,此方法更高效。
    • DataSpec 构造函数中急切地检查 url 是否为非 null。此形参已添加注释,表示其不得为 null。
    • 允许 ByteArrayDataSourceopen() 期间将 URI 解析为字节数组,而不是在构建时进行硬编码 (#1405)。
  • DRM:
    • 允许在 DefaultDrmSessionManagerProvider 上设置 LoadErrorHandlingPolicy (#1271)。
  • 效果:
    • 支持在 SpeedChangeEffect 的同一 EditedMediaItemComposition 中进行多次速度更改。
    • 支持从 Ultra HDR 位图输入中输出 HLG 和 PQ。
    • 添加了对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,从而改进了 ExoPlayer.setVideoEffect 和 Transformer 的 Debug SurfaceView 中的 HLG 表面输出。
    • 更新叠加层矩阵实现,使之与文档保持一致,方法是翻转 setOverlayFrameAnchor() 中应用的 x 和 y 值。如果使用 OverlaySettings.Builder.setOverlayFrameAnchor(),请将它们的 x 和 y 值乘以 -1,从而翻转这些值。
    • 修复了 TimestampWrapper 在与 ExoPlayer#setVideoEffects 结合使用时崩溃的 bug (#821)。
    • 将默认 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。还提供第三个选项来保留原始色彩空间。
    • 允许定义 EditedMediaItemSequences 的不确定 z 顺序 (#1055)。
    • 在不同的 HDR 内容片段中保持一致的亮度范围(使用 HLG 范围)。
    • 添加了对 HDR 内容上的 Ultra HDR(位图)叠加层的支持。
    • 允许在 API 26 之前使用 SeparableConvolution 效果。
    • 移除了未使用的 OverlaySettings.useHdr,因为叠加层和帧的动态范围必须一致。
    • TextOverlay 添加了 HDR 支持。可以使用 OverlaySettings.Builder.setHdrLuminanceMultiplier() 调整文字叠加层的亮度。
  • IMA 扩展程序:
    • 将应用播放 DAI 广告流所需的 API 升级为稳定版。
    • ImaServerSideAdInsertionMediaSource.AdLoader 添加了 replaceAdTagParameters(Map <String, String>),以便在运行时替换广告代码参数。
    • 修复了以下 bug:在广告播放期间发生播放器错误时,未调用 VideoAdPlayer.VideoAdPlayerCallback.onError() (#1334)。
    • 将 IMA SDK 版本提升至 3.33.0,以修复使用 data:// 广告代码 URI 时的 NullPointerException 问题 (#700)。
  • 会话:
    • CommandButton.enabled 的默认值更改为 true,并确保即使关联的命令可用,控制器对应的值也可以保持为 false。
    • CommandButton 添加了图标常量,这些常量应取代自定义图标资源。
    • 添加了 MediaSessionService.isPlaybackOngoing(),以允许应用查询是否需要在 onTaskRemoved() 中停止服务 (#1219)。
    • 添加了 MediaSessionService.pauseAllPlayersAndStopSelf(),可方便地暂停所有会话的播放,并调用 stopSelf() 来终止 MediaSessionService 的生命周期。
    • 替换 MediaSessionService.onTaskRemoved(Intent) 以提供安全的默认实现,该实现可在播放正在进行时使服务在前台运行,否则会停止服务。
    • 通过不在平台会话元数据中设置时长,隐藏直播的媒体通知中的进度条 (#1256)。
    • MediaMetadata 的转换与 MediaDescriptionCompat 的转换对齐,以便在选择元数据属性时使用与 media1 中相同的首选顺序和逻辑。
    • 添加了 MediaSession.sendError(),允许将非严重错误发送到 Media3 控制器。使用通知控制器(请参阅 MediaSession.getMediaNotificationControllerInfo())时,自定义错误用于将平台会话的 PlaybackState 更新为具有指定错误信息的错误状态 (#543)。
    • 添加 MediaSession.Callback.onPlayerInteractionFinished() 以在特定控制器的系列玩家互动完成时通知会话。
    • 添加 SessionError 并将其用于 SessionResultLibraryResult,而不是使用错误代码,以便提供有关错误以及如何解决错误(如果可能)的更多信息。
    • 发布可用于测试与发布媒体会话的应用之间互动的 media3 控制器测试应用的代码。
    • 将传递给 media3 的 MediaSession[Builder].setSessionExtras() 的 extra 传播到 media1 控制器的 PlaybackStateCompat.getExtras()
    • 将严重错误和非严重错误映射到平台会话以及从平台会话映射。PlaybackException 映射到 PlaybackStateCompat 的严重错误状态。发送到媒体通知控制器的 SessionError(带有 MediaSession.sendError(ControllerInfo, SessionError))会映射到 PlaybackStateCompat 中的非致命错误,这意味着错误代码和消息已设置,但平台会话的状态与 STATE_ERROR 不同。
    • 允许按控制器设置会话 activity 以替换全局会话 activity。可以在连接时通过创建具有 AcceptedResultBuilder.setSessionActivivty(PendingIntent)ConnectionResult 为控制器定义会话 activity。连接后,可以使用 MediaSession.setSessionActivity(ControllerInfo, PendingIntent) 更新会话活动。
    • 改进了对 MediaLibrarySession.Callback 的调用中的错误复制。 现在,您可以使用 MediaLibrarySession.Builder.setLibraryErrorReplicationMode() 配置错误复制,以选择错误类型或选择停用默认开启的错误复制。
  • 界面:
    • 在连接到 ExoPlayer 时,向 PlayerView 添加了图片显示支持 (#1144)。
    • 通过 XML 属性在 PlayerControlView 中添加了各种图标的自定义功能,以允许每个 PlayerView 实例使用不同的可绘制对象,而不是全局替换 (#1200)。
    • 解决了一个平台 bug,该 bug 会导致在 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 扩展程序:
    • 修复了以下 bug:等待不连续性的待处理 EMSG 样本在 HlsSampleStreamWrapper 中以错误的偏移量进行委托,导致出现 IndexOutOfBoundsExceptionIllegalArgumentException (#1002)。
    • 修复了非主播放列表针对 LL-HLS 流不断重新加载的 bug (#1240)。
    • 修复了以下 bug:为具有初始化段的 HLS 启用 CMCD 会导致 Source ErrorIllegalArgumentException
    • 修复了在直播播放期间未刷新非主要播放播放列表的 bug (#1240)。
    • 修复了以下 bug:为 HLS 直播启用 CMCD 会导致 ArrayIndexOutOfBoundsException#1395)。
  • DASH 扩展程序:
    • 修复了重新准备多周期直播流可能会抛出 IndexOutOfBoundsException 的 bug (#1329)。
    • 添加了对 dashif:Laurl 许可网址的支持 (#1345)。
  • 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
    • 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)的视频轨道,而不是帧速率较低或未设置的视频轨道。这样可确保播放器在从动态照片提取的 MP4 中选择“真实”视频轨道,这些 MP4 可能包含两个 HEVC 轨道,其中一个具有较高的分辨率,但帧数非常少 (#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)。
    • 修复了以下问题:仅包含非 null extrasMediaMetadata 未在媒体控制器和会话之间传输 (#1176)。
  • 界面:
    • 如果 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 依赖项所必需的。
    • MediaMetadata.Builder.populate(MediaMetadata) 中的 artworkUriartworkData 至少有一个不为 null 时,填充这两个字段 (#964)。
  • ExoPlayer:
    • 添加了 PreloadMediaSourcePreloadMediaPeriod,允许应用在播放之前预加载特定起始位置的内容媒体源。PreloadMediaSource 负责准备内容媒体源以接收 Timeline,准备并缓存给定起始位置的周期,选择轨道并加载该周期的媒体数据。应用通过实现 PreloadMediaSource.PreloadControl 来控制预加载进度,并将预加载的来源设置为播放器的播放来源。
    • 添加了 ExoPlayer.setImageOutput,允许应用设置 ImageRenderer.ImageOutput
    • DefaultRenderersFactory 现在默认向播放器提供 ImageRenderer,其中 ImageOutputImageDecoder.Factory.DEFAULT 为 null。
    • 在跳过静音时发出 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:使用恒定比特率 (CBR) 搜索具有 Info 标头(相当于 Xing 标头的 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 均为 true(columnLock 支持尚未实现,因此实际上假定其始终为 false)。
  • 图片:
    • 添加了对 DASH 缩略图的支持。网格图片会被剪裁,并提供各个缩略图,以便在演示时间临近时ImageOutput
  • 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:
    • 修复了以下问题:当手动搜索超出 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)。
    • 修复了时长超过 47,721 秒的 TS 流的时长估计问题 (#855)。
  • 音频:
    • 修复了多次调用 SilenceSkippingAudioProcessor 时对 EOS 的处理 (#712)。
  • 视频:
    • 针对 Galaxy Tab S7 FE、Chromecast with Google TV 和 Lenovo M10 FHD Plus 上导致 60fps AVC 流被标记为不受支持的设备问题添加了解决方法 (#693)。
  • 元数据:
    • 修复了 MediaMetadata 仅从具有大写键的 Vorbis 注释填充的 bug (#876)。
    • 在解析非常大的 ID3 帧时捕获 OutOfMemoryError,这意味着播放可以继续,而无需标记信息,而不是完全失败。
  • DRM:
    • 将针对虚假 ClearKey https://default.url 许可网址的权变措施扩展到 API 33 及更高版本(之前该权变措施仅适用于 API 33)(#837)。
    • 修复了以下问题:在没有附加到播放器的界面的情况下,从加密内容切换到非加密内容时,出现 ERROR_DRM_SESSION_NOT_OPENED。此错误是由于错误地使用安全解码器来播放未加密内容所致。
  • 会话:
    • 将自定义键和值放入 MediaMetadataCompatMediaMetadata.extrasMediaMetadata.extrasMediaMetadataCompat 中(#756#802)。
    • 修复了针对旧版控制器的广播 notifyChildrenChanged (#644)。
    • 修复了以下 bug:为已停用的通知 setWhen 计时器设置负时间会导致某些设备崩溃 (#903)。
    • 修复了以下情况下的 IllegalStateException:当请求首次更新通知时,媒体通知控制器尚未完成连接 (#917)。
  • 界面:
    • 修复了在 BottomSheetDialogFragment 中与 Material Design 搭配使用时,快进和快退按钮不可见的问题 (#511)。
    • 修复了 PlayerControlView 快进按钮中的数字未对齐的问题 (#547)。
  • DASH 扩展程序:
    • 在 DASH 清单中将“f800”解析为杜比的声道数 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 兼容性问题,即未将可为 null 的泛型类型形参和可为 null 的数组元素类型检测为可为 null。例如,TrackSelectorResultSimpleDecoder 方法参数 (#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.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)LoadingInfo 包含其他参数,包括 playbackSpeedlastRebufferRealtimeMs,以及现有的 playbackPositionUs
    • 增强了 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)。
    • 添加了使用查询参数 (#553) 传输通用媒体客户端数据 (CMCD) 的功能。
    • 修复了 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 经典版支持。
  • 音频:
    • 添加了对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析了 MP4 中 lpcm 的 PCM 编码。
    • 添加了对提取 MP4 中的 Vorbis 音频的支持。
    • 添加了 AudioSink.getFormatOffloadSupport(Format),用于通过 DefaultAudioOffloadSupportProvider 检索接收器可为格式提供的分流支持级别。它会返回包含 isFormatSupportedisGaplessSupportedisSpeedChangeSupported 的新 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.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
    • onExperimentalSleepingForOffloadChanged 重命名为 onSleepingForOffloadChanged,并将 onExperimentalOffloadedPlayback 重命名为 onOffloadedPlayback
    • 将音频分流模式相关的 TrackSelectionParameters 接口和定义移至内部 AudioOffloadPreferences 类。
    • AnalyticsListenerAudioRendererEventListenerAudioSink.Listener 添加 onAudioTrackInitializedonAudioTrackReleased 回调。
    • 修复了 DTS Express 音频缓冲区下溢问题 (#650)。
    • 修复了以下 bug:E-AC3-JOC 的功能检查会抛出 IllegalArgumentException (#677)。
  • 视频:
    • 允许 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.queueInputBitmapframeRatedurationUs 参数更改为 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 级别上轻松识别来自通知的调用。
    • 修复了连接到旧版 MediaSessionCompatMediaController.getCurrentPosition() 不前进的 bug。
    • 添加了 MediaLibrarySession.getSubscribedControllers(mediaId) 以方便使用。
    • 替换 MediaLibrarySession.Callback.onSubscribe() 以断言控制器订阅的父 ID 的可用性。如果成功,则接受订阅并立即调用 notifyChildrenChanged() 以通知浏览器 (#561)。
    • 为 Automotive OS 添加了会话演示模块,并为 Android Auto 启用了会话演示。
    • COMMAND_GET_TIMELINE 不适用于媒体通知控制器时,请勿设置框架会话的队列。如果 Android Auto 作为客户端控制器从框架会话中读取数据,则会导致 Android Auto 界面中的 queue 按钮不显示 (#339)。
    • 默认使用 DataSourceBitmapLoader 而不是 SimpleBitmapLoader#271#327)。
    • 添加了 MediaSession.Callback.onMediaButtonEvent(Intent),允许应用替换默认的媒体按钮事件处理。
  • 界面:
    • 为 Wear OS 设备添加了 Player.Listener 实现,该实现通过启动系统对话框来处理因 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT 导致的播放抑制,从而允许用户连接合适的音频输出设备(例如蓝牙耳机)。如果在可配置的超时时间内(默认值为 5 分钟)连接了合适的设备,监听器将自动恢复播放。
  • 下载内容:
    • DownloadService 声明“数据同步”前台服务类型,以实现 Android 14 兼容性。使用此服务时,应用还需要在清单中添加 dataSync 作为 foregroundServiceType,并添加 FOREGROUND_SERVICE_DATA_SYNC 权限 (#11239)。
  • HLS 扩展程序:
    • 刷新 HLS 直播播放列表时,使用根据上次加载开始时间(而非上次加载完成时间)计算出的间隔(#663)。
  • DASH 扩展程序:
    • 允许在分段模板网址中包含多个相同的 DASH 标识符。
    • 添加了对在提取期间解析字幕的实验性支持。此版本更好地支持合并重叠的字幕,包括解决在字幕片段之间过渡时出现的闪烁问题。您可以使用 DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 启用此功能 (#288)。
  • RTSP 扩展程序:
    • 修复了可能导致回退到 TCP 时出现 IndexOutOfBoundsException 或在某些情况下播放挂起的问题。
    • 在返回 RtspMediaPeriod 的加载状态时,检查 RTSP 设置中的状态 (#577)。
    • 忽略 Options 响应公共标头中的自定义 RTSP 请求方法 (#613)。
    • 在发送 keep-alive RTSP Options 请求的时间间隔中使用 RTSP 设置响应超时值 (#662)。
  • 解码器扩展程序(FFmpeg、VP9、AV1、MIDI 等):
    • 发布 MIDI 解码器模块,该模块支持使用 Jsyn 库合成音频来播放标准 MIDI 文件。
    • 添加 DecoderOutputBuffer.shouldBeSkipped 以直接标记不需要呈现的输出缓冲区。此方法优于即将弃用的 C.BUFFER_FLAG_DECODE_ONLY
    • 添加了 Decoder.setOutputStartTimeUsSimpleDecoder.isAtLeastOutputStartTimeUs,以允许解码器在开始时间之前舍弃仅用于解码的样本。此方法应优先于将被弃用的 Buffer.isDecodeOnly
    • 修复了将 MIDI 解码器制品发布到 Maven 制品库的 bug。相应制品已重命名为 media3-exoplayer-midi (#734)。
  • Leanback 扩展:
    • 修复了停用 Surface 可能会导致 Leanback 代码中出现 ArithmeticException 的 bug (#617)。
  • 测试实用程序:
    • 使 TestExoPlayerBuilderFakeClock 与 Espresso 界面测试和 Compose 界面测试兼容。此修复解决了一个 bug,该 bug 会导致在 Espresso 或 Compose 视图互动期间播放以不确定的方式前进。
  • 移除了已废弃的符号:
    • 移除了 TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)。请改用 Composition.Builder.setHdrMode(int) 并将 Composition 传递给 Transformer.start(Composition, String)
    • 移除了已弃用的 DownloadNotificationHelper.buildProgressNotification 方法,改用不含弃用标记且采用 notMetRequirements 参数的方法。

版本 1.2.0-rc01

2023 年 11 月 1 日

使用 1.2.0 稳定版

版本 1.2.0-beta01

2023 年 10 月 19 日

使用 1.2.0 稳定版

版本 1.2.0-alpha02

2023 年 9 月 29 日

使用 1.2.0 稳定版

版本 1.2.0-alpha01

2023 年 8 月 17 日

使用 1.2.0 稳定版

版本 1.1.0

版本 1.1.1

2023 年 8 月 16 日

  • 通用库:
    • 从所有模块中移除了意外添加的 multidex 依赖项 (#499)。
  • ExoPlayer:
    • 修复了 PlaybackStatsListener 中的问题,即在清除播放列表后创建了虚假的 PlaybackStats
    • 向通用媒体客户端数据 (CMCD) 日志记录添加了以下字段:流式传输格式 (sf)、流类型 (st)、版本 (v)、最高比特率 (tb)、对象时长 (d)、测量的吞吐量 (mtp) 和对象类型 (ot) (#8699)。
  • 音频:
    • 修复了在播放非常短的文件时 Player.getState() 从不转换为 STATE_ENDED 的 bug (#538)。
  • 音频分流:
    • 根据 RFC 7845,将 Ogg ID 标头和注释标头页面附加到比特流,以实现分流的 Opus 播放。
  • 视频:
    • H.265/HEVC:修复了对 SPS 短期和长期引用图片信息的解析。
  • 文本:
    • CEA-608:更改了提示截断逻辑,现在仅考虑可见文本。 之前,在将提示长度限制为 32 个字符时,缩进和制表符偏移量也包含在内(这在技术上符合规范)(#11019)。
  • IMA 扩展程序:
    • 将 IMA SDK 版本提升至 3.30.3。
  • 会话:
    • 向控制器的状态添加自定义布局,并提供用于访问该布局的 getter。当自定义布局发生变化时,系统会调用 MediaController.Listener.onCustomLayoutChanged。如果应用想要向不同的 Media3 控制器发送不同的自定义布局,可以在 MediaSession.Callback.onConnect 中使用 AcceptedResultBuilder 来确保在连接完成后,控制器可以使用自定义布局。
    • 修复了 MediaLibraryServiceLegacyStub 向不支持此功能的 Result 发送错误,从而产生 UnsupportedOperationException 的问题 (#78)。
    • 修复了 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)。
    • 向播放器添加命令:
      • 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) 的支持。以下字段(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 相关联。
    • 通过添加时间轴参数来更改 ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) 的签名,该参数包含以 UID 作为键的映射中的周期。这是为了避免多周期直播出现并发问题。
    • 废弃了 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)
    • 修复了以下 bug:如果在输入帧等待处理时视频流结束信号发出,转换可能会卡住(导致混合器超时)。
    • 通过 MediaCodecList 查询编解码器,而不是使用 findDecoder/EncoderForFormat 实用程序,以扩大支持范围。
    • 移除了 DefaultEncoderFactory 中的 B 帧配置,因为该配置在某些设备上无法正常运行。
  • 轨道选择:
    • 添加了 DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange(默认处于停用状态)。启用后,当渲染器功能发生变化时,DefaultTrackSelector 将触发新的轨道选择。
  • 提取器:
    • Ogg:修复了在时长较长的文件中搜索时的 bug (#391)。
    • FMP4:修复了 TimestampAdjuster 使用来自 emsg Atom 的元数据样本时间初始化错误的时间戳偏移量的问题 (#356)。
  • 音频:
    • 修复了以下 bug:当隧道传输处于启用状态且 AudioProcessors 处于有效状态时,某些播放会失败,例如无缝剪辑 (#10847)。
    • 在直接播放(分流)中将 Opus 帧封装在 Ogg 数据包中。
    • 通过分流调度在睡眠期间外推当前位置。
    • 添加了 Renderer.release()AudioSink.release(),用于在播放器生命周期结束时释放资源。
    • 监听 DefaultAudioSink 中的音频功能变化。在 DefaultAudioSink 的构造函数中添加必需参数 contextDefaultAudioSink 将使用此参数注册为 AudioCapabilitiesReceiver 的监听器,并在收到有关功能更改的通知时更新其 audioCapabilities 属性。
    • 通过 AudioSink.Listener 接口中的新事件 onAudioCapabilitiesChanged 和触发 onRendererCapabilitiesChanged 事件的新接口 RendererCapabilities.Listener 传播音频功能变更。
    • 添加了 ChannelMixingAudioProcessor,用于将缩放/混音应用于音频渠道。
    • DecoderDiscardReasons 添加了新的 int 值 DISCARD_REASON_AUDIO_BYPASS_POSSIBLE,以便在音频功能发生变化后,如果可能,舍弃旁路模式下的音频解码器。
    • 添加了对 DTS Express 和 DTS:X 的直接播放支持 (#335)。
  • 视频:
    • 使 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 传递给 Player(如果它们具有 LocalConfiguration,例如 URI)(#282)。
    • 在 Android 12 及更低版本的紧凑型媒体通知视图中,默认添加“跳转到上一个”和“跳转到下一个”命令按钮 (#410)。
    • MediaSession.Callback.onAddMediaItems 添加默认实现,以允许将请求的 MediaItems 传递给 Player(如果它们具有 LocalConfiguration,例如 URI)(#282)。
    • 在 Android 12 及更低版本的紧凑型媒体通知视图中,默认添加“跳转到上一个”和“跳转到下一个”命令按钮 (#410)。
  • 界面:
    • 添加了实用程序方法 shouldShowPlayButtonhandlePlayPauseButtonAction,用于编写带有播放/暂停按钮的自定义界面元素。
  • RTSP 扩展程序:
    • 对于 MPEG4-LATM,如果 Describe Response SDP 消息中缺少 profile-level-id 值,则使用默认值 (#302)。
    • 如果 DESCRIBE 响应标头中存在基本 URI,则使用该 URI 从 RTSP 会话解析相对路径 (#11160)。
  • DASH 扩展程序:
    • 针对多周期 DASH 流,从 MediaLoadData.startTimeMsMediaLoadData.endTimeMs 中移除了媒体时间偏移量。
    • 修复了重新准备多周期直播 DASH 媒体源时出现 IndexOutOfBoundsException 的 bug (#10838)。
  • HLS 扩展程序:
    • 添加 HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) 可设置加载线程等待 TimestampAdjuster 初始化的超时时间。如果初始化在超时之前未完成,系统会抛出 PlaybackException,以避免播放无限期停滞。默认情况下,超时时间设置为零 (#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 参数的选项。
    • 移除了已废弃的字符集 String 常量(ASCII_NAMEUTF8_NAMEISO88591_NAMEUTF16_NAMEUTF16LE_NAME),改用 kotlin.text 软件包、java.nio.charset.StandardCharsetscom.google.common.base.Charsets 中的 Kotlin 字符集。
    • 移除了已弃用的 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)
    • 移除了 4 个已废弃的 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 时,MediaController 不会更新其可用命令。
    • 修复了以下 bug:在 API 30 上,当系统界面调用 Callback.onGetLibraryRoot 时,如果 params.isRecent == trueMediaLibraryService,则 MediaLibraryService 无法返回 null (#355)。
    • 修复了 MediaSessionServiceMediaLibraryService 的内存泄漏问题 (#346)。
    • 修复了以下 bug:MediaSession 中同时包含 Timeline 和位置更新可能会导致 MediaController 抛出 IllegalStateException

版本 1.0.1

2023 年 4 月 18 日

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

此版本与 ExoPlayer 2.18.6 版本相对应。

  • 核心库:
    • 在跳转到默认位置时重置目标直播流替换 (#11051)。
    • 修复了媒体中空白的样本流可能导致播放卡住的 bug。
  • 会话:
    • 修复了以下 bug:旧版 MediaSessionCompat 发布的多个相同队列项会导致 MediaController 中出现异常 (#290)。
    • 添加了从 MediaSession.broadcastCustomCommand 到旧版 MediaControllerCompat.Callback.onSessionEvent 的缺失转发 (#293)。
    • 修复了调用 MediaSession.setPlayer 不会更新可用命令的 bug。
    • 修复了以下问题:如果从 MediaController 发送的 TrackSelectionOverride 实例引用了具有 Format.metadata 的群组,则会被忽略 (#296)。
    • 修复了以下问题:需要 Player.COMMAND_GET_CURRENT_MEDIA_ITEM 才能通过旧版 MediaSessionCompat 访问元数据。
    • 修复了以下问题:当在 MediaSessionService 中使用后台线程上的 MediaSession 实例时,会导致崩溃 (#318)。
    • 修复了以下问题:库声明了媒体按钮接收器,但应用并非有意为之 (#314)。
  • 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 版本相对应。

  • 核心库:
    • 修复了 API 33 上的网络类型检测问题(#10970)。
    • 修复了调用 ExoPlayer.isTunnelingEnabled 时的 NullPointerException (#10977)。
  • 下载内容:
    • 使要合并的两个片段的开始时间的最大差值可在 SegmentDownloader 和子类中配置 (#248)。
  • 音频:
    • 修复了三星设备上无缝 MP3 播放中断的问题 (#8594)。
    • 修复了以下 bug:停用音频后立即设置的播放速度可能会被之前的速度更改所覆盖 (#10882)。
  • 视频:
    • 将 HEVC HDR10 格式映射到 HEVCProfileMain10HDR10 而不是 HEVCProfileMain10
    • 针对 Chromecast with Google TV 和 Lenovo M10 FHD Plus 上导致 60fps AVC 流被标记为不受支持的设备问题添加了解决方法 (#10898)。
    • 修复了播放帧速率远高于屏幕刷新率的媒体时出现的帧释放性能问题。
  • Cast:
    • 修复了在媒体项之间过渡时出现的瞬态 STATE_IDLE 问题 (#245)。
  • RTSP:
    • 捕获在解析无效 RTSP Describe 响应消息时抛出的 IllegalArgumentException (#10971)。
  • 会话:
    • 修复了通知播放/暂停按钮未随播放器状态更新的 bug (#192)。
  • IMA 扩展程序:
    • 修复了以下 bug:由于未收到第一个(也是唯一一个,如果没有任何广告)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 Atom 时缺少必需的示例说明 (stsd),则抛出 ParserException,而非 NullPointerException
    • 在 fMP4 中直接跳转到同步帧时会正确跳过示例 (#10941)。
  • 音频:
    • 使用压缩音频格式比特率来计算直接播放(直通)中 AudioTrack 的最小缓冲区大小。
  • 文本:
    • 修复了当字幕文件不包含任何提示时,向 Subtitle.getEventTime 传递无效(负数)索引的 TextRenderer
    • SubRip:如果 UTF-16 文件以字节顺序标记开头,请添加对此类文件的支持。
  • 元数据:
    • 在 ID3 v2.4 允许的情况下,解析来自 ID3 帧的多个 null 分隔值。
    • 添加了 MediaMetadata.mediaType,以指示内容类型或元数据描述的文件夹类型。
    • 添加了 MediaMetadata.isBrowsable,以替代 MediaMetadata.folderType。下一个版本中将废弃文件夹类型。
  • DASH:
    • 为图片适配集添加了完整的解析,包括图块计数 (#3752)。
  • 界面:
    • 修复了已废弃的 PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener),以确保将可见性更改传递给已注册的监听器 (#229)。
    • 修复了使用从右到左 (RTL) 布局时 PlayerView 内中心播放器控件的排序问题 (#227)。
  • 会话:
    • 添加了抽象 SimpleBasePlayer,以帮助为自定义播放器实现 Player 接口。
    • 添加了辅助方法,用于将平台会话令牌转换为 Media3 SessionToken (#171)。
    • 使用 onMediaMetadataChanged 来触发平台媒体会话的更新 (#219)。
    • 将媒体会话添加为 DefaultMediaNotificationProvidergetMediaButtons() 的参数;为清楚起见,还使用了不可变列表 (#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)。
    • 在单项播放列表中调用 seekToNextseekToPrevious 时,发送缺失的 onMediaItemTransition 回调 (#10667)。
    • 添加了 Player.getSurfaceSize,用于返回呈现视频时所用 Surface 的大小。
    • 修复了在播放器释放期间移除监听器可能会导致 IllegalStateException 的 bug (#10758)。
  • build:
    • 强制执行最低 compileSdkVersion 以避免编译错误 (#10684)。
    • 避免于包含在另一 Gradle build 中时发布块。
  • 轨道选择:
    • 如果显示设备不支持杜比视界,请改选轨道。 (#8944)。
  • 下载内容:
    • 修复了由于使用同一 PriorityTaskManager 同时下载和播放而导致的 ProgressiveDownloader 中潜在的无限循环 (#10570)。
    • 立即显示下载通知 (#183)。
    • 将并行下载移除次数限制为 1 次,以免过度创建线程 (#10458)。
  • 视频:
    • 如果显示设备不支持杜比视界,请尝试改用替代解码器。 (#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:
    • 添加了 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 后会导致使用 reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGEDPlayer.Listener#onTimelineChanged 进行调用 (#9889)。
    • 对于渐进式媒体,仅在缓冲位置添加所选轨道 (#10361)。
    • 允许将自定义日志记录器用于所有 ExoPlayer 日志输出 (#9752)。
    • 修复了在 DefaultMediaSourceFactory 中实现 setDataSourceFactory 的问题,后者以前在某些情况下无法正常运行 (#116)。
  • 提取器:
    • 修复了解析 H265 短期引用图片集的问题 (#10316)。
    • 修复了解析 esds 框中比特率的问题 (#10381)。
  • DASH:
    • 从清单中解析 ClearKey 许可网址 (#10246)。
  • 界面:
    • 确保 TalkBack 在播放控件菜单中公布当前有效的速度选项 (#10298)。
  • RTSP:
    • 添加了 VP8 碎片化数据包处理机制 (#110)。
  • Leanback 扩展:
    • 监听 LeanbackAdapter 中的 playWhenReady 更改 (10420)。
  • Cast:
    • 把已传递到播放列表方法的 MediaItem 用作 CastTimeline 中的 Window.mediaItem#25#8212)。
    • 使用 CastPlayer 来支持 Player.getMetadata()Listener.onMediaMetadataChanged() (#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 时轨道重置太频繁的 bug,例如侧载 (side-loading) 字幕和播放过程中更改所选字幕时 (#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。这包括“取消废弃” (un-deprecating) Player.Listener.onTracksChanged 方法名称,但使用的是不同的参数类型。
    • 更改了 DefaultTrackSelector.buildUponParametersDefaultTrackSelector.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
  • 提取器:
    • 添加了对 AVI 的支持 (#2092)。
    • Matroska:解析了 Opus 轨道的 DiscardPadding
    • MP4:解析了 esds 框中的比特率。
    • Ogg:允许重复的 Opus ID 和注释标头 (#10038)。
  • 界面:
    • 修复了 useController=false 时将事件传递给 PlayerView 上设置的 OnClickListener 的问题 (#9605)。此外,还修复了针对所有视图配置将事件传递给 OnLongClickListener 的问题。
    • 修复了将 ACTION_UP 之前退出 PlayerView 边界的一系列触摸事件错误处理为点击的问题 (#9861)。
    • 修复了点按操作可能会切换播放,而不是隐藏控件的 PlayerView 无障碍功能问题 (#8627)。
    • 重写了 TrackSelectionViewTrackSelectionDialogBuilder,以使用 Player 接口(而不是 ExoPlayer)。这样做将允许视图与其他 Player 实现一起使用,并移除界面模块对 ExoPlayer 模块的依赖关系。这是一项重大变更。
    • 不在 PlayerView 轨道选择器中显示强制文字轨道;如果选择了“None”,则保留一个合适的强制文字轨道 (#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 的引用。
  • 流畅的流式传输:
    • 禁止将 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+,以避免 CMake bug 导致 Android Studio 的 Gradle 同步失败 (#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.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.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(),这样,替换 buildVideoRenderers()buildAudioRenderers()DefaultRenderersFactory 子类就可以访问编解码器适配器工厂,并将其传递给它们创建的 MediaCodecRenderer 实例。
    • 将 ICY 标头字段 namegenre 分别传播到 MediaMetadata.stationMediaMetadata.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 解码器。
  • 音频:
    • 修复了杜比全景声 (E-AC3-JOC) 的解码器回退逻辑,以在需要时使用兼容的 E-AC3 解码器。
    • AudioCapabilities API 更改为要求明确传递 AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES 而不是 null
    • 允许通过将 AudioTrackBufferSizeProvider 注入 DefaultAudioSink 来自定义 AudioTrack 缓冲区空间的计算。(#8891)。
    • 在请求的缓冲区空间大于 1 MB 时重试创建 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)。
  • 界面:
    • 修复了使用某些主题时 StyledPlayerView 快退按钮和快进按钮中数字的颜色 (#9765)。
    • 正确解析播放速度字符串 (#9811)。
  • DASH:
    • 将解析出来的基本属性和补充属性添加到 Representation (#9579)。
    • 支持 forced-subtitle 轨道角色 (#9727)。
    • 停止将 main 轨道角色解读为 C.SELECTION_FLAG_DEFAULT
    • 修复了未声明 DVB 命名空间的清单的基本网址排除逻辑 (#9856)。
    • 支持相对 MPD.Location 网址 (#9939)。
  • HLS:
    • 为仅音频的 HLS 流正确地填充 Format.label (#9608)。
    • 默认使用无块准备来缩短启动时间。如果您的呈现内容包含在主播放列表中声明的多路复用字幕轨道,您应该将其添加到主播放列表中以供播放,或使用 HlsMediaSource.Factory.setAllowChunklessPreparation(false) 关闭无块准备。
    • 支持在 HLS 中进行关键帧精确定位 (#2882)。
  • RTSP:
    • 提供客户端 API 以替换用于任何服务器连接的 SocketFactory (#9606)。
    • 如果基本和摘要式身份验证方式都有,优先选用摘要式身份验证方式 (#9800)。
    • 当 RTSP 轨道时间不可用时及时应对 (#9775)。
    • 忽略无效的 RTP-Info 标头值 (#9619)。
  • 转换器:
    • 将要求的最低 API 版本提高到 21。
    • TransformationException 现已用于描述转换期间发生的错误。
    • 添加了 TransformationRequest 以指定转换选项。
    • 允许注册多个监听器。
    • 修复了当读取了部分编解码器输出内容时转换器卡住的问题。
    • 修复了在释放多路复用器抛出项时 Transformer.getProgress 中潜在的 NPE 问题。
    • 添加了用于应用转换的演示版应用。
  • MediaSession 扩展程序:
    • 默认情况下,MediaSessionConnector 现会在停止时清除播放列表。希望保留播放列表的应用可以在连接器上调用 setClearMediaItemsOnStop(false)
  • Cast 扩展程序:
    • 修复了导致 CastPlayer 无法正确调用 onIsPlayingChanged 的 bug (#9792)。
    • 支持音频元数据,包括带有 DefaultMediaItemConverter 的海报图片 (#9663)。
  • 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)。
  • 移除了已废弃的符号:
    • 移除了 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 接口。
  • 用于构建媒体播放界面的界面组件。
  • 其他库中用于 ExoPlayer 的模块封装功能,例如通过 IMA SDK 插入广告。

如需了解详情,请参阅 Media3 GitHub 项目

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