數位版權管理

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,以及其他屬性。玩家會使用這些屬性,建立適合多數用途的 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。提供者可以選擇是否要在每次新的 Manager 執行個體時例項化。一律使用相同的執行個體:

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)) 的任何 Android 版本裝置上播放 DRM 保護的內容時,遇到影片延遲問題,可嘗試啟用非同步緩衝區佇列