數位版權管理

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 會處理這種情況,無須進行任何特殊設定。即使串流使用不同的金鑰,也能在串流之間 (例如 SD 和 HD 影片) 無縫調整。

建議您盡可能將授權伺服器設定為這種行為模式。這是支援播放多重金鑰內容最有效率且穩健的方法,因為用戶端不必提出多個授權要求,即可存取不同串流。

案例 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) 任何版本,且播放受 DRM 保護的內容時發生影片延遲問題,可以嘗試啟用非同步緩衝區佇列