定义 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 必须手动构建,并将其添加到要使用它们的项目中。我们目前为 AV1、VP9、FLAC、Opus 和 FFmpeg 提供软件解码器库。
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 类型的硬件解码器功能的情况下选择软件解码器。