支持的格式

在定义 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”方案
实时播放
常规直播播放
超低延迟 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、RTP over RTSP,使用 TCP。

示例格式

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

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

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 及更高版本中解码

* 您可以使用 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 中的杜比视界和 Matroska/WebM 中的 HDR10+。解码和显示 HDR 内容取决于 Android 平台和设备的支持。如需了解如何检查 HDR 解码/显示功能,以及各个 Android 版本的 HDR 支持限制,请参阅 HDR 视频播放

在播放需要支持特定编解码器配置文件的 HDR 流时,ExoPlayer 的默认 MediaCodec 选择器会选择支持该配置文件的解码器(如果有),即使针对同一 MIME 类型的另一个解码器不支持该配置文件,并且位于编解码器列表中更高的位置也是如此。这可能会导致在流超出相同 MIME 类型的硬件解码器功能时选择软件解码器。