android - 在 Exoplayer 2 android 中使用 ClearKey DRM Schema 时出现播放错误

标签 android exoplayer drm mpeg-dash exoplayer2.x

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

DRMSchema : clearKey

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

 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);

在那之后,当我尝试使用此 DefaultDrmSessionManager 播放视频时,我收到 ExoPlayerImplInternal: Playback error,我附上日志以供引用。

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)

请指导我,我做错了什么

最佳答案

查看 key 字符串的长度,最有可能的问题是在调用 LocalMediaDrmCallback 时 key 没有经过 base64URL 编码。

AES 128 位 key 将是:

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

假设 a4631a153a443df9eed0593043db7519 是十六进制格式的 key ,那么您需要将它(以及 keyID)转换为 base64,然后以这种方式将它们传递给 LocalMediaDrmCallback。

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

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

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

关于android - 在 Exoplayer 2 android 中使用 ClearKey DRM Schema 时出现播放错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53426119/

相关文章:

ios - 为 HTTP Live Streaming 加密/解密部分文件

ffmpeg - 加密的 HLS 无法在 iPad 2 中播放

javascript - 保护 PhantomJS 脚本免受最终用户的攻击

android - 重复类 com.google.android.flexbox - Android Admob

android - fragment 中的 setContentView

android - Android 中 AbsoluteLayout 的替代方案?

android - 在许多 Android Activity 中使用当前位置

android - 为流式 mp4 视频设置标题并使用 Exoplayer 播放文件

Android:使用视频动态模糊表面

java - 在android项目中导入和使用jar文件