数字版权管理

ExoPlayer 使用 Android 的 MediaDrm API 来支持受 DRM 保护的播放。 不同受支持 DRM 方案所需的最低 Android 版本,以及 以及支持的流式传输格式, 下表:

DRM 方案 Android 版本号 Android API 级别 支持的格式
Widevine“cenc” 4.4 19 DASH、HLS(仅限 FMP4)
Widevine“cbcs” 7.1 25 DASH、HLS(仅限 FMP4)
ClearKey "cenc" 5.0 21 DASH
PlayReady SL2000“cenc” Android TV Android TV DASH、SmoothStreaming、HLS(仅限 FMP4)

为了使用 ExoPlayer 播放受 DRM 保护的内容,DRM 的 UUID 必须指定系统 创建媒体项时 属性。然后,播放器会使用这些属性 构建 DrmSessionManager 的默认实现,称为 DefaultDrmSessionManager,适用于大多数用例。特定用途 某些情况下,可能还需要其他 DRM 属性, 部分。

密钥轮替

如需使用轮替密钥播放直播内容,请将 true 传递给 MediaItem.DrmConfiguration.Builder.setMultiSession(在构建媒体时) 内容。

多键内容

多键内容由多个直播组成,其中一些直播使用不同的直播功能 密钥。多键内容可通过以下两种方式播放,具体取决于 许可服务器的配置方式。

案例 1:许可服务器返回内容的所有密钥进行响应

在这种情况下,许可服务器的配置如下: 请求一个键时,它会以相应内容的所有键作为响应。这个支持请求是 由 ExoPlayer 处理,无需任何特殊配置。适应 即使两个视频流(例如标清和高清视频)使用不同的 键。

我们建议您尽可能将许可服务器配置为 。这是支持多键播放的最高效、最可靠的方式 内容,因为它不需要客户端发出多个许可请求 以访问不同的视频流

案例 2:许可服务器仅返回所请求的密钥

在此情况下,许可服务器配置为仅使用密钥进行响应 指定名称。此许可支持播放多键内容 将 true 传递给 MediaItem.DrmConfiguration.Builder.setMultiSession(在构建媒体时) 内容。

我们不建议您将许可服务器配置为以此方式运行。它 需要额外的许可请求才能播放多键内容, 比上述替代方案更高效、更可靠。

离线密钥

可通过将密钥组 ID 传递给 MediaItem.DrmConfiguration.Builder.setKeySetId。 这将允许使用离线按键(已设置为 指定的 ID。

<ph type="x-smartling-placeholder">

清除内容的 DRM 会话

使用占位符 DrmSessions 可让 ExoPlayer 对 与播放加密内容时所使用的内容相同。当媒体包含 明文部分和加密部分,那么建议使用占位符 DrmSessions 避免在清晰和加密之间的转换时重新创建解码器 部分。对音频和视频轨道使用占位符 DrmSessionstrue 传递给 MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks,当 构建媒体项

使用自定义 DrmSessionManager

如果应用想要自定义用于播放的 DrmSessionManager,可以 实现 DrmSessionManagerProvider 并将其传递给 MediaSource.Factory在构建播放器时使用。提供商可以 选择是否每次都实例化一个新的管理器实例。始终 使用同一个实例:

Kotlin

val customDrmSessionManager: DrmSessionManager = CustomDrmSessionManager()
// Pass a drm session manager provider to the media source factory.
val mediaSourceFactory =
  DefaultMediaSourceFactory(context).setDrmSessionManagerProvider { customDrmSessionManager }

Java

DrmSessionManager customDrmSessionManager = new CustomDrmSessionManager(/* ... */ );
// Pass a drm session manager provider to the media source factory.
MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDrmSessionManagerProvider(mediaItem -> customDrmSessionManager);

提升播放性能

如果您在使用 搭载 Android 6.0(API 级别 23)至更高版本的设备 包括 Android 11(API 级别 30),您可以尝试启用异步缓冲区 排队