在 Exoplayer 2 中使用 ClearKey DRM Schema 时出现播放错误 android
Playback error on using ClearKey DRM Schema in Exoplayer 2 android
我正在尝试播放 .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)
请指导我,我做错了什么
查看密钥字符串的长度,最有可能的问题是在调用 LocalMediaDrmCallback 时密钥没有经过 base64URL 编码。
AES 128 位密钥将是:
- 32 个字符作为十六进制密钥
- base64 编码时为 24 个字符
假设 a4631a153a443df9eed0593043db7519 是十六进制格式的密钥,那么您需要将其(以及 keyID)转换为 base64,然后以这种方式将它们传递给 LocalMediaDrmCallback。
使用一种常见的在线转换器,您可以看到这将给出:
- 十六进制密钥:a4631a153a443df9eed0593043db7519
- base64编码的pGMaFTpEPfnu0FkwQ9t1GQ==
您也可以在这个 GitHub 问题答案中看到以编程方式执行此操作的示例:https://github.com/google/ExoPlayer/issues/3856#issuecomment-366197586
从 keyString 中删除 \n 后它工作正常..:)
我正在尝试播放 .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)
请指导我,我做错了什么
查看密钥字符串的长度,最有可能的问题是在调用 LocalMediaDrmCallback 时密钥没有经过 base64URL 编码。
AES 128 位密钥将是:
- 32 个字符作为十六进制密钥
- base64 编码时为 24 个字符
假设 a4631a153a443df9eed0593043db7519 是十六进制格式的密钥,那么您需要将其(以及 keyID)转换为 base64,然后以这种方式将它们传递给 LocalMediaDrmCallback。
使用一种常见的在线转换器,您可以看到这将给出:
- 十六进制密钥:a4631a153a443df9eed0593043db7519
- base64编码的pGMaFTpEPfnu0FkwQ9t1GQ==
您也可以在这个 GitHub 问题答案中看到以编程方式执行此操作的示例:https://github.com/google/ExoPlayer/issues/3856#issuecomment-366197586
从 keyString 中删除 \n 后它工作正常..:)