ExoPlayer 使用 Android 的 MediaDrm API 支援受 DRM 保護的內容播放。下表列出不同 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,建構播放器時會使用這個項目。提供者可以選擇是否每次都例項化新的管理員例項。如要一律使用相同執行個體:
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 保護的內容時發生影片延遲問題,可以嘗試啟用非同步緩衝區佇列。