如何在ExoPlayer2中配置ClearKey许可证?
ExoPlayer2 ClearKey 授权配置问题修复方案
核心问题排查与修复步骤
调整MediaSourceFactory配置顺序
当前代码先调用createMediaSource再设置DrmSessionManagerProvider,导致已创建的MediaSource未绑定DRM管理器。需先配置DRM管理器,再创建关联MediaSource:DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(this) .setDataSourceFactory(new DefaultHttpDataSource.Factory()) .setDrmSessionManagerProvider(mediaItem -> drmSessionManager); // 先绑定DRM管理器 player = new ExoPlayer.Builder(this, new DefaultRenderersFactory(this).forceEnableMediaCodecAsynchronousQueueing()) .setTrackSelector(new DefaultTrackSelector(this)) .setMediaSourceFactory(mediaSourceFactory) .build(); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(videoUri)); player.setMediaItem(mediaItem);验证ClearKey密钥编码格式
ClearKey要求kid和k必须是Base64URL编码(无填充字符),检查你的keyString:- 移除末尾的
=填充符 - 将Base64中的
+替换为-、/替换为_
- 移除末尾的
启用多会话支持
代码中包含多组密钥,需将setMultiSession(false)改为true,让DRM管理器支持多密钥会话:DefaultDrmSessionManager drmSessionManager = new DefaultDrmSessionManager.Builder() .setMultiSession(true) .setUuidAndExoMediaDrmProvider(C.CLEARKEY_UUID, FrameworkMediaDrm.DEFAULT_PROVIDER) .build(new LocalMediaDrmCallback(keyString.getBytes()));添加错误监听定位问题
给Player添加监听,捕获DRM相关错误信息:player.addListener(new Player.Listener() { @Override public void onPlayerError(PlaybackException error) { super.onPlayerError(error); if (error.errorCode == PlaybackException.ERROR_CODE_DRM_FAILED) { Log.e("DRM_ERROR", error.getMessage(), error); } } });明确MediaItem的DRM配置(可选)
部分场景下需给MediaItem指定DRM配置,确保与视频参数匹配:MediaItem mediaItem = new MediaItem.Builder() .setUri(Uri.parse(videoUri)) .setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.CLEARKEY_UUID) .setLicenseUri("") // ClearKey本地授权留空即可 .build()) .build();
内容的提问来源于stack exchange,提问作者Lionel Yayan
相关产品推荐
相关产品推荐

