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 和授權伺服器 URI。玩家接著會使用這些屬性建構 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
,以免在清除和加密區段之間轉換時重新建立解碼器。在建構媒體項目時,將 true
傳遞至 MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks
,即可啟用在音訊和視訊軌中使用預留位置 DrmSessions
。
使用自訂 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 保護的內容時,出現影片延遲的情形,可嘗試啟用非同步緩衝區佇列。