在Exoplayer 2安卓系统中使用ClearKey DRM架构时播放错误



我正在尝试玩。MPD文件,该文件正在使用

DRMSchema:clearKey

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

String keyString = "{"keys":[{"kty":"oct","k":"y1QQhMmXMa70__dFAMEurQn" +
"    ","kid":"bXbyXLF_Xha46u9rv1gtjgn" +
"    "},{"kty":"oct","k":"pGMaFTpEPfnu0FkwQ9t1GQn" +
"    ","kid":"88XgNh5mVLKPgEnHeLI5Rgn" +
"    "}],'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);

之后,当我尝试使用此DefaultDrmSessionManager播放视频时,我会得到ExoPlayerImplInternal:播放错误,我会附加日志以供参考。

E/ExoPlayerImplInternal: **Playback error**.
com.google.android.exoplayer2.ExoPlaybackException
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:780)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:583)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:518)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:301)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:164)
at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: android.media.MediaCodec$CryptoException: **Crypto key not available**
at android.media.MediaCodec.native_queueSecureInputBuffer(Native Method)
at android.media.MediaCodec.queueSecureInputBuffer(MediaCodec.java:2547)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:771)

请引导我,我做错了什么

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

AES 128位密钥为:

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

假设a4631A53a43df9eed0593043db7519是十六进制格式的密钥,则需要将其(以及密钥ID(转换为base64,然后以这种方式将其传递给LocalMediaDrmCallback。

使用一个常见的在线转换器,你可以看到这将给出:

  • 六角扳手:a4631a153a43df9eed0593043db7519
  • base64编码pGMaFTpEPfnu0FkwQ9t1GQ==

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

从keyString..中删除后,它运行良好。:(

最新更新