Ошибка воспроизведения при использовании ClearKey DRM Schema в Android Exoplayer 2
Я пытаюсь воспроизвести файл .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: ошибка воспроизведения, я прилагаю журнал для справки.
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)
Пожалуйста, направьте меня, что я делаю не так
2 ответа
Если посмотреть на длину строки ключа, наиболее вероятная проблема заключается в том, что ключ не был закодирован в base64URL при вызове LocalMediaDrmCallback.
128-битный ключ AES будет:
- 32 символа в виде шестнадцатеричного ключа
- 24 символа при кодировании base64
Предполагая, что a4631a153a443df9eed0593043db7519 является ключом в шестнадцатеричном формате, вам необходимо преобразовать его (и также идентификатор ключа) в base64, а затем передать их таким образом в LocalMediaDrmCallback.
Используя один из распространенных онлайн-конвертеров, вы увидите, что это даст:
- шестнадцатеричный ключ: a4631a153a443df9eed0593043db7519
- закодированный в base64 pGMaFTpEPfnu0FkwQ9t1GQ==
Вы можете увидеть пример того, как это сделать программно, в ответе на этот вопрос GitHub: https://github.com/google/ExoPlayer/issues/3856.