支持的格式

定义 ExoPlayer 支持的格式时,请务必注意,“媒体格式”在多个级别进行定义。从最低级别到最高级别,具体如下:

  • 各个媒体样本(如视频帧或音频帧)的格式。以下是示例格式。请注意,典型的视频文件将包含至少两种样本格式的媒体;一种适用于视频(例如 H.264),另一种适用于音频(例如 AAC)。
  • 用于存放媒体样本和关联元数据的容器的格式。这些是容器格式。媒体文件具有一种容器格式(例如 MP4),通常以文件扩展名表示。请注意,对于某些纯音频格式(例如 MP3),样本格式和容器格式可能相同。
  • 自适应流式传输技术,例如 DASH、SmoothStreaming 和 HLS。这些并不是媒体格式,但仍有必要定义 ExoPlayer 提供的支持级别。

下面几部分从高到低定义了 ExoPlayer 在每个级别的支持情况。最后两部分介绍对独立字幕格式和 HDR 视频播放的支持。

自适应流式传输

DASH

ExoPlayer 支持采用多种容器格式的 DASH。媒体流必须进行多路复用,这意味着必须在 DASH 清单中的不同 AdaptationSet 元素中定义视频、音频和文本(CEA-608 是一种例外情况,如下表所述)。所包含的音频和视频示例格式还必须受支持(请参阅示例格式部分了解详情)。

功能 支持 评论
容器
FMP4 仅限多路复用流
WebM 仅限多路复用流
马特罗斯卡 仅限多路复用流
MPEG-TS 未安排任何支持服务
字幕
TTML RAW,或嵌入 FMP4(符合 ISO/IEC 14496-30 标准)
WebVTT RAW,或嵌入 FMP4(符合 ISO/IEC 14496-30 标准)
CEA-608 在使用 SCTE 无障碍功能描述符发送信号时嵌入到 FMP4 中
CEA-708 在使用 SCTE 无障碍功能描述符发送信号时嵌入到 FMP4 中
Metadata
EMSG 元数据 已嵌入到 FMP4 中
内容保护
Widevine “cenc”架构:API 19+;“cbcs”架构:API 25+
PlayReady SL2000 Android TV,仅限“cenc”方案
清除键 API 21+,仅限“cenc”架构
实时播放
定期直播
超低延迟 CMAF 实时播放
通用媒体客户端数据 (CMCD) 集成指南

SmoothStreaming

ExoPlayer 支持采用 FMP4 容器格式的 SmoothStreaming。媒体流必须进行多路复用,这意味着必须在 SmoothStreaming 清单中的不同 StreamIndex 元素中定义视频、音频和文本。所包含的音频和视频示例格式也必须受支持(详情请参阅示例格式部分)。

功能 支持 评论
容器
FMP4 仅限多路复用流
字幕
TTML 已嵌入到 FMP4 中
内容保护
PlayReady SL2000 仅分发至 Android TV
实时播放
定期直播
通用媒体客户端数据 (CMCD) 集成指南

HLS

ExoPlayer 支持采用多种容器格式的 HLS。所包含的音频和视频示例格式也必须受支持(详情请参阅示例格式部分)。我们强烈建议 HLS 内容制作者生成高品质 HLS 流,如此处所述。

功能 支持 评论
容器
MPEG-TS
FMP4/CMAF
ADTS (AAC)
MP3
字幕
CEA-608
CEA-708
WebVTT
Metadata
ID3
SCTE-35
内容保护
AES-128
AES-128 示例
Widevine API 19+(“cenc”架构)和 25+(“cbcs”架构)
PlayReady SL2000 仅分发至 Android TV
服务器控制
增量更新
禁止重新加载播放列表
阻止预加载提示的加载 长度未定义的 byterange 除外
实时播放
定期直播
低延迟 HLS (Apple)
低延迟 HLS(社区)
通用媒体客户端数据 (CMCD) 集成指南

渐进式容器格式

以下容器格式的流可以直接由 ExoPlayer 播放。所包含的音频和视频示例格式也必须受支持(请参阅示例格式部分了解详情)。

容器格式 支持 评论
MP4
M4A
FMP4
WebM
马特罗斯卡
MP3 有些视频流只能使用恒定码率搜寻**
奥格 包含 Vorbis、Opus 和 FLAC
波士顿航空 (WAV)
MPEG-TS
MPEG-PS
FLV 不可查找*
ADTS (AAC) 只能使用恒定码率搜寻**
FLAC 使用 FLAC 库ExoPlayer 库中的 FLAC 提取器***
AMR 只能使用恒定码率搜寻**
JPEG 动态照片 仅提取 MP4 内容

* 跳转功能不受支持,因为容器不提供元数据(例如示例索引)来支持媒体播放器高效执行跳转。 如果需要跳转,我们建议使用更合适的容器格式。

** 这些提取器具有 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING 标记,用于使用恒定比特率假设启用近似跳转。此功能默认处于停用状态。如需为所有支持此功能的提取器启用此功能,最简单的方法是使用 DefaultExtractorsFactory.setConstantBitrateSeekingEnabled,如此处所述。

*** FLAC 库提取器输出原始音频,可由框架在所有 API 级别上处理。ExoPlayer 库 FLAC 提取器会输出 FLAC 音频帧,因此依赖于 FLAC 音频帧(例如,处理 FLAC 的 MediaCodec 解码器(API 级别 27 要求)或启用了 FLAC 的 FFmpeg 库)。如果应用是使用 FLAC 库构建的,则 DefaultExtractorsFactory 会使用扩展提取器。否则,它会使用 ExoPlayer 库提取器。

RTSP

ExoPlayer 支持直播和点播 RTSP。下面列出了支持的示例格式和网络类型。

支持的示例格式

  • H264(SDP 媒体说明必须在 fmtp 属性中包含 SPS/PPS 数据以进行解码器初始化)。
  • AAC(使用 ADTS 比特流)。
  • AC3。

支持的网络类型

  • 基于 UDP 单播的 RTP(不支持多播)。
  • 交错 RTSP,即使用 TCP 基于 RTSP 的 RTP。

示例格式

默认情况下,ExoPlayer 使用 Android 的平台解码器。因此,支持的示例格式取决于底层平台,而不是 ExoPlayer。如需了解有关 Android 设备支持的示例格式的文档,请参阅支持的媒体格式。请注意,个别设备可能支持列出的格式之外的其他格式。

除了 Android 的平台解码器之外,ExoPlayer 还可以使用软件解码器扩展。这些 API 必须手动构建,并将其添加到要使用它们的项目中。我们目前为 AV1VP9FLACOpusFFmpeg 提供软件解码器库。

FFmpeg 库

FFmpeg 库支持解码多种不同的音频样本格式。您可以选择在构建库时要包含的解码器,如库的 README.md 中所述。下表提供了从音频样本格式到相应 FFmpeg 解码器名称的映射关系。

示例格式 解码器名称
Vorbis 沃尔比斯
Opus 作品
FLAC Flac
ALAC 阿拉克
PCM μ 律 pcm_mulaw
PCM A 法 pcm_alaw
MP1、MP2、MP3 MP3
AMR-NB Amrnb
AMR-WB CANNOT TRANSLATE
AAC AAC
交流-3 AC3
E-AC-3 eac3
DTS、DTS-HD DCA
真高清 MLP true

独立的字幕格式

ExoPlayer 支持各种格式的独立字幕文件。按照媒体内容页面中的说明,可以旁加载字幕文件。

容器格式 支持 MIME 类型
WebVTT MIME 类型.TEXT_VTT
TTML / SMPTE-TT MIME 类型.APPLICATION_TTML
SubRip MIME 类型.APPLICATION_SUBRIP
SubStationAlpha (SSA/ASS) MIME 类型.TEXT_SSA

HDR 视频播放

ExoPlayer 负责处理各种容器中的高动态范围 (HDR) 视频提取事宜,包括 MP4 中的杜比视界和 Matroska/WebM 中的 HDR10+。解码和显示 HDR 内容取决于 Android 平台和设备的支持。请参阅 HDR 视频播放,了解如何检查 HDR 解码/显示功能,以及各个 Android 版本对 HDR 支持的限制。

在播放需要支持特定编解码器配置文件的 HDR 流时,ExoPlayer 的默认 MediaCodec 选择器将选择支持该配置文件(如果有)的解码器,即使不支持该配置文件的同一 MIME 类型的其他解码器出现在编解码器列表更靠前的位置,也是如此。这可能导致在数据流超出相同 MIME 类型的硬件解码器功能的情况下选择软件解码器。