數位版權管理

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 保護的內容時,發現影片出現斷斷續續的情形,可以嘗試啟用非同步緩衝區排序功能