數位版權管理

ExoPlayer 會使用 Android 的 MediaDrm API,支援受數位版權管理保護的播放功能。下表說明不同支援的 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 和授權伺服器 URI。玩家接著會使用這些屬性建構 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,以免在清除和加密區段之間轉換時重新建立解碼器。在建構媒體項目時,將 true 傳遞至 MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks,即可啟用在音訊和視訊軌中使用預留位置 DrmSessions

使用自訂 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 保護的內容時,出現影片延遲的情形,可嘗試啟用非同步緩衝區佇列