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),您可以嘗試啟用非同步緩衝區 佇列。