在Exoplayer 2 android中使用ClearKey DRM架构时播放错误

时间:2018-11-22 07:48:30

标签: android exoplayer drm mpeg-dash exoplayer2.x

我正在尝试播放 .MPD 文件,该文件正在使用

DRMSchema :clearKey

为了播放它,我正在以以下方式创建 DefaultDrmSessionManager

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"></script>
<script src="https://rawgit.com/rzajac/angularjs-slider/master/dist/rzslider.js"></script>
<div ng-app="myapp">
  <div ng-controller="TestController as vm">
    <p>Price: {{vm.priceSlider.value}}</p>
    <rzslider rz-slider-model="vm.likelihood.a"
                                        rz-slider-high="vm.likelihood.b" rz-slider-options="vm.priceSlider.options" rz-slider-translate="vm.translate" rz-slider-step-array="vm.stepArray"></rzslider>
  </div>
</div>

此后,当我尝试使用此 DefaultDrmSessionManager 播放视频时,出现 ExoPlayerImplInternal:播放错误,我附上了日志以供参考。 / p>

 String keyString = "{\"keys\":[{\"kty\":\"oct\",\"k\":\"y1QQhMmXMa70__dFAMEurQ\n" +
                "    \",\"kid\":\"bXbyXLF_Xha46u9rv1gtjg\n" +
                "    \"},{\"kty\":\"oct\",\"k\":\"pGMaFTpEPfnu0FkwQ9t1GQ\n" +
                "    \",\"kid\":\"88XgNh5mVLKPgEnHeLI5Rg\n" +
                "    \"}],'type':\"temporary\"}";

LogMgr.i("DRMCallback JSON : " + keyString);

drmCallback = new LocalMediaDrmCallback(keyString.getBytes());

mediaDrm = FrameworkMediaDrm.newInstance(uuid);

DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager = new DefaultDrmSessionManager<>(uuid, mediaDrm, drmCallback, null, multiSession);

请指导我,我做错了

2 个答案:

答案 0 :(得分:1)

从密钥字符串的长度来看,最可能的问题是该密钥在对LocalMediaDrmCallback的调用中没有经过base64URL编码。

一个AES 128位密钥将是:

  • 32个字符作为十六进制键
  • base64编码时为24个字符

假设a4631a153a443df9eed0593043db7519是十六进制格式的密钥,那么您需要将其(也包括keyID)转换为base64,然后以这种方式将其传递给LocalMediaDrmCallback。

使用一种常见的在线转换器,您会看到:

  • 十六进制键:a4631a153a443df9eed0593043db7519
  • base64编码的pGMaFTpEPfnu0FkwQ9t1GQ ==

您还可以在以下GitHub问题答案中看到以编程方式执行此操作的示例:https://github.com/google/ExoPlayer/issues/3856#issuecomment-366197586

答案 1 :(得分:0)

从keyString删除\ n后,它工作正常。:)

相关问题