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 保護的內容時,發現影片出現斷斷續續的情形,可以嘗試啟用非同步緩衝區排序功能。