定义 ExoPlayer 支持的格式时,需要注意“媒体格式”是在多个级别定义的。从最低级别到最高级别,这些是:
- 单个媒体样本的格式(例如视频帧或音频帧)。这些是样本格式。请注意,典型的视频文件将包含至少两种样本格式的媒体;一种用于视频(例如,H.264),另一种用于音频(例如,AAC)。
- 容纳媒体样本及其关联元数据的容器格式。这些是容器格式。一个媒体文件只有一个容器格式(例如,MP4),通常由文件扩展名指示。请注意,对于某些仅限音频的格式(例如,MP3),样本格式和容器格式可能相同。
- 自适应流技术,例如 DASH、SmoothStreaming 和 HLS。这些本身并不是媒体格式,但是仍然需要定义 ExoPlayer 提供的支持级别。
以下部分按从高到低的顺序定义 ExoPlayer 在每个级别的支持情况。最后两部分描述了对独立字幕格式和 HDR 视频播放的支持。
自适应流
DASH
ExoPlayer 支持具有多种容器格式的 DASH。媒体流必须进行解复用,这意味着视频、音频和文本必须在 DASH 清单中定义为不同的AdaptationSet
元素(CEA-608 是一个例外,如下表所述)。包含的音频和视频样本格式也必须受支持(有关详细信息,请参阅样本格式 部分)。
功能 | 支持 | 备注 |
---|---|---|
容器 | ||
FMP4 | 是 | 仅限解复用流 |
WebM | 是 | 仅限解复用流 |
Matroska | 是 | 仅限解复用流 |
MPEG-TS | 否 | 暂无支持计划 |
隐藏式字幕/字幕 | ||
TTML | 是 | 原始格式,或根据 ISO/IEC 14496-30 嵌入到 FMP4 中 |
WebVTT | 是 | 原始格式,或根据 ISO/IEC 14496-30 嵌入到 FMP4 中 |
CEA-608 | 是 | 使用 SCTE Accessibility 描述符进行标记时嵌入在 FMP4 中 |
CEA-708 | 是 | 使用 SCTE Accessibility 描述符进行标记时嵌入在 FMP4 中 |
元数据 | ||
EMSG 元数据 | 是 | 嵌入在 FMP4 中 |
内容保护 | ||
Widevine | 是 | "cenc" 方案:API 19+;"cbcs" 方案:API 25+ |
PlayReady SL2000 | 是 | Android TV,仅限 "cenc" 方案 |
ClearKey | 是 | 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 | 是 | |
元数据 | ||
ID3 | 是 | |
SCTE-35 | 否 | |
内容保护 | ||
AES-128 | 是 | |
样本 AES-128 | 否 | |
Widevine | 是 | API 19+(“cenc”方案)和 25+(“cbcs”方案) |
PlayReady SL2000 | 是 | 仅限 Android TV |
服务器控制 | ||
增量更新 | 是 | |
阻止播放列表重新加载 | 是 | |
阻止预加载提示的加载 | 是 | 字节范围长度未定义的情况除外 |
实时播放 | ||
常规实时播放 | 是 | |
低延迟 HLS(Apple) | 是 | |
低延迟 HLS(社区) | 否 | |
通用媒体客户端数据 (CMCD) | 是 | 集成指南 |
渐进式容器格式
ExoPlayer 可以直接播放以下容器格式的流。包含的音频和视频样本格式也必须受支持(有关详细信息,请参阅样本格式 部分)。有关图像容器和格式支持,请参阅图像。
容器格式 | 支持 | 备注 |
---|---|---|
MP4 | 是 | |
M4A | 是 | |
FMP4 | 是 | |
WebM | 是 | |
Matroska | 是 | |
MP3 | 是 | 仅部分流可以使用恒定比特率查找进行查找** |
Ogg | 是 | 包含 Vorbis、Opus 和 FLAC |
WAV | 是 | |
MPEG-TS | 是 | |
MPEG-PS | 是 | |
FLV | 是 | 不可查找* |
ADTS (AAC) | 是 | 仅可以使用恒定比特率查找进行查找** |
FLAC | 是 | 使用FLAC 库或ExoPlayer 库中的 FLAC 提取器*** |
AMR | 是 | 仅可以使用恒定比特率查找进行查找** |
* 不支持查找,因为容器不提供元数据(例如,样本索引)来允许媒体播放器以有效的方式执行查找。如果需要查找,我们建议使用更合适的容器格式。
** 这些提取器具有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 还可以使用软件解码器扩展。这些必须手动构建并包含在希望使用它们的项目中。我们目前提供用于AV1、VP9、FLAC、Opus和FFmpeg的软件解码器库。
FFmpeg 库
FFmpeg 库支持解码各种不同的音频样本格式。您可以在构建库时选择要包含的解码器,如库的README.md中所述。下表提供了音频样本格式与其对应的 FFmpeg 解码器名称的映射。
样本格式 | 解码器名称 |
---|---|
Vorbis | vorbis |
Opus | opus |
FLAC | flac |
ALAC | alac |
PCM μ-law | pcm_mulaw |
PCM A-law | pcm_alaw |
MP1、MP2、MP3 | mp3 |
AMR-NB | amrnb |
AMR-WB | amrwb |
AAC | aac |
AC-3 | ac3 |
E-AC-3 | eac3 |
DTS、DTS-HD | dca |
TrueHD | mlp truehd |
图像
ExoPlayer 支持以下图像格式。有关如何与可能提供对不同格式集的支持的外部库集成的信息,请参阅图像加载库。
图像格式 | 支持 | 备注 |
---|---|---|
BMP | 是 | |
GIF | 否 | 无提取器支持 |
JPEG | 是 | |
JPEG 动态照片 | 是 | 支持静态图像和视频 |
JPEG 超高清 HDR | 是 | 在 Android 14 之前或非 HDR 显示器上回退到 SDR |
PNG | 是 | |
WebP | 是 | |
HEIF/HEIC | 是 | |
HEIC 动态照片 | 部分支持 | 仅支持静态图像* |
AVIF(基线) | 是 | 仅在 Android 14+ 上解码 |
* 可以使用MetadataRetriever获取 HEIC 动态照片的视频部分,并将其作为独立文件播放。
独立字幕格式
ExoPlayer 支持各种格式的独立字幕文件。可以根据媒体项目页面上的说明侧载字幕文件。
容器格式 | 支持 | MIME 类型 |
---|---|---|
WebVTT | 是 | MimeTypes.TEXT_VTT |
TTML / SMPTE-TT | 是 | MimeTypes.APPLICATION_TTML |
SubRip | 是 | MimeTypes.APPLICATION_SUBRIP |
SubStationAlpha (SSA/ASS) | 是 | MimeTypes.TEXT_SSA |
HDR 视频播放
ExoPlayer 处理各种容器中的高动态范围 (HDR) 视频提取,包括 MP4 中的 Dolby Vision 和 Matroska/WebM 中的 HDR10+。HDR 内容的解码和显示取决于 Android 平台和设备的支持。请参阅HDR 视频播放,了解如何检查 HDR 解码/显示功能以及跨 Android 版本的 HDR 支持的限制。
播放需要特定编解码器配置文件支持的 HDR 流时,ExoPlayer 的默认MediaCodec
选择器将选择支持该配置文件的解码器(如果可用),即使另一个不支持该配置文件的相同 MIME 类型的解码器出现在编解码器列表的更上方。这可能会导致在流超过相同 MIME 类型的硬件解码器功能的情况下选择软件解码器。