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。
清除内容的 DRM 会话
使用占位符 DrmSessions
可让 ExoPlayer
对
与播放加密内容时所使用的内容相同。当媒体包含
明文部分和加密部分,那么建议使用占位符 DrmSessions
避免在清晰和加密之间的转换时重新创建解码器
部分。对音频和视频轨道使用占位符 DrmSessions
将 true
传递给
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),您可以尝试启用异步缓冲区 排队。