在定义 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 无障碍描述符发出信号时嵌入到 FMP4 中 |
| CEA-708 | 是 | 使用 SCTE 无障碍描述符发出信号时嵌入到 FMP4 中 |
| 元数据 | ||
| EMSG 元数据 | 是 | 嵌入在 FMP4 中 |
| 内容保护 | ||
| Widevine | 是 | “cenc”方案:API 19 及更高版本;“cbcs”方案:API 25 及更高版本 |
| PlayReady SL2000 | 是 | Android TV,仅限“cenc”方案 |
| ClearKey | 是 | API 21 及更高级别,仅限“cenc”方案 |
| 广告插播 | ||
| 多时段播放 | 是 | |
| 服务器引导的广告插播 (xlinks) | 否 | |
| IMA 服务器端广告和客户端广告 | 是 | 广告插播指南 |
| 直播 | ||
| 常规直播播放 | 是 | |
| 超低延迟 CMAF 直播 | 是 | |
| 通用媒体客户端数据 (CMCD) | 是 | 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 | 是 | |
| Sample AES-128 | 否 | |
| Widevine | 是 | API 19 及更高版本(“cenc”方案)和 25 及更高版本(“cbcs”方案) |
| PlayReady SL2000 | 是 | 仅分发至 Android TV |
| 服务器控制 | ||
| 增量更新 | 是 | |
| 阻止播放列表重新加载 | 是 | |
| 阻止加载预加载提示 | 是 | 长度未定义的字节范围除外 |
| 广告插播 | ||
| 服务器引导的广告插播(插页式广告) | 部分支持 | 仅限包含 X-ASSET-URI 的 VOD。
直播和X-ASSET-LIST将在稍后添加。 |
| IMA 服务器端广告和客户端广告 | 是 | 广告插播指南 |
| 直播 | ||
| 常规直播播放 | 是 | |
| 低延迟 HLS (Apple) | 是 | |
| 低延迟 HLS(社区) | 否 | |
| 通用媒体客户端数据 CMCD | 是 | 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、MIDI、IAMF 和 MPEG-H 提供软件解码器库。
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 Ultra HDR | 是 | 在 Android 14 之前或在非 HDR 显示屏上回退到 SDR |
| PNG | 是 | |
| WebP | 是 | |
| HEIF/HEIC | 是 | |
| HEIC 动态照片 | 是 | |
| AVIF(基准) | 是 | 仅在 Android 14 及更高版本上解码 |
独立字幕格式
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 流时,即使编解码器列表中相同 MIME 类型但不支持该配置文件的另一个解码器显示在更上方,ExoPlayer 的默认 MediaCodec 选择器也会选择支持该配置文件的解码器(如果有)。这样一来,在流超出同一 MIME 类型硬件解码器的能力范围时,可能会选择软件解码器。