Media3

媒体用例的支持库。
最新更新 稳定版 候选版 Beta 版 Alpha 版
2024 年 11 月 13 日 1.4.1 1.5.0-rc01 - -

声明依赖项

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

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

Groovy

dependencies {
    def media3_version = "1.4.1"

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

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

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

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

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

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

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

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

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

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

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

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

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

Kotlin

dependencies {
    val media3_version = "1.4.1"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

反馈

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

版本 1.5

1.5.0-rc01 (2024-11-13)

1.5.0-beta01 版本以来,此版本包含以下更改

  • ExoPlayer

    • SntpClient 添加一个 setter 方法,用于设置自上次更新后客户端重新初始化的最大经过时间(#1794)。
    • 选择视频轨道时考虑语言因素。默认情况下,如果可用,则选择与所选音频轨道语言匹配的“主”视频轨道。可以使用 TrackSelectionParameters.Builder.setPreferredVideoLanguage(s) 表达显式视频语言偏好。
    • DefaultTrackSelector.selectVideoTrack() 方法添加 selectedAudioLanguage 参数。
    • MediaSourceEventListener.onLoadStarted 及其对应的 MediaSourceEventListener.EventDispatcher 方法添加 retryCount 参数。
    • 修复了在多段 DASH 流中,播放列表项或片段的时长与实际内容不匹配时,可能会导致在项末尾出现帧冻结的错误(#1698)。
  • 转换器
    • 更新 VideoFrameProcessor.registerInputStreamVideoFrameProcessor.Listener.onInputStreamRegistered 的参数,使用 Format
  • 提取器
    • 修复了 MP4 文件中 mdhd 盒的媒体时长解析,以处理 -1 值(#1819)。
    • 添加对识别 MP4 文件中 h263 盒的支持,用于 H.263 视频(#1821)。
  • 数据源
    • DataSourceContractTest:断言 DataSource.getUri() 返回解析后的 URI(如文档所述)。如果解析后的 URI 与请求的 URI 不同,则测试可以使用新的 DataSourceContractTest.TestResource.Builder.setResolvedUri() 方法进行指示。
    • DataSourceContractTest:断言在 open() 调用失败(由于资源“未找到”)之后,并且在后续 close() 调用之前,DataSource.getUri()getResponseHeaders() 返回其“打开”值。
      • 重写 DataSourceContractTest.getNotFoundResources() 允许测试子类提供多个“未找到”的资源,以及提供任何预期的标头。这可以区分 HTTP 404(带标头)和“服务器未找到”(无标头)。
  • 文本
    • 修复了 H.264 MPEG-TS 流中 CEA-608 字幕无法输出的问题(这是在 1.5.0-alpha01 中由 https://github.com/androidx/media/commit/03a205f220ecf7681f85f8a752227e3986e257ff 引入的)。
    • 支持 Dolby Vision 内容中的 CEA-608 字幕(#1820)。
  • RTSP 扩展
    • 修复了在解析带有报头扩展的 RTP 数据包时崩溃的问题(#1225)。

版本 1.5.0-beta01

2024 年 10 月 30 日

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

  • 通用库
    • 从手动内联的内部类中删除 @DoNotInline 注解,这些内部类旨在避免 运行时类验证失败。最新版本的 R8 现在会自动内联此类调用以避免运行时失败(因此不再需要手动内联)。库的所有 Gradle 用户都必须已经在使用一个使用 R8 版本的 Android Gradle 插件,该版本执行此操作,由于 compileSdk = 35。使用非 Gradle 构建系统的库用户需要确保其 R8 等效的缩减/混淆步骤执行类似的自动内联过程,以避免运行时类验证失败。此更改已在其他 AndroidX 库中完成
  • ExoPlayer

    • 修复了当 MediaCodec 在异步模式(API 31+ 上的默认行为)下操作时,MediaCodec.CryptoException 有时会被报告为“意外运行时错误”的问题。
    • 使用 PreloadMediaSource.PreloadControl.onContinueLoadingRequested() 传递 bufferedDurationUs 而不是 bufferedPositionUs。还将 DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS 更改为 DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS,然后应用程序需要传递一个值,该值表示从默认起始位置开始的特定持续时间,相应的媒体源必须使用此 IntDef 预加载,而不是位置。
    • 添加 ForwardingRenderer 实现,该实现将所有方法调用转发到另一个渲染器(1703)。
    • 添加播放列表中下一项的预加载。应用程序可以通过相应地调用 ExoPlayer.setPreloadConfiguration(PreloadConfiguration) 来启用预加载。默认情况下,预加载已禁用。当启用并且不干扰播放时,DefaultLoadControl 将预加载限制为仅在播放器未加载播放时启动和继续。应用程序可以通过相应地实现 LoadControl.shouldContinuePreloading() 来更改此行为(例如,在 DefaultLoadControl 中重写此方法时)。LoadControl 的默认实现会在应用程序使用 LoadControl 的自定义实现时禁用预加载。
    • 添加方法 MediaSourceEventListener.EventDispatcher.dispatchEvent() 以允许调用子类侦听器的事件(1736)。
    • 添加 DefaultPreloadManager.Builder,用于构建 DefaultPreloadManagerExoPlayer 实例,并使用一致的共享配置。
    • LoadControl.onTracksSelected() 中删除 Renderer[] 参数,因为 DefaultLoadControl 实现可以从 ExoTrackSelection[] 中检索流类型。
    • 弃用 DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) 并将方法标记为 final 以防止覆盖。应改用新的 DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
    • 报告 MergingMediaSource 中辅助源的 MediaSourceEventListener 事件。这将导致为旁加载字幕(使用 MediaItem.LocalConfiguration.subtitleConfigurations 添加的字幕)报告加载开始/错误/取消/完成事件,这可能显示为从 AnalyticsListener 发出的重复加载事件。
    • 防止字幕和元数据错误完全停止播放。相反,问题轨道将被禁用,并且其余轨道的播放将继续(#1722)。
      • 在新字幕处理(在提取期间),相关的解析(例如无效字幕数据)和加载错误(例如 HTTP 404)通过 onLoadError 回调发出。
      • 在旧字幕处理(在渲染期间),只有相关的加载错误通过 onLoadError 回调发出,而解析错误则被静默忽略(这是预先存在的行为)。
  • 转换器
    • 对于图像导出,使用 MediaItem.Builder.setImageDurationMs 设置图像持续时间是强制性的。
    • 添加对音频 EditedMediaItems 序列中间隙的导出支持。
  • 轨道选择
    • DefaultTrackSelector:在其他因素相等的情况下,优先选择基于对象的音频而不是基于通道的音频。
  • 提取器
    • 修复了在处理 MP4 文件中的编辑列表时,对于非关键帧媒体起始位置的预卷样本处理问题(#1659)。
    • 通过使用 Mp4ExtractorFragmentedMp4Extractormdhd 盒中的媒体时长改进了帧率计算(#1531)。
    • 修复了 MP4 编辑列表中 media_time 的错误缩放问题。虽然 segment_duration 已经使用电影时间尺度正确缩放,但 media_time 现在使用轨道时间尺度正确缩放,如 MP4 格式标准所指定(#1792)。
    • 处理具有编辑列表的 MP4 中 endIndices 计算中的乱序帧问题(#1797)。
  • 音频
    • 修复了在跳转过程中可能出现的爆音问题。
    • 修复了 Sonic 的时间拉伸/音调转换算法的截断错误累积问题。
    • 修复了 SpeedChangingAudioProcessor 中导致输出帧丢失的错误。
  • 视频
    • 添加了解决 Galaxy Tab S7 FE 上设备问题的变通方法,该问题会导致 60fps 安全 H264 流被标记为不受支持(#1619)。
    • 添加了解决编解码器在最后一个样本后卡住且不返回流结束信号的变通方法。
  • 文本
    • 确保在 HLS 中,具有非常大字幕时间戳的 WebVTT(当以微秒表示并乘以 90,000 MPEG 时间基时,会溢出 64 位 long)能够显示(#1763)。
  • 元数据
    • C.TRACK_TYPE_METADATA 类型分配给包含 icy 或 vnd.dvb.ait 内容的轨道。
  • DRM
    • 修复了在打开 DRM 会话失败后,DefaultDrmSession.requiresSecureDecoder 引发的 IllegalStateException。此问题是在 1.5.0-alpha01 中引入的。
  • 复用器
  • IMA 扩展
    • 修复了服务器端插入的没有预卷的 DAI 流在播放到最后一个中卷之后会导致 ArrayIndexOutOfBoundsException 的错误(#1741)。
  • 会话
    • 修复了导致从 MediaBrowser 发送的自定义命令分派到 MediaSessionCompat.Callback 而不是连接到旧版服务时的 MediaBrowserServiceCompat 方法变体的错误。这阻止了 MediaBrowser 接收旧版服务发回的实际返回值(#1474)。
    • 处理某些制造商的设备在设置媒体按钮意图的广播接收器时抛出的 IllegalArgumentException#1730)。
    • 添加媒体项的命令按钮。这为 Media3 API 添加了旧版库中称为 Custom browse actions 的内容,并使用 MediaBrowserCompat。请注意,使用 Media3 命令按钮,媒体项可用于 MediaBrowserMediaController。请参阅 AAOS 的自定义浏览操作
    • 修复了 Media3 控制器有时无法在请求 play() 后让会话应用程序启动前台服务的错误。
    • CommandButton.Builder.setIconUri 限制为仅接受内容 Uri。
    • 在连接到旧版 MediaBrowserCompat 时,将 Media3 浏览器的连接提示传递给初始 MediaBrowserCompat。服务可以在第一次调用 onGetRoot() 时接收作为根提示传递的连接提示。
    • 修复了连接到旧版浏览器服务的 MediaBrowser 在浏览器订阅 parentid 后未收到服务发送的错误的错误。
    • 改进互操作性行为,以便连接到旧版 MediaBrowserService 的 Media3 浏览器在订阅父项时不会两次请求 parentId 的子项。
  • UI
    • 使 PlayerView-in-Compose-AndroidView 变通方法中的拉伸/裁剪视频成为可选,因为 XML 基于共享转换存在问题。在 AndroidView 内部使用 PlayerView 的应用程序需要调用 PlayerView.setEnableComposeSurfaceSyncWorkaround 以选择加入(#1237#1594)。

    • setFullscreenButtonState添加到PlayerView,以便能够按需更新全屏按钮的图标,即超出频带且不响应点击交互(#1590#184)。
    • 修复了如果存在应用定义的文本轨道选择偏好设置,则文本选择中的“无”选项无法正常工作的错误。
  • 平滑流扩展
    • 修复了在播放带有文本轨道的SmoothStreaming流时发生的Bad magic number for Bundle错误(#1779)。
  • RTSP 扩展
    • 修复了包含编码@字符的URL的用户数据删除问题(#1138)。
  • 解码器扩展(FFmpeg、VP9、AV1等)
    • 在Android 15上为解码器扩展添加16 KB页面支持(#1685)。
  • 投射扩展
    • 停止在CastSession断开连接后清理时间线,这使得发送方应用能够在断开连接后本地恢复播放。
    • 在提供Context时填充CastPlayer的DeviceInfo。这使得能够将MediaSession链接到RoutingSession,这对于集成输出切换器是必要的(#1056)。
  • 移除已弃用的符号
    • 移除已弃用的DefaultEncoderFactory构造函数。请改用DefaultEncoderFactory.Builder

版本1.5.0-alpha01

2024年9月10日

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

  • 通用库
    • 添加ForwardingSimpleBasePlayer,允许在进行少量调整的同时转发到另一个播放器,同时确保完全一致性和监听器处理(#1183)。
    • SimpleBasePlayer.State.playlist替换为getPlaylist()方法。
    • 添加SimpleBasePlayer.State.Builder.setPlaylist()的覆盖方法,以便直接指定Timeline以及当前的TracksMetadata,而不是构建播放列表结构。
    • minSdk增加到21(Android Lollipop)。这与所有其他AndroidX库保持一致。
    • 添加androidx.media3:media3-common-ktx构件,该构件提供构建在Common库之上的Kotlin特定功能
    • Player.listen挂起扩展函数添加到media3-common-ktx库中,以旋转协程以监听Player.Events
  • ExoPlayer

    • MediaCodecRenderer.onProcessedStreamChange()现在可以为每个媒体项目调用。以前它不会为第一个媒体项目调用。使用MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()启用此功能。
    • 添加PreloadMediaSource.PreloadControl.onPreloadError,以允许PreloadMediaSource.PreloadControl实现体在发生错误时采取操作。
    • 添加BasePreloadManager.Listener,将预加载事件传播到应用。
    • 允许更改SNTP客户端超时和超时时重试备用地址(#1540)。
    • 移除MediaCodecAdapter.Configuration.flags,因为该字段始终为零。
    • 允许用户在Wear OS API 35及更高版本(设备支持此功能时)选择内置扬声器进行播放。
    • 将对Context.getSystemService(Context.AUDIO_SERVICE)的阻塞调用延迟到启用音频焦点处理时。这确保了如果未启用音频焦点处理,则不会进行阻塞调用(#1616)。
    • 允许在加载失败时无论缓冲持续时间如何进行播放(#1571)。
    • 添加AnalyticsListener.onRendererReadyChanged(),以指示各个渲染器何时允许播放准备就绪。
  • 转换器
    • 添加SurfaceAssetLoader,它支持通过Surface将视频数据排队到Transformer。
    • ImageAssetLoader通过AssetLoader.onError报告不支持的输入,而不是抛出IllegalStateException
  • 提取器
    • 允许Mp4ExtractorFragmentedMp4Extractor识别后续样本未引用的H264样本。
    • 添加在AmrExtractor中启用基于索引的查找选项。
    • 将有效帧之间超过128kB的MP3文件视为截断(而不是无效)。这意味着末尾带有非MP3数据的文件,且没有其他元数据指示MP3字节的长度,现在会在MP3数据的末尾停止播放,而不是以ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}错误失败(#1563)。
  • 数据源
    • 更新HttpEngineDataSource,以允许从版本S扩展7开始使用,而不是API级别34(#1262)。
  • 音频
    • 如果媒体中存在CTA-2075响度元数据,则自动在编解码器上配置它。
    • 确保在查找时平滑地降低音量。
  • 视频
    • MediaCodecVideoRenderer避免解码既未渲染也未被其他样本用作引用的样本。
    • 在API 35及更高版本上,MediaCodecAdapter现在可以在configure中接收null Surface,并调用一个新的方法detachOutputSurface以移除之前设置的Surface(如果编解码器支持此功能)(MediaCodecInfo.detachedSurfaceSupported)。
    • 在处理onOutputFormatChanged时,如果提供了MediaCodecAdapter提供的像素纵横比值,则使用它们(#1371)。
  • 文本
  • 图像
    • 添加ExternallyLoadedImageDecoder,以便与Glide或Coil等外部图像加载库轻松集成。
  • 数据源
    • 添加FileDescriptorDataSource,这是一种新的DataSource,可用于从FileDescriptor读取(#3757)。
  • 效果
    • 添加DefaultVideoFrameProcessor来解决轻微的SurfaceTexture缩放问题。SurfaceTexture可能包含一个小的缩放比例,该缩放比例会裁剪掉裁剪缓冲区边缘周围的1个纹理边框。现在已对此进行处理,以便输出更接近预期。
    • 加快DefaultVideoFrameProcessor.queueInputBitmap()的速度。因此,使用Transformer将图像导出到视频的速度更快。
  • IMA 扩展
    • 修复了清除播放列表可能导致ImaServerSideAdInsertionMediaSource中出现ArrayIndexOutOfBoundsException的错误。
  • 会话
    • 添加MediaButtonReceiver.shouldStartForegroundService(Intent),以允许应用通过覆盖此方法来抑制传入的用于恢复播放的播放命令。默认情况下,始终启动服务,并且无法抑制播放,而不会导致系统以ForegroundServiceDidNotStartInTimeException错误崩溃服务(#1528)。
  • DASH扩展
    • 添加对段中间开始的时段的支持(#1440)。
  • 解码器扩展(FFmpeg、VP9、AV1等)
    • 添加IAMF解码器模块,该模块支持使用libamf原生库合成音频来播放包含IAMF轨道的MP4文件。
      • 播放支持立体声布局以及具有空间化的5.1,以及可选的头跟踪功能,但目前不支持双声道播放。
  • 投射扩展
    • 停止在CastSession断开连接后清理时间线,这使得发送方应用能够在断开连接后本地恢复播放。
    • 在提供Context时填充CastPlayer的DeviceInfo。这使得能够将MediaSession链接到RoutingSession,这对于集成输出切换器是必要的(#1056)。
  • 测试实用程序
    • DataSourceContractTest现在包含用于验证的测试
      • 输入流read position已更新。
      • 输出缓冲区offset已正确应用。
  • 移除已弃用的符号
    • 移除已弃用的Player.hasPreviousPlayer.hasPreviousWindow()。请改用Player.hasPreviousMediaItem()
    • 移除已弃用的Player.previous()方法。请改用Player.seekToPreviousMediaItem()
    • 移除已弃用的DrmSessionEventListener.onDrmSessionAcquired方法。

版本1.4.0

版本1.4.1

2024年8月27日

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

  • ExoPlayer

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

版本1.4.0

2024年7月25日

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

  • 通用库
    • 将假定的无操作 seek 调用转发到受保护的 BasePlayer.seekTo()SimpleBasePlayer.handleSeek() 方法,而不是忽略它们。如果您在自定义播放器中实现这些方法,则可能需要使用 mediaItemIndex == C.INDEX_UNSET 处理这些额外的调用。
    • 移除对增强型 Java 8 反糖的编译依赖项 (#1312)。
    • 确保传递给 MediaItem.Builder.setImageDurationMs() 的时长对于非图像 MediaItem 被忽略(如文档所述)。
    • 添加 Format.customData 用于存储应用程序提供的关于 Format 实例的自定义信息。
  • ExoPlayer

    • 添加 BasePreloadManager,它根据其 rankingData 定义的优先级协调多个源的预加载。可以通过扩展此类进行自定义。添加 DefaultPreloadManager,它使用 PreloadMediaSource 将源的媒体样本预加载到内存中,并使用一个整数 rankingData 来指示 UI 上项目的索引。
    • LoadControl 的大多数方法中添加 PlayerId,以使 LoadControl 实现能够支持多个播放器。
    • 移除 Buffer.isDecodeOnly()C.BUFFER_FLAG_DECODE_ONLY。无需设置此标志,因为渲染器和解码器将根据时间戳决定是否跳过缓冲区。自定义 Renderer 实现应检查缓冲区时间是否至少为 BaseRenderer.getLastResetPositionUs() 以决定是否应显示样本。自定义 SimpleDecoder 实现可以根据需要检查 isAtLeastOutputStartTimeUs() 或使用 DecoderOutputBuffer.shouldBeSkipped 标记其他缓冲区以跳过它们。
    • 允许 TargetPreloadStatusControl.getTargetPreloadStatus(T) 返回 null 值,以指示不要预加载具有给定 rankingDataMediaSource
    • BasePreloadManager 添加 remove(MediaSource)
    • BasePreloadManager 添加 reset(),以释放所有持有的源,同时保留预加载管理器实例。
    • 添加 ExoPlayer.setPriority()(以及 Builder.setPriority())以定义在 PriorityTaskManager 中使用的优先级值,以及 API 35 中的 MediaCodec 重要性。
    • 修复导致 CMCD 中 bs(缓冲区饥饿)键不正确的上一次重新缓冲时间更新问题 (#1124)。
    • 添加 PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) 以指示源已加载到末尾。这允许 DefaultPreloadManager 和自定义 PreloadMediaSource.PreloadControl 实现预加载下一个源或采取其他操作。
    • 修复在项目末尾跳过静音可能触发播放异常的错误。
    • PreloadMediaSource 添加 clear 以丢弃预加载周期。
    • 添加新的错误代码 PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED,用于在为更高优先级的任务回收编解码器资源时使用。
    • AdsMediaSource 在初始内容媒体准备完成之前加载预播广告 (#1358)。
    • 修复在原始周期已从清单中移除后重新准备多周期 DASH 直播流时,播放移动到 STATE_ENDED 的错误。
    • onTimelineRefreshed() 重命名为 onSourcePrepared(),并将 onPrepared() 重命名为 onTracksSelected(),位于 PreloadMediaSource.PreloadControl 中。还相应地重命名 DefaultPreloadManager.Stage 中的 IntDefs。
    • 添加对动态调度的实验性支持,以更好地将工作与 CPU 唤醒周期对齐,并将唤醒延迟到渲染器可以继续进行时。在设置 ExoPlayer 实例时,可以使用 experimentalSetDynamicSchedulingEnabled() 启用此功能。
    • 添加 Renderer.getDurationToProgressUs()。一个 Renderer 可以实现此方法以返回给 ExoPlayer 渲染器需要前进的时长才能继续进行。如果 ExoPlayer 设置了 experimentalSetDynamicSchedulingEnabled(),则 ExoPlayer 将在计算安排其工作任务的时间时调用此方法。
    • 添加 MediaCodecAdapter#OnBufferAvailableListener 以在输入和输出缓冲区可供 MediaCodecRenderer 使用时发出警报。MediaCodecRenderer 将在收到这些回调时向 ExoPlayer 发出信号,如果 ExoPlayer 设置了 experimentalSetDynamicSchedulingEnabled(),则 ExoPlayer 将安排其工作循环,因为渲染器可以继续进行。
    • 使用数据类代替单个参数来表示 LoadControl 方法。
    • 添加 ExoPlayer.isReleased() 以检查是否已调用 Exoplayer.release()
    • 添加 ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() 以配置 seekToPrevious() 将上一个项目向前跳转的最大位置 (#1425)。
    • 修复一些音频焦点不一致问题,例如,在播放器暂停时未报告完整或短暂的焦点丢失 (#1436)。
    • 修复提取器在初始准备步骤后报告额外音轨可能导致的潜在 IndexOutOfBoundsException (#1476)。
    • ExoPlayer.setVideoEffect() 中的 Effects 将接收已移除渲染器偏移量的时间戳 (#1098)。
    • 修复在提前读取另一个播放列表项目时处理播放器错误时可能发生的潜在 IllegalArgumentException (#1483)。
  • 转换器
    • ExportResult 添加 audioConversionProcessvideoConversionProcess,指示输出文件中相应音轨的制作方式。
    • 放宽修剪优化 H.264 级别检查。
    • 添加对在序列中 SDR 和 HDR 输入媒体之间切换的支持。
    • 添加对合成级音频效果的支持。
    • 添加对将超 HDR 图像转码为 HDR 视频的支持。
    • 修复 DefaultAudioMixer 在重置和重复使用后未输出正确字节数的问题。
    • 解决解码器错误,该错误在处理 PCM 输入时将音频通道数限制为立体声。
    • ExoPlayerAssetLoader 中选择音轨时,忽略音频通道数约束,因为它们仅适用于播放。
    • androidx.media3.transformer.Muxer 接口替换为 androidx.media3.muxer.Muxer 并移除 androidx.media3.transformer.Muxer
    • 修复从内容 URI 方案加载 HEIC 图像的问题。(#1373)。
    • 调整 AudioGraphInput 中的音频音轨时长以改善 AV 同步。
    • 移除 ExportResult.processedInputs 字段。如果您使用此字段获取编解码器详细信息,则改用 DefaultDecoderFactory.listener。如果出现编解码器异常,则编解码器详细信息将在 ExportException.codecInfo 中可用。
  • 提取器
    • MPEG-TS:通过将流的最后一个访问单元传递到样本队列来向前推进确保渲染最后一帧的更改 (#7909)。整合修复以解决仅 I 帧 HLS 流 (#1150) 和 H.262 HLS 流 (#1126) 中出现的问题。
    • MP3:优先使用 Info 帧中的数据大小而不是底层流报告的大小(例如文件大小或 HTTP Content-Length 标头)。这有助于从恒定比特率查找计算中排除不可播放的预告片数据(例如专辑封面),从而使查找更准确 (#1376)。
    • MP3:使用 Info 帧(如果存在)中的帧计数和其他数据来计算恒定比特率查找的平均比特率,而不是从 Info 帧之后的帧的比特率推断,这可能人为地很小,例如 PCUT 帧 (#1376)。
    • 修复 AVI 容器中的 PCM 音频格式提取。
  • 音频
    • 修复用于直通播放的 DTS:X Profile 2 编码属性 (#1299)。
    • 对于卸载播放,在调用 AudioTrack.stop() 之前重置 DefaultAudioSink 中的流完成跟踪字段,以便 AudioTrack.StreamEventCallback#onPresentationEnded 正确识别所有挂起数据何时播放完成。
    • 修复 SilenceSkippingAudioProcessor 中的错误,其中不同音频格式(例如立体声到单声道)之间的转换会导致处理器抛出异常 (#1352)。
    • 实现 MediaCodecAudioRenderer.getDurationToProgressUs(),以便 ExoPlayer 将其主工作循环动态调度到 MediaCodecAudioRenderer 可以继续进行的时间。
  • 视频
    • 修复在播放过程中切换曲面时 Listener.onRenderedFirstFrame() 过早到达的问题。
    • 修复 Dolby Vision 的解码器回退逻辑,以便在需要时使用兼容的 AV1 解码器 (#1389)。
    • 修复在播放过程中启用视频渲染器可能导致的编解码器异常。
  • 文本
    • 修复在跳转位置之前开始的字幕被跳过的问题。此问题仅在 Media3 1.4.0-alpha01 中引入。
    • 更改默认字幕解析行为,使其在提取期间而不是渲染期间发生(请参阅 ExoPlayer 的架构图 以了解提取和渲染之间的区别)。

      • 可以通过同时调用两个方法 MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)TextRenderer.experimentalSetLegacyDecodingEnabled(true) 来覆盖此更改。有关如何将这些组件连接到 ExoPlayer 实例的信息,请参阅自定义文档。这些方法(以及对传统字幕解码的所有支持)将在未来的版本中移除。
      • 具有自定义 SubtitleDecoder 实现的应用需要将其更新为改为实现 SubtitleParser(以及 SubtitleParser.Factory 而不是 SubtitleDecoderFactory)。
    • PGS:修复运行长度解码,以将 0 解析为颜色索引,而不是文字颜色值(#1367)。
    • CEA-708:忽略 rowLock 值。CEA-708-E S-2023 规范指出,无论流中存在哪些值,都应假定 rowLockcolumnLock 均为 true(columnLock 支持未实现,因此实际上始终假定为 false)。
      • 此更改最初包含在 1.3.0-alpha01 发行说明中,但在 1.3.0-rc01 发行版之前意外回退了。此问题现已修复,因此更改再次出现。
    • CEA-708:避免 ExoPlayer 对“设置笔位置”命令的简单处理添加重复的新行(#1315)。
    • 修复当 WebVTT 字幕样本不包含提示(例如作为 DASH 流的一部分)时,LegacySubtitleUtil 中的 IllegalArgumentException 错误(#1516)。
  • 元数据
    • 修复 MP4 到 ID3 排序标签的映射。以前,“专辑排序”(soal)、“艺术家排序”(soar)和“专辑艺术家排序”(soaa)MP4 标签被错误地映射到 TSO2TSOATSOP ID3 标签(#1302)。
    • 修复读取 MP4(/iTunes)数值 gnre(流派)和 tmpo(节奏)标签时,值超过一个字节的情况。
    • 将 ID3 TCON 帧传播到 MediaMetadata.genre#1305)。
  • 图像
    • 添加对非正方形 DASH 缩略图网格的支持(#1300)。
    • 为 API 34+ 添加对 AVIF 的支持。
    • 允许将 null 作为 ExoPlayer.setImageOutput() 的参数,以清除之前设置的 ImageOutput
  • 数据源
    • 实现对 android.resource://package/id 原始资源 URI 的支持,其中 package 与当前应用程序的包不同。这之前未记录为可行,但它是比按名称访问另一个包中的资源更有效的方法。
    • DataSpec 构造函数中急切地检查 url 是否不为 null。此参数已被注释为非 null。
    • 允许 ByteArrayDataSourceopen() 期间将 URI 解析为字节数组,而不是在构造时硬编码(#1405)。
  • DRM
    • 允许在 DefaultDrmSessionManagerProvider 上设置 LoadErrorHandlingPolicy#1271)。
  • 效果
    • SpeedChangeEffect 中支持在同一 EditedMediaItemComposition 中进行多次速度更改。
    • 支持从超高清 HDR 位图输入输出 HLG 和 PQ。
    • 添加对 EGL_GL_COLORSPACE_BT2020_HLG_EXT 的支持,这可以改善 ExoPlayer.setVideoEffect 和 Transformer 的 Debug SurfaceView 中的 HLG 表面输出。
    • 更新叠加矩阵实现,使其与文档保持一致,方法是翻转在 setOverlayFrameAnchor() 中应用的 x 和 y 值。如果使用 OverlaySettings.Builder.setOverlayFrameAnchor(),请将它们的 x 和 y 值乘以 -1 翻转。
    • 修复当 TimestampWrapperExoPlayer#setVideoEffects 一起使用时崩溃的错误(#821)。
    • 将默认 SDR 颜色工作空间从线性颜色更改为电气 BT 709 SDR 视频。还提供第三个选项以保留原始色彩空间。
    • 允许定义 EditedMediaItemSequences 的不确定 z 顺序(#1055)。
    • 在不同的 HDR 内容片段之间保持一致的亮度范围(使用 HLG 范围)。
    • 添加对 HDR 内容上超高清 HDR(位图)叠加的支持。
    • 允许在 API 26 之前使用 SeparableConvolution 效果。
    • 删除未使用的 OverlaySettings.useHdr,因为叠加和帧的动态范围必须匹配。
    • 添加对 TextOverlay 的 HDR 支持。可以使用 OverlaySettings.Builder.setHdrLuminanceMultiplier() 调整文本叠加的亮度。
  • IMA 扩展
    • 将应用播放 DAI 广告流 所需的 API 提升至稳定版本。
    • 添加 replaceAdTagParameters(Map <String, String>)ImaServerSideAdInsertionMediaSource.AdLoader,允许在运行时替换广告标签参数。
    • 修复在广告播放期间发生播放器错误时未调用 VideoAdPlayer.VideoAdPlayerCallback.onError() 的错误(#1334)。
    • 将 IMA SDK 版本提升至 3.33.0,以修复使用 data:// 广告标签 URI 时发生的 NullPointerException 错误(#700)。
  • 会话
    • CommandButton.enabled 的默认值更改为 true,并确保即使关联的命令可用,控制器的值也可以保持为 false。
    • 添加 CommandButton 的图标常量,应使用这些常量而不是自定义图标资源。
    • 添加 MediaSessionService.isPlaybackOngoing() 以便应用查询服务是否需要在 onTaskRemoved() 中停止(#1219)。
    • 添加 MediaSessionService.pauseAllPlayersAndStopSelf(),它可以方便地暂停所有会话的播放并调用 stopSelf() 以终止 MediaSessionService 的生命周期。
    • 覆盖 MediaSessionService.onTaskRemoved(Intent) 以提供安全的默认实现,如果播放正在进行,则使服务保持在前台运行,否则停止服务。
    • 通过不将持续时间设置到平台会话元数据中,隐藏实时流媒体通知中的搜索栏(#1256)。
    • 使 MediaMetadataMediaDescriptionCompat 的转换保持一致,以便在选择元数据属性时与 media1 中使用相同的首选顺序和逻辑。
    • 添加 MediaSession.sendError(),允许将非致命错误发送到 Media3 控制器。当使用通知控制器(请参阅 MediaSession.getMediaNotificationControllerInfo())时,自定义错误用于将平台会话的 PlaybackState 更新为错误状态,并提供给定的错误信息(#543)。
    • 添加 MediaSession.Callback.onPlayerInteractionFinished() 以在特定控制器的播放器交互序列完成后通知会话。
    • 添加 SessionError,并在 SessionResultLibraryResult 中使用它,而不是错误代码,以提供有关错误的更多信息,以及在可能的情况下如何解决错误。
    • 发布媒体 3 控制器测试应用的代码,该应用可用于测试与发布媒体会话的应用的交互。
    • 将传递给媒体 3 的 MediaSession[Builder].setSessionExtras() 的额外信息传播到媒体 1 控制器的 PlaybackStateCompat.getExtras()
    • 将致命和非致命错误映射到平台会话,以及从平台会话映射到致命和非致命错误。PlaybackException 映射到 PlaybackStateCompat 的致命错误状态。SessionError 使用 MediaSession.sendError(ControllerInfo, SessionError) 发送到媒体通知控制器,映射到 PlaybackStateCompat 中的非致命错误,这意味着错误代码和消息已设置,但平台会话的状态仍然不同于 STATE_ERROR
    • 允许为每个控制器设置会话活动以覆盖全局会话活动。可以在连接时为控制器定义会话活动,方法是使用 AcceptedResultBuilder.setSessionActivivty(PendingIntent) 创建 ConnectionResult。连接后,可以使用 MediaSession.setSessionActivity(ControllerInfo, PendingIntent) 更新会话活动。
    • 改进对 MediaLibrarySession.Callback 的调用的错误复制。现在可以通过使用 MediaLibrarySession.Builder.setLibraryErrorReplicationMode() 选择错误类型或选择退出错误复制(默认情况下启用)来配置错误复制。
  • UI
    • 当连接到 ExoPlayer 时,将图像显示支持添加到 PlayerView#1144)。
    • 通过 xml 属性自定义 PlayerControlView 中的各种图标,以允许每个 PlayerView 实例使用不同的可绘制对象,而不是全局覆盖(#1200)。
    • 解决平台错误,该错误在 API 34 上在 Compose AndroidView 内使用 SurfaceView 时会导致视频拉伸/裁剪(#1237)。
  • 下载
    • 确保 DownloadHelper 不会泄漏未释放的 Renderer 实例,这最终可能导致应用因 IllegalStateException: Too many receivers, total of 1000, registered for pid 而崩溃(#1224)。
  • Cronet 扩展
    • 修复 CronetDataSource 中的 SocketTimeoutException。在某些版本的 Cronet 中,回调提供的请求并不总是相同的。这会导致回调未完成并请求超时 (https://issuetracker.google.com/328442628)。
  • HLS 扩展
    • 修复在 HlsSampleStreamWrapper 中,等待不连续性的挂起的 EMSG 样本使用错误的偏移量委派,导致 IndexOutOfBoundsExceptionIllegalArgumentException 的错误(#1002)。
    • 修复非主要播放列表持续为 LL-HLS 流重新加载的错误(#1240)。
    • 修复为带有初始化段的 HLS 启用 CMCD 导致 Source ErrorIllegalArgumentException 的错误。
    • 修复在实时播放期间未刷新非主要播放播放列表的错误(#1240)。
    • 修复为 HLS 实时流启用 CMCD 导致 ArrayIndexOutOfBoundsException 的错误(#1395)。

  • DASH扩展
    • 修复了重新准备多时段直播流可能抛出 IndexOutOfBoundsException 的错误(#1329)。
    • 添加了对 dashif:Laurl 许可证 URL 的支持(#1345)。
  • 投射扩展
    • 修复了将 MediaQueueItem 的专辑标题转换为 Media3 媒体项目中的艺术家的错误(#1255)。
  • 测试实用程序
    • FakeRenderer 中实现了 onInit()onRelease()
    • 更改了 TestPlayerRunHelper.runUntil()/playUntil() 方法,使其在遇到非致命错误时失败(例如,那些报告给 AnalyticsListener.onVideoCodecError() 的错误)。使用新的 TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() 方法链来禁用此行为。
  • 演示应用程序
    • 在简短形式的演示应用程序中使用 DefaultPreloadManager
    • 允许从命令行使用 Intent 参数设置重复模式(#1266)。
    • 在设备支持的情况下,使用 HttpEngineDataSource 作为 HttpDataSource
  • 移除已弃用的符号
    • 删除了 CronetDataSourceFactory。改为使用 CronetDataSource.Factory
    • 删除了一些 DataSpec 构造函数。改为使用 DataSpec.Builder
    • DefaultHttpDataSourceOkHttpDataSourceCronetDataSource 中删除了 setContentTypePredicate(Predicate) 方法。改为在每个 XXXDataSource.Factory 上使用等效的方法。
    • 删除了 OkHttpDataSource 构造函数和 OkHttpDataSourceFactory。改为使用 OkHttpDataSource.Factory
    • 删除了 PlayerMessage.setHandler(Handler)。改为使用 setLooper(Looper)
    • 删除了 Timeline.Window.isLive 字段。改为使用 isLive() 方法。
    • 删除了 DefaultHttpDataSource 构造函数。改为使用 DefaultHttpDataSource.Factory
    • 删除了 DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS。改为使用 DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
    • 删除了 MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)。改为使用 MediaCodecInfo.canReuseCodec(Format, Format)
    • 删除了 DrmSessionManager.DUMMYgetDummyDrmSessionManager() 方法。改为使用 DrmSessionManager.DRM_UNSUPPORTED
    • 删除了 AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)AudioRendererEventListener.onAudioInputFormatChanged(Format)VideoRendererEventListener.onVideoInputFormatChanged(Format)。改为使用带 DecoderReuseEvaluation 的重载版本。
    • 删除了 RendererSupport.FormatSupport IntDef 和 FORMAT_HANDLEDFORMAT_EXCEEDS_CAPABILITIESFORMAT_UNSUPPORTED_DRMFORMAT_UNSUPPORTED_SUBTYPEFORMAT_UNSUPPORTED_TYPE 常量。改为在 androidx.media3.common.C 中使用等效的 IntDef 和常量(例如 C.FORMAT_HANDLED)。
    • 删除了 Bundleable 接口。这包括删除所有 Bundleable.Creator<Foo> CREATOR 常量字段。调用者应改为对每种类型使用 Bundle toBundle()static Foo fromBundle(Bundle) 方法。

版本 1.4.0-rc01

2024年7月10日

使用 1.4.0 稳定版本

版本 1.4.0-beta01

2024年6月26日

使用 1.4.0 稳定版本

版本 1.4.0-alpha02

2024年6月7日

使用 1.4.0 稳定版本

版本 1.4.0-alpha01

2024年4月17日

使用 1.4.0 稳定版本

版本 1.3.0

版本 1.3.1

2024年4月11日

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

  • 通用库
    • 添加了 Format.labels 以允许本地化或其他替代标签。
  • ExoPlayer

    • 修复了 PreloadMediaPeriod 在再次预加载时无法保留流的问题。
    • 在轨道重新选择中将正确的对应 TrackSelectionResult 应用于播放周期。
    • 在媒体项目之间转换时,仅在推进播放周期后才启动提前启用的渲染器(#1017)。
    • DefaultVideoFrameProcessor.Factory.Builder.build() 的 proguard -keepclasseswithmembers 规则添加了缺失的返回类型(#1187)。
  • 转换器
    • 添加了针对由于 MediaMuxer 在 API 30 之前不支持负呈现时间戳而抛出的异常的解决方法。
  • 轨道选择
    • DefaultTrackSelector:优先选择帧速率“合理”(>=10fps)的视频轨道,而不是帧速率较低或未设置帧速率的轨道。这确保了播放器在从运动照片中提取的 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)。
    • 修复了仅包含非空 extrasMediaMetadata 未在媒体控制器和会话之间传输的问题(#1176)。
  • UI
    • 如果 Locale 无法识别显示名称,则回退到包含音频轨道语言名称(#988)。
  • DASH扩展
    • 将清单中的所有 Label 元素填充到 Format.labels 中(#1054)。
  • RTSP 扩展
    • 在 SDP 解析中跳过空会话信息值(i-tags)(#1087)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • 默认情况下禁用 MIDI 扩展作为本地依赖项,因为它需要配置额外的 Maven 存储库。需要从本地依赖项获取此模块的用户 可以重新启用它

版本 1.3.0

2024年3月6日

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

  • 通用库
    • 实现了对 android.resource://package/[type/]name 原始资源 URI 的支持,其中 package 与当前应用程序的包不同。这始终记录为可工作,但直到现在才得到正确实现。
    • 将应用程序代码设置或从媒体读取的 MIME 类型规范化为完全小写。
    • AdPlaybackState 中使用完整的 MediaItem 而不是单个 Uri 来定义广告。
    • minSdk 提高到 19(Android KitKat)。这 与所有其他 AndroidX 库保持一致,并且是我们升级到最新版本的 AndroidX 依赖项所必需的。
    • 当两者中至少有一个非空时,在 MediaMetadata.Builder.populate(MediaMetadata) 中填充 artworkUriartworkData#964)。
  • ExoPlayer

    • 添加了 PreloadMediaSourcePreloadMediaPeriod,允许应用程序在播放前预加载特定起始位置的内容媒体源。PreloadMediaSource 负责准备内容媒体源以接收 Timeline,准备和缓存给定起始位置的周期,选择轨道并加载周期的媒体数据。应用程序通过实现 PreloadMediaSource.PreloadControl 并将预加载的源设置为播放器的播放来控制预加载进度。
    • 添加了 ExoPlayer.setImageOutput,允许应用程序设置 ImageRenderer.ImageOutput
    • DefaultRenderersFactory 现在默认情况下向播放器提供 ImageRenderer,并使用 null ImageOutputImageDecoder.Factory.DEFAULT
    • 当跳过静音时发出 Player.Listener.onPositionDiscontinuity 事件(#765)。
    • 添加了对在提取期间解析字幕的实验性支持。可以使用 MediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 启用此功能。
    • 支持带有 PreloadMediaSource 的自适应媒体源。
    • 实现了 HttpEngineDataSource,这是一个使用 HttpEngine API 的 HttpDataSource
    • 防止对 CompositeSequenceableLoader 进行子类化。此组件 之前已扩展,但从未在库中进行子类化。可以通过使用 装饰器模式 包装实例并实现自定义 CompositeSequenceableLoaderFactory 来完成自定义。
    • 修复了重复同一时间会导致该项目的元数据被清除的问题(#1007)。
    • BundledChunkExtractor.FactoryDefaultHlsExtractorFactory 上的 experimentalSetSubtitleParserFactory 方法重命名为 setSubtitleParserFactory,并禁止传递 null。使用新的 experimentalParseSubtitlesDuringExtraction(boolean) 方法来控制解析行为。
    • 添加了对自定义在提取期间使用的 SubtitleParser.Factory 的支持。这可以通过 MediaSource.Factory.setSubtitleParserFactory() 实现。

    • 为所有从 MergingMediaSource 生成的 Format.id 字段添加源前缀。这有助于识别哪个源生成了 Format (#883)。
    • 修复用于验证自定义通用媒体客户端数据 (CMCD) 密钥名称的正则表达式,将其修改为仅检查连字符 (#1028)。
    • 停止对 CMCD 查询参数进行双重编码 (#1075)。
  • 转换器
    • 添加对扁平化 H.265/HEVC SEF 慢动作视频的支持。
    • 提高转封装速度,特别是对于“移除视频”编辑。
    • 添加 API 以确保输出文件从视频帧开始。这可以使修剪操作的输出与不显示第一视频帧直至其呈现时间戳的播放器实现更加兼容 (#829)。
    • 添加对优化单个资产 MP4 修剪操作的支持。
    • 添加支持以确保视频帧在输出文件中具有第一个时间戳。修复了 iOS 基于播放器输出文件以黑帧开始的问题 (#829)。
  • 轨道选择
    • 添加 DefaultTrackSelector.selectImageTrack 以启用图像轨道选择。
    • 添加 TrackSelectionParameters.isPrioritizeImageOverVideoEnabled 以确定是否在同时存在图像轨道和视频轨道时选择图像轨道。默认值为 false,这意味着优先选择视频轨道。
  • 提取器
    • 向 MP4 提取器添加额外的 AV1C 解析,以检索 ColorInfo.colorSpaceColorInfo.colorTransferColorInfo.colorRange 值 (#692)。
    • MP3:对于具有 Info 标头(Xing 标头的 CBR 等效项)的文件,使用恒定比特率 (CBR) 搜索。之前我们使用 Info 标头中的搜索表,但这会导致搜索精度低于忽略它并假设文件为 CBR 的情况。
    • MPEG2-TS:添加 DTS、DTS-LBR 和 DTS:X Profile2 支持 (#275)。
    • 从 TS 描述符中提取音频类型并将其映射到角色标志,允许用户做出更明智的音频轨道选择 (#973)。
  • 音频
    • 使用平滑音量斜坡改进静音跳过算法;保留最小的静音和更自然的静音时长 (#7423)。
    • 更确定地报告跳过的静音 (#1035)。
  • 视频
    • 更改带有 VideoFrameProcessor.Factory 参数的 MediaCodecVideoRenderer 构造函数,并将其替换为带有 VideoSinkProvider 参数的构造函数。想要注入自定义 VideoFrameProcessor.Factory 的应用可以实例化一个使用自定义 VideoFrameProcessor.FactoryCompositingVideoSinkProvider,并将视频接收器提供程序传递给 MediaCodecVideoRenderer
  • 文本
    • 修复位图提示的序列化,以解决使用 DefaultExtractorsFactory.setTextTrackTranscodingEnabled 时出现的 Tried to marshall a Parcel that contained Binder objects 错误 (#836)。
    • CEA-708:忽略 rowLock 值。CEA-708-E S-2023 规范指出,无论流中存在哪些值,都应假定 rowLockcolumnLock 均为 true(columnLock 支持未实现,因此实际上始终假定为 false)。
  • 图像
    • 添加对 DASH 缩略图的支持。网格图像被裁剪,并且单个缩略图在接近其呈现时间时提供给 ImageOutput
  • DRM
  • IMA 扩展
    • 修复没有适当文件扩展名的 DASH 和 HLS 广告无法播放的问题。
  • 会话
    • 禁用电视应用的双击检测 (#962)。
    • 修复仅包含非空额外内容的 MediaItem.RequestMetadata 未在媒体控制器和会话之间传输的问题。
    • MediaLibrarySession.Builder 添加一个仅接受 Context 而不是 MediaLibraryService 的构造函数。
  • HLS 扩展
    • HlsMediaPeriod 的可见性降低到包私有。此类型不应从 HLS 包外部直接依赖。
    • 更有效地将搜索解析到片段的开头 (#1031)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • MIDI 解码器:忽略 SysEx 事件消息 (#710)。
  • 测试实用程序
    • 不要在 TestPlayerRunHelper.playUntilPosition 中暂停播放。测试使播放保持在播放状态,但会暂停进度,直到测试能够添加断言和进一步的操作。
  • 演示应用程序
    • 添加一个简短演示模块,以演示使用 PreloadMediaSource 处理短格式内容用例。

版本 1.3.0-rc01

2024 年 2 月 22 日

使用 1.3.0 稳定版

版本 1.3.0-beta01

2024 年 2 月 7 日

使用 1.3.0 稳定版

版本 1.3.0-alpha01

2024 年 1 月 15 日

使用 1.3.0 稳定版

版本 1.2.0

版本 1.2.1

2024 年 1 月 9 日

  • ExoPlayer

    • 修复手动搜索超出 LiveConfiguration.min/maxOffset 范围时,偏移量持续调整回 min/maxOffset 的问题。
    • 修复 OPUS 和 VORBIS 通道布局对于 3、5、6、7 和 8 个通道错误的问题 (#8396)。
    • 修复在实时流中搜索到零后轨道选择错误地让流从其默认位置开始的问题 (#9347)。
    • 修复 CmcdData.Factory 的新实例从块源接收 bufferedDurationUs 的负值,导致 IllegalArgumentException 的问题 (#888)。
  • 转换器
    • 解决编码器在配置时由于设置高工作速率而抛出异常的问题。
  • 提取器
    • 将 JPEG 运动照片中的辅助(不可播放)HEVC 轨道标记为 ROLE_FLAG_ALTERNATE,以防止由于其更高分辨率而自动选择它们进行播放。
    • 修复 TS H264 流的错误关键帧检测 (#864)。
    • 修复时长超过 47721 秒的 TS 流的时长估算 (#855)。
  • 音频
    • 修复多次调用时 SilenceSkippingAudioProcessor 的 EOS 处理 (#712)。
  • 视频
    • 添加针对 Galaxy Tab S7 FE、Chromecast with Google TV 和 Lenovo M10 FHD Plus 上的设备问题的解决方法,该问题会导致 60fps AVC 流被标记为不支持 (#693)。
  • 元数据
    • 修复 MediaMetadata 仅从 Vorbis 注释中填充大写密钥的问题 (#876)。
    • 在解析非常大的 ID3 帧时捕获 OutOfMemoryError,这意味着播放可以继续而无需标签信息,而不是播放完全失败。
  • DRM
    • 将伪造的 ClearKey https://default.url 许可证 URL 的解决方法扩展到 API 33 及更高版本(以前,解决方法仅适用于 API 33)(#837)。
    • 修复在从加密内容切换到清晰内容且没有表面附加到播放器时出现的 ERROR_DRM_SESSION_NOT_OPENED 错误。错误是由于错误地使用安全解码器播放清晰内容造成的。
  • 会话
    • MediaMetadataCompat 中的自定义键和值放入 MediaMetadata.extras,并将 MediaMetadata.extras 中的值放入 MediaMetadataCompat (#756#802)。
    • 修复为旧版控制器广播 notifyChildrenChanged (#644)。
    • 修复为通知的禁用的 setWhen 计时器设置负时间导致某些设备崩溃的错误 (#903)。
    • 修复在第一个通知更新请求时媒体通知控制器尚未完成连接时的 IllegalStateException (#917)。
  • UI
    • 修复在 BottomSheetDialogFragment 中与 Material Design 一起使用时前进和后退按钮不可见的问题 (#511)。
    • 修复 PlayerControlView 的快进按钮中的数字未对齐的问题 (#547)。
  • DASH扩展
    • 在 DASH 清单中将“f800”解析为杜比的 5 个通道数 (#688)。
  • 解码器扩展(FFmpeg、VP9、AV1、MIDI 等)
    • MIDI:修复向前搜索跳过程序更改事件的问题 (#704)。
    • 迁移到 FFmpeg 6.0 并更新支持的 NDK 至 r26b (#707#867)。
  • 投射扩展
    • 清理 Timeline 的创建,以防止在加载媒体时在投射设备上导致应用崩溃 (#708)。

版本 1.2.0

2023 年 11 月 15 日

  • 通用库
    • Log.Logger 接口中的方法添加 @Nullable Throwable 参数。message 参数不再包含传递给 Log.{d,i,w,e}() 方法的 Throwable 的任何信息,因此实现需要根据需要手动追加此信息(可能使用 Logger.appendThrowableString(String, Throwable))。

    • 修复 Kotlin 兼容性问题,其中可空泛型类型参数和可空数组元素类型未被检测为可空。例如 TrackSelectorResultSimpleDecoder 方法参数 (#6792).
    • 更改 Util.shouldShowPlayButton 中的默认 UI 和通知行为,以便在播放暂时被抑制时(例如,由于短暂的音频焦点丢失)显示“播放”按钮。可以通过使用 PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) 来保持旧的行为 (#11213).
    • androidx.annotation:annotation-experimental 升级到 1.3.1 以修复 https://issuetracker.google.com/251172715。
    • ExoPlayer.setAudioAttributes 移动到 Player 接口。
  • ExoPlayer

    • 修复 AC4 流中由于未正确识别仅解码样本导致的寻址问题 (#11000).
    • 当通过 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)。除了现有的 playbackPositionUs 之外,LoadingInfo 还包含其他参数,包括 playbackSpeedlastRebufferRealtimeMs
    • ChunkSource 接口中的 ChunkSource.getNextChunk(long, long, List, ChunkHolder) 方法增强为 ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
    • 向通用媒体客户端数据 (CMCD) 日志添加其他字段:缓冲区饥饿 (bs)、截止日期 (dl)、播放速率 (pr) 和启动 (su) (#8699).
    • ColorInfo 添加亮度和色度位深 (#491).
    • 向通用媒体客户端数据 (CMCD) 日志添加其他字段:下一个对象请求 (nor) 和下一个范围请求 (nrr) (#8699).
    • 添加使用查询参数传输通用媒体客户端数据 (CMCD) 数据的功能 (#553).
    • 修复 ExperimentalBandwidthMeter 中的 ConcurrentModificationException (#612).
    • CompositeMediaSource.getMediaTimeForChildMediaTime 添加 MediaPeriodId 参数。
    • ConcatenatingMediaSource2 中支持 ClippingMediaSource(以及其他具有周期/窗口时间偏移的源)(#11226).
    • 更改 BaseRenderer.onStreamChanged() 以便也接收 MediaPeriodId 参数。
  • 转换器
    • 解析图像输入的 EXIF 旋转数据。
    • 删除 TransformationRequest.HdrMode 注解类型及其关联的常量。改用 Composition.HdrMode 及其关联的常量。
    • 简化 OverlaySettings 以修复旋转问题。
    • SampleConsumer.queueInputBitmapframeRatedurationUs 参数更改为 TimestampIterator
  • 轨道选择
    • 添加 DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness 以显式允许或不允许无缝自适应。默认值保持其当前行为 true
  • 提取器
    • MPEG-TS:通过将流的最后一个访问单元传递到样本队列来确保渲染最后一帧 (#7909).
    • 修复确定 rotationDegrees 时的错别字。将 projectionPosePitch 更改为 projectionPoseRoll (#461).
    • 删除 Extractor 实例可以直接使用 instanceof 检查的假设。如果您想要运行时访问 Extractor 的实现细节,则必须首先调用 Extractor.getUnderlyingInstance
    • 添加 BmpExtractor
    • 添加 WebpExtractor
    • 添加 HeifExtractor
    • Mp4Extractor 添加对 QuickTime Classic 的支持。
  • 音频
    • 添加对 MP4 和 Matroska 中 24/32 位大端 PCM 的支持,并解析 MP4 中 lpcm 的 PCM 编码。
    • 添加对提取 MP4 中的 Vorbis 音频的支持。
    • 添加 AudioSink.getFormatOffloadSupport(Format),它通过 DefaultAudioOffloadSupportProvider 获取接收器可以为格式提供的卸载支持级别。它返回新的 AudioOffloadSupport,其中包含 isFormatSupportedisGaplessSupportedisSpeedChangeSupported
    • 添加 AudioSink.setOffloadMode(),通过它配置音频接收器上的卸载配置。默认值为 AudioSink.OFFLOAD_MODE_DISABLED
    • 可以通过 TrackSelectionParameters 中的 setAudioOffloadPreference 启用卸载。如果设置的偏好是启用,设备支持格式的卸载,并且轨道选择是单个音频轨道,则将启用音频卸载。
    • 如果 audioOffloadModePreference 设置为 AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED,则 DefaultTrackSelector 仅选择音频轨道,并且仅当该轨道的格式在卸载中受支持时才选择。如果在卸载中没有音频轨道受支持,则不会选择任何轨道。
    • 由于轨道转换后播放位置问题,在 API 级别 33 之前禁用卸载的无缝支持。
    • DefaultRenderersFactory.buildAudioSink 方法签名中删除参数 enableOffload
    • 删除方法 DefaultAudioSink.Builder.setOffloadMode
    • 删除 intdef 值 DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
    • 添加对卸载播放期间 Opus 无缝元数据的支持。
    • 如果第一次写入失败,则允许渲染器恢复,方法是禁用卸载 (#627).
    • 默认情况下为仅音频卸载播放启用卸载调度。
    • 删除 ExoPlayer.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
    • onExperimentalSleepingForOffloadChanged 重命名为 onSleepingForOffloadChanged,并将 onExperimentalOffloadedPlayback 重命名为 onOffloadedPlayback
    • 将与音频卸载模式相关的 TrackSelectionParameters 接口和定义移动到内部 AudioOffloadPreferences 类。
    • AnalyticsListenerAudioRendererEventListenerAudioSink.Listener 添加 onAudioTrackInitializedonAudioTrackReleased 回调。
    • 修复 DTS Express 音频缓冲区下溢问题 (#650).
    • 修复 E-AC3-JOC 的功能检查抛出 IllegalArgumentException 的错误 (#677).
  • 视频
    • 允许 MediaCodecVideoRenderer 使用自定义的 VideoFrameProcessor.Factory
    • 修复如果音频流以负时间戳开头则无法渲染第一帧的错误 (#291).
  • 文本
    • 删除 ExoplayerCuesDecoder。现在 TextRenderer 直接处理具有 sampleMimeType = application/x-media3-cues 的文本轨道,无需 SubtitleDecoder 实例。
  • 元数据
    • 对于“仅解码”样本,将不再调用 MetadataDecoder.decode,因为实现无论如何都必须返回 null。
  • 效果
    • 添加 VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>),通过时间戳排队位图输入。
    • VideoFrameProcessor.registerInputStream() 更改为非阻塞。应用必须实现 VideoFrameProcessor.Listener#onInputStreamRegistered()
    • VideoFrameProcessor.queueInputBitmapframeRatedurationUs 参数更改为 TimestampIterator
  • IMA 扩展
    • 修复不是播放列表中第一个项目的多分段 DASH 直播流可能抛出异常的错误 (#571).
    • 在调用 AdsLoader.destroy() 之前释放 StreamManager。
    • 将 IMA SDK 版本更新到 3.31.0。
  • 会话
    • DefaultMediaNotificationProvider 中将通知前台服务行为设置为 FOREGROUND_SERVICE_IMMEDIATE (#167).
    • 在 API 31 以上仅使用 android.media.session.MediaSession.setMediaButtonBroadcastReceiver(),以避免三星设备上过时 API 导致的问题 (#167).
    • 使用媒体通知控制器作为代理来设置可用的命令和用于填充通知和平台会话的自定义布局。
    • 转换由 MediaSessionService.onStartCommand() 在 Media3 中接收的媒体按钮事件,而不是将它们路由到平台会话并返回到 Media3。这样,调用方控制器始终是媒体通知控制器,并且应用可以在所有支持的 API 级别上以相同的方式轻松识别来自通知的调用。
    • 修复连接到旧版 MediaSessionCompatMediaController.getCurrentPosition() 不前进的错误。
    • 添加 MediaLibrarySession.getSubscribedControllers(mediaId) 以方便使用。
    • 覆盖 MediaLibrarySession.Callback.onSubscribe() 以断言控制器订阅的父 ID 的可用性。如果成功,则接受订阅并立即调用 notifyChildrenChanged() 以通知浏览器 (#561).
    • 添加用于汽车操作系统的会话演示模块,并为 Android Auto 启用会话演示。
    • 当媒体通知控制器不可用 COMMAND_GET_TIMELINE 时,不要设置框架会话的队列。当 Android Auto 作为从框架会话读取的客户端控制器时,这会导致 Android Auto 的 UI 中的 queue 按钮不显示 (#339).
    • 默认情况下使用 DataSourceBitmapLoader 而不是 SimpleBitmapLoader (#271, #327).

    • 添加 MediaSession.Callback.onMediaButtonEvent(Intent),允许应用覆盖默认的媒体按钮事件处理。
  • UI
    • 为 Wear OS 设备添加 Player.Listener 实现,该实现处理由于 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT 导致的播放抑制,方法是启动系统对话框,允许用户连接合适的音频输出(例如蓝牙耳机)。如果在可配置的超时时间内(默认为 5 分钟)连接了合适的设备,则侦听器将自动恢复播放。
  • 下载
    • 为 Android 14 兼容性声明 DownloadService 的“数据同步”前台服务类型。使用此服务时,应用还需要在清单中添加 dataSync 作为 foregroundServiceType,并添加 FOREGROUND_SERVICE_DATA_SYNC 权限(#11239)。
  • HLS 扩展
    • 以从上次加载开始时间而不是上次加载完成时间计算的间隔刷新 HLS 直播播放列表(#663)。
  • DASH扩展
    • 允许在片段模板 URL 中使用多个相同的 DASH 标识符。
    • 添加对在提取过程中解析字幕的实验性支持。这更好地支持合并重叠的字幕,包括解决在字幕片段之间转换时的闪烁问题。您可以使用 DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 启用此功能(#288)。
  • RTSP 扩展
    • 修复可能导致回退到 TCP 时出现 IndexOutOfBoundsException 或在某些情况下播放挂起的竞争条件。
    • 在返回 RtspMediaPeriod 的加载状态时检查 RTSP 设置中的状态(#577)。
    • 忽略 Options 响应公共标头中的自定义 Rtsp 请求方法(#613)。
    • 在发送保持活动 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 存储库的错误。工件重命名为 media3-exoplayer-midi#734)。
  • Leanback 扩展
    • 修复禁用表面可能导致 Leanback 代码中出现 ArithmeticException 的错误(#617)。
  • 测试实用程序
    • 使 TestExoPlayerBuilderFakeClock 与 Espresso UI 测试和 Compose UI 测试兼容。这修复了在 Espresso 或 Compose 视图交互期间播放非确定性前进的错误。
  • 移除已弃用的符号
    • 移除 TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)。改用 Composition.Builder.setHdrMode(int) 并将 Composition 传递给 Transformer.start(Composition, String)
    • 移除已弃用的 DownloadNotificationHelper.buildProgressNotification 方法,改用不弃用的方法,该方法采用 notMetRequirements 参数。

版本 1.2.0-rc01

2023 年 11 月 1 日

使用 1.2.0 稳定版本

版本 1.2.0-beta01

2023 年 10 月 19 日

使用 1.2.0 稳定版本

版本 1.2.0-alpha02

2023 年 9 月 29 日

使用 1.2.0 稳定版本

版本 1.2.0-alpha01

2023 年 8 月 17 日

使用 1.2.0 稳定版本

版本 1.1.0

版本 1.1.1

2023 年 8 月 16 日

  • 通用库
    • 从所有模块中删除意外添加的 multidex 依赖项(#499)。
  • ExoPlayer

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

版本 1.1.0

2023 年 7 月 5 日

  • 通用库
    • 添加不合适的音频路由的抑制原因,并在抑制时间过长时更改播放就绪更改原因。(#15)。
    • 向 Player 添加命令
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • 向 Player 添加重载方法,允许用户指定音量标志
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • 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 关联。
    • 通过添加包含用作映射中键的 UID 的周期的时序参数来更改 ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) 的签名。这是为了避免多周期直播的并发问题。
    • 弃用 EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)。可以改为调用不带 mediaTimeOffsetUs 的方法变体。请注意,即使对于已弃用的变体,偏移量也不会再添加到调度程序分派的 MediaLoadData 对象的 startTimeUsendTimeUs
    • ExoTrackSelection.blacklist 重命名为 excludeTrack,并将 isBlacklisted 重命名为 isTrackExcluded
    • 修复在空播放列表上调用时 ExoPlayer.setMediaItem(s)addMediaItem(s) 之间行为不一致的问题。

  • 转换器
    • 移除 Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)。改用 ExoPlayerAssetLoader.Factory(MediaSource.Factory)Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
    • 移除 Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • 修复了一个错误,该错误会导致转换卡住(导致复用器超时),如果在处理输入帧挂起时发出视频流的结束信号。
    • 通过 MediaCodecList 查询编解码器,而不是使用 findDecoder/EncoderForFormat 工具,以扩展支持。
    • 移除 DefaultEncoderFactory 中的 B 帧配置,因为它在某些设备上不起作用。
  • 轨道选择
    • 添加 DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange,默认情况下禁用。启用后,当渲染器功能更改时,DefaultTrackSelector 将触发新的轨道选择。
  • 提取器
    • Ogg:修复在具有较长持续时间的文件中寻求时的错误(#391)。
    • FMP4:修复 TimestampAdjuster 使用来自 emsg 原子的元数据样本时间初始化错误时间戳偏移量的问题(#356)。
  • 音频
    • 修复当启用隧道且 AudioProcessors 处于活动状态时(例如,用于无缝修剪)某些播放失败的错误(#10847)。
    • 在直接播放(卸载)中将 Opus 帧封装在 Ogg 数据包中。
    • 使用卸载调度在休眠期间推断当前位置。
    • 添加 Renderer.release()AudioSink.release() 用于在播放器生命周期结束时释放资源。
    • DefaultAudioSink 中侦听音频功能更改。在 DefaultAudioSink 的构造函数中添加一个必需的参数 contextDefaultAudioSink 将使用该参数向 AudioCapabilitiesReceiver 注册为侦听器,并在收到功能更改通知时更新其 audioCapabilities 属性。
    • 通过 AudioSink.Listener 接口中的新事件 onAudioCapabilitiesChanged 和一个新的接口 RendererCapabilities.Listener 传播音频功能更改,该接口触发 onRendererCapabilitiesChanged 事件。
    • 添加 ChannelMixingAudioProcessor 用于将缩放/混合应用于音频通道。
    • DecoderDiscardReasons 中添加新的 int 值 DISCARD_REASON_AUDIO_BYPASS_POSSIBLE,以便在音频功能更改后旁路模式可用时丢弃音频解码器。
    • 添加对 DTS Express 和 DTS:X 的直接播放支持(#335)。
  • 视频
    • 使 MediaCodecVideoRenderer 在渲染器禁用时报告宽度和高度为 0 的 VideoSize。当 Player.getVideoSize() 更改时,Player.Listener.onVideoSizeChanged 会相应地被调用。通过此更改,当 Player.getCurrentTracks 不支持视频或支持的视频轨道的尺寸尚未确定时,MediaCodecVideoRenderer 的 ExoPlayer 视频尺寸的宽度和高度为 0。
  • DRM
    • 降低 DefaultDrmSession 上几个仅限内部使用的 methods 的可见性,这些 methods 不应从 DRM 包外部调用
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • 复用器
    • 添加一个新的复用器库,可用于创建 MP4 容器文件。
  • IMA 扩展
    • 为 DAI 启用多时段直播 DASH 流。请注意,当前实现尚不支持在直播流中寻求(#10912)。
    • 修复了一个错误,该错误会导致在直播流中插入新的广告组,因为连续时间轴中计算出的内容位置略有不同。
  • 会话
    • 添加辅助方法 MediaSession.getControllerForCurrentRequest 以获取有关当前调用 Player method 的控制器的信息。
    • 添加 androidx.media3.session.MediaButtonReceiver 以使应用程序能够使用例如蓝牙耳机发送的媒体按钮事件实现播放恢复(#167)。
    • MediaSession.Callback.onAddMediaItems 添加默认实现,以便如果请求的 MediaItems 具有 LocalConfiguration(例如 URI),则可以将其传递给 Player#282)。
    • 默认情况下,为 Android 12 及以下版本在紧凑型媒体通知视图上添加“跳转到上一首”和“跳转到下一首”命令按钮(#410)。
    • MediaSession.Callback.onAddMediaItems 添加默认实现,以便如果请求的 MediaItems 具有 LocalConfiguration(例如 URI),则可以将其传递给 Player#282)。
    • 默认情况下,为 Android 12 及以下版本在紧凑型媒体通知视图上添加“跳转到上一首”和“跳转到下一首”命令按钮(#410)。
  • UI
    • 添加 Util methods shouldShowPlayButtonhandlePlayPauseButtonAction 以使用播放/暂停按钮编写自定义 UI 元素。
  • RTSP 扩展
    • 对于 MPEG4-LATM,如果 Describe Response SDP 消息中不存在,则使用默认的配置文件 ID 值(#302)。
    • 如果在 DESCRIBE 响应标头中存在,则使用基本 Uri 从 RTSP 会话解析相对路径(#11160)。
  • DASH扩展
    • 从多时段 DASH 流的 MediaLoadData.startTimeMsMediaLoadData.endTimeMs 中移除媒体时间偏移量。
    • 修复了一个错误,该错误会导致重新准备多时段直播 Dash 媒体源产生 IndexOutOfBoundsException#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 参数的选项。
    • 移除字符集的已弃用字符串常量(ASCII_NAMEUTF8_NAMEISO88591_NAMEUTF16_NAMEUTF16LE_NAME),改用来自 kotlin.text 包的 Kotlin 字符集、java.nio.charset.StandardCharsetscom.google.common.base.Charsets
    • 移除已弃用的 WorkManagerScheduler 构造函数,改用一个未弃用的构造函数,该构造函数包含提供 Context 参数的选项。
    • 移除已弃用的 methods createVideoSampleFormatcreateAudioSampleFormatcreateContainerFormatcreateSampleFormat,这些 methods 用于实例化 Format 类。改用 Format.Builder 创建 Format 的实例。
    • 移除已弃用的 methods copyWithMaxInputSizecopyWithSubsampleOffsetUscopyWithLabelcopyWithManifestFormatInfocopyWithGaplessInfocopyWithFrameRatecopyWithDrmInitDatacopyWithMetadatacopyWithBitratecopyWithVideoSize,改用 Format.buildUpon() 和 setter methods。
    • 移除已弃用的 ExoPlayer.retry(),改用 prepare()
    • 移除已弃用的无参 DefaultTrackSelector 构造函数,改用 DefaultTrackSelector(Context)
    • 移除已弃用的 OfflineLicenseHelper 构造函数,改用 OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
    • 移除已弃用的 DownloadManager 构造函数,改用接受 Executor 的构造函数。
    • 移除已弃用的 Cue 构造函数,改用 Cue.Builder
    • 移除已弃用的 OfflineLicenseHelper 构造函数,改用 OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
    • 移除四个已弃用的 AnalyticsListener methods
      • onDecoderEnabled,改用 onAudioEnabled 和/或 onVideoEnabled
      • onDecoderInitialized,改用 onAudioDecoderInitialized 和/或 onVideoDecoderInitialized
      • onDecoderInputFormatChanged,改用 onAudioInputFormatChanged 和/或 onVideoInputFormatChanged
      • onDecoderDisabled,改用 onAudioDisabled 和/或 onVideoDisabled
    • 移除已弃用的 Player.Listener.onSeekProcessedAnalyticsListener.onSeekProcessed,改用 onPositionDiscontinuity 以及 DISCONTINUITY_REASON_SEEK
    • 移除 ExoPlayer.setHandleWakeLock(boolean),改用 setWakeMode(int)
    • 移除已弃用的 DefaultLoadControl.Builder.createDefaultLoadControl(),改用 build()
    • 移除已弃用的 MediaItem.PlaybackProperties,改用 MediaItem.LocalConfiguration。已弃用的字段 MediaItem.playbackProperties 现在是 MediaItem.LocalConfiguration 类型。

版本 1.1.0-rc01

2023 年 6 月 21 日

使用 1.1.0 稳定版本

版本 1.1.0-beta01

2023 年 6 月 7 日

使用 1.1.0 稳定版本

版本 1.1.0-alpha01

2023 年 5 月 10 日

使用 1.1.0 稳定版本

版本 1.0.0

版本 1.0.2

2023 年 5 月 18 日

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

此版本对应于 ExoPlayer 2.18.7 版本

1.0.1 版本 以来,此版本包含以下更改

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

版本 1.0.1

2023 年 4 月 18 日

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

此版本对应于 ExoPlayer 2.18.6 版本

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

版本 1.0.0

2023 年 3 月 22 日

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

此版本对应于 ExoPlayer 2.18.5 版本

自 1.0.0-rc02 以来没有变化。

版本 1.0.0-rc02

2023 年 3 月 2 日

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

此版本对应于 ExoPlayer 2.18.4 版本

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

版本 1.0.0-rc01

2023 年 2 月 16 日

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

此版本对应于 ExoPlayer 2.18.3 版本

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

  • 演示应用程序
    • 在运行时请求下载通知的通知权限(#10884)。

版本 1.0.0-beta03

2022年11月22日

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

此版本对应于 ExoPlayer 2.18.2 版本

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

版本 1.0.0-beta02

2022年7月21日

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

此版本对应于 ExoPlayer 2.18.1 版本

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

版本 1.0.0-beta01

2022年6月16日

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

这对应于 ExoPlayer 2.18.0 版本

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

版本 1.0.0-alpha03

2022 年 3 月 14 日

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

这对应于 ExoPlayer 2.17.1 版本

  • 音频
    • 修复了 HLS 中对 Dolby Atmos (E-AC3-JOC) 音频功能的错误检查。
  • 提取器
    • FMP4: 修复了当流中同时包含 v0 和 v1 emsg 原子时,emsg 样本元数据可能以错误顺序输出的问题 (#9996)。
  • 文本
    • 修复了 SingleSampleMediaSource.Factory.setTrackIdMediaItem.SubtitleConfiguration.Builder.setId 的交互,使其优先使用 SubtitleConfiguration 字段,并在未设置时回退到 Factory 值 (#10016)。
  • 广告播放
    • 修复了直播 HLS SSAI 流中广告片段之间的音频欠载问题。

版本 1.0.0-alpha02

2022年3月2日

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

这对应于 ExoPlayer 2.17.0 版本

  • 核心库
    • 添加了受保护的方法 DefaultRenderersFactory.getCodecAdapterFactory(),以便 DefaultRenderersFactory 的子类(覆盖了 buildVideoRenderers()buildAudioRenderers())可以访问编解码器适配器工厂,并将其传递给它们创建的 MediaCodecRenderer 实例。
    • 将 ICY 头字段 namegenre 分别传播到 MediaMetadata.stationMediaMetadata.genre,以便它们通过 Player.Listener.onMediaMetadataChanged() 传递到应用 (#9677)。
    • DefaultHttpDataSource#getResponseHeaders 中删除空键。
    • 在创建 MediaCodec 实例失败时休眠并重试。这解决了一些设备上从安全编解码器切换到其他编解码器时出现的问题 (#8696)。
    • 添加 MediaCodecAdapter.getMetrics() 以允许用户获取来自 MediaCodec 的指标数据。(#9766)。
    • 修复 Maven 依赖项解析 (#8353)。
    • 对于既没有低延迟功能也没有用户请求设置速度的直播流,禁用自动速度调整 (#9329)。
    • DecoderCounters#inputBufferCount 重命名为 queuedInputBufferCount
    • SimpleExoPlayer.renderers 设置为私有。可以通过 ExoPlayer.getRenderer 访问渲染器。
    • 更新了一些 AnalyticsListener.EventFlags 常量值,使其与 Player.EventFlags 中的值匹配。
    • AnalyticsCollector 拆分为接口和默认实现,以便在应用不需要它时可以由 R8 移除。
  • 轨道选择
    • 在轨道选择中支持首选视频角色标志 (#9402)。
    • 更新视频轨道选择逻辑,在为自适应选择多个视频轨道时考虑首选 MIME 类型和角色标志 (#9519)。
    • 更新视频和音频轨道选择逻辑,仅为自适应选择选择具有相同解码器和硬件支持级别的格式 (#9565)。
    • 更新视频轨道选择逻辑,如果多个编解码器都受主要硬件加速解码器支持,则优先选择更有效的编解码器 (#4835)。
    • 优先考虑音频内容首选项(例如,“默认”音频轨道或与系统区域设置语言匹配的轨道),而不是技术轨道选择约束(例如,首选 MIME 类型或最大声道数)。
    • 修复轨道选择问题,其中覆盖一个轨道组不会禁用相同类型的其他轨道组 (#9675)。
    • 修复轨道选择问题,其中非空和空轨道覆盖的混合应用不正确 (#9649)。
    • 禁止在 TrackGroupArray 中出现重复的 TrackGroup。可以通过在 TrackGroup 构造函数中设置 id 来始终使 TrackGroup 可区分。这修复了在将应用置于后台并存在活动轨道覆盖的情况下恢复播放时发生的崩溃 (#9718)。
    • 修改 AdaptiveTrackSelection 中的逻辑,即使播放非常接近直播边缘,在网络带宽充足的情况下也允许提高质量 (#9784)。
  • 视频
    • 修复 Dolby Vision 的解码器回退逻辑,使其在需要时使用兼容的 H264/H265 解码器。
  • 音频
    • 修复 Dolby Atmos (E-AC3-JOC) 的解码器回退逻辑,使其在需要时使用兼容的 E-AC3 解码器。
    • 更改 AudioCapabilities API,要求显式传递 AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES 而不是 null
    • 通过将 AudioTrackBufferSizeProvider 注入到 DefaultAudioSink 中,允许自定义 AudioTrack 缓冲区大小的计算。(#8891)。
    • 如果请求的缓冲区大小 > 1MB,则重试 AudioTrack 创建。(#9712)。
  • 提取器
    • WAV: 添加对 RF64 流的支持 (#9543)。
    • 修复了 H.265 SPS NAL 单元解析错误 (#9719)。
    • 在 Ogg Opus 和 Ogg Vorbis 文件中解析 Vorbis 注释(包括 METADATA_BLOCK_PICTURE)。
  • 文本
    • 添加了一个 MediaItem.SubtitleConfiguration.id 字段,该字段会传播到根据配置创建的字幕轨道的 Format.id 字段 (#9673)。
    • 添加了对 Matroska 容器中 WebVTT 字幕的基本支持 (#9886)。
    • 防止 Cea708Decoder 读取超过服务块声明的大小。
  • DRM
    • DrmSessionManager.(pre)acquireSession 中删除 playbackLooper。当应用在自定义 MediaSource 中使用 DrmSessionManager 时,需要将 playbackLooper 传递到 DrmSessionManager.setPlayer 而不是这里。
  • 广告播放/IMA
    • 添加了对 IMA 动态广告插入 (DAI) 的支持 (#8213)。
    • 添加了一个方法到 AdPlaybackState 以允许重置广告组,以便可以再次播放它 (#9615)。
    • 在广告播放期间强制播放速度为 1.0 (#9018)。
    • 修复了广告组加载失败导致立即重置播放的问题 (#9929)。
  • UI
    • 修复了在使用某些主题时 StyledPlayerView 倒退和快进按钮数字颜色错误的问题 (#9765)。
    • 正确翻译播放速度字符串 (#9811)。
  • DASH
    • 将解析后的基本属性和补充属性添加到 Representation (#9579)。
    • 支持 forced-subtitle 轨道角色 (#9727)。
    • 停止将 main 轨道角色解释为 C.SELECTION_FLAG_DEFAULT
    • 修复了未声明 DVB 命名空间的清单的基本 URL 排除逻辑 (#9856)。
    • 支持相对 MPD.Location URL (#9939)。
  • HLS
    • 为仅音频 HLS 流正确填充 Format.label (#9608)。
    • 默认情况下使用无分片准备以提高启动时间。如果您的呈现包含在主播放列表中 **未** 声明的混合隐藏字幕轨道,则应将其添加到主播放列表以供播放,或使用 HlsMediaSource.Factory.setAllowChunklessPreparation(false) 关闭无分片准备。
    • 支持 HLS 中的关键帧精确寻道 (#2882)。
  • RTSP
    • 提供客户端 API 以覆盖用于任何服务器连接的 SocketFactory (#9606)。
    • 如果同时存在 DIGEST 和 BASIC 身份验证方法,则优先选择 DIGEST 方法 (#9800)。
    • 处理 RTSP 轨道时间不可用时的情况 (#9775)。
    • 忽略无效的 RTP-Info 标头值 (#9619)。
  • 转换器
    • 将所需的最低 API 版本提高到 21。
    • TransformationException 现在用于描述转换过程中发生的错误。
    • 添加 TransformationRequest 用于指定转换选项。
    • 允许注册多个监听器。
    • 修复了编解码器输出部分读取时 Transformer 卡住的问题。
    • 修复了释放复用器引发异常时 Transformer.getProgress 中潜在的 NPE。
    • 添加了一个用于应用转换的演示应用。
  • MediaSession 扩展
    • 默认情况下,MediaSessionConnector 现在会在停止时清除播放列表。希望保留播放列表的应用可以在连接器上调用 setClearMediaItemsOnStop(false)
  • Cast 扩展
    • 修复了阻止 CastPlayer 正确调用 onIsPlayingChanged 的错误 (#9792)。
    • 支持包括图像在内的音频元数据,使用 DefaultMediaItemConverter (#9663)。
  • FFmpeg 扩展
    • 使 build_ffmpeg.sh 依赖于 LLVM 的 bin 工具而不是 GNU 的 (#9933)。
  • Android 12 兼容性
    • 升级 Cast 扩展以依赖于 com.google.android.gms:play-services-cast-framework:20.1.0。早期版本的 play-services-cast-framework 与目标为 Android 12 的应用不兼容,并且在创建 PendingIntent 时会崩溃,并出现 IllegalArgumentException (#9528)。
  • 移除已弃用的符号
    • 删除 Player.EventListener。请改用 Player.Listener

    • 移除 MediaSourceFactory#setDrmSessionManagerMediaSourceFactory#setDrmHttpDataSourceFactoryMediaSourceFactory#setDrmUserAgent。请改用 MediaSourceFactory#setDrmSessionManagerProvider
    • 移除 MediaSourceFactory#setStreamKeys。请改用 MediaItem.Builder#setStreamKeys
    • 移除 MediaSourceFactory#createMediaSource(Uri)。请改用 MediaSourceFactory#createMediaSource(MediaItem)
    • 移除 DashMediaSourceHlsMediaSourceSsMediaSource 中的 setTag。请改用 MediaItem.Builder#setTag
    • 移除 DashMediaSource#setLivePresentationDelayMs(long, boolean)。请使用 MediaItem.Builder#setLiveConfigurationMediaItem.LiveConfiguration.Builder#setTargetOffsetMs 覆盖清单,或使用 DashMediaSource#setFallbackTargetLiveOffsetMs 提供备用值。
    • 移除 (Simple)ExoPlayer.setThrowsWhenUsingWrongThread。不再允许选择退出线程强制执行。
    • 移除 ActionFileActionFileUpgradeUtil。请使用 ExoPlayer 2.16.1 或更早版本,并使用 ActionFileUpgradeUtil 将旧版操作文件合并到 DefaultDownloadIndex 中。
    • 移除 ProgressiveMediaSource#setExtractorsFactory。请改用 ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory) 构造函数。
    • 移除 ProgressiveMediaSource.Factory#setTagProgressiveMediaSource.Factory#setCustomCacheKey。请改用 MediaItem.Builder#setTagMediaItem.Builder#setCustomCacheKey
    • 移除 DefaultRenderersFactory(Context, @ExtensionRendererMode int)DefaultRenderersFactory(Context, @ExtensionRendererMode int, long) 构造函数。请改用 DefaultRenderersFactory(Context) 构造函数、DefaultRenderersFactory#setExtensionRendererModeDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
    • 移除所有公共 CronetDataSource 构造函数。请改用 CronetDataSource.Factory
  • 将以下 IntDefs 更改为仅限 @Target(TYPE_USE)。这可能会破坏 Kotlin 中用法的编译,可以通过将注释移动到注释类型 (Int) 来解决。
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags(位于 com.google.android.exoplayer2.ext.flac 包中)
    • @FlacExtractor.Flags(位于 com.google.android.exoplayer2.extractor.flac 包中)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

版本 1.0.0-alpha01

2021年10月27日

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

新功能

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

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

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

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