支持的格式

在定义 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
样本 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。

支持的网络类型

  • RTP over UDP 单播(不支持多播)。
  • 交错式 RTSP,RTP over RTSP 使用 TCP。

样本格式

默认情况下,ExoPlayer 使用 Android 的平台解码器。因此,支持的样本格式取决于底层平台而非 ExoPlayer。有关 Android 设备支持的样本格式文档,请参阅支持的媒体格式。请注意,单个设备可能支持列表中未列出的其他格式。

除了 Android 的平台解码器外,ExoPlayer 还可以使用软件解码器扩展。这些扩展必须手动构建并包含在希望使用它们的项目中。我们目前提供适用于 AV1VP9FLACOpusFFmpegMIDIIAMFMPEG-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 Motion Photo 支持静态图像和视频
JPEG Ultra HDR 在 Android 14 之前或在非 HDR 显示屏上,回退到 SDR
PNG
WebP
HEIF/HEIC
HEIC Motion Photo 部分支持 仅支持静态图像*
AVIF (基线) 仅在 Android 14+ 上解码

* HEIC 动态照片的视频部分可以通过 MetadataRetriever 获取,并作为独立文件播放。

独立字幕格式

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 解码/显示功能以及 HDR 支持在不同 Android 版本上的限制。

当播放需要支持特定编解码器配置文件的 HDR 流时,ExoPlayer 的默认 MediaCodec 选择器将选择支持该配置文件的解码器(如果可用),即使同一 MIME 类型中不支持该配置文件的其他解码器在编解码器列表中排名靠前。这可能导致在流超出同一 MIME 类型的硬件解码器能力时选择软件解码器。