數位版權管理

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 避免在經過加密和加密的轉換之間重新建立解碼器 會出現 ANR 區段將預留位置 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);

改善播放效能

如果在播放受到 DRM 保護的內容時, 搭載 Android 6.0 (API 級別 23) 及以下版本的任何 Android 裝置 包括 Android 11 (API 級別 30),您可以嘗試啟用非同步緩衝區 佇列