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 保護的內容時,遇到影片延遲問題,可嘗試啟用非同步緩衝區佇列。