Ошибка воспроизведения при использовании схемы ClearKey DRM в Exoplayer 2 android

Я пытаюсь воспроизвести файл .MPD, который использует

Схема DMS : 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)

Пожалуйста, направьте меня, что я делаю неправильно


person Kushal    schedule 22.11.2018    source источник
comment
Привет, мне нужна помощь по аналогичной проблеме в моем проекте. Пытался отправить вам запрос через linkedIn.   -  person Soumyadeep Ghosh    schedule 19.03.2020


Ответы (2)


Глядя на длину строки ключа, наиболее вероятная проблема заключается в том, что ключ не был закодирован в base64URL при вызове LocalMediaDrmCallback.

128-битный ключ AES будет:

  • 32 символа в виде шестнадцатеричного ключа
  • 24 символа при кодировке base64

Предполагая, что a4631a153a443df9eed0593043db7519 является ключом в шестнадцатеричном формате, вам необходимо преобразовать его (и идентификатор ключа также) в base64, а затем передать их таким образом в LocalMediaDrmCallback.

Используя один из распространенных онлайн-конвертеров, вы можете увидеть, что это даст:

  • шестигранный ключ: a4631a153a443df9eed0593043db7519
  • pGMaFTpEPfnu0FkwQ9t1GQ== в кодировке base64

Вы также можете увидеть пример выполнения этого программным способом в этом ответе на вопрос GitHub: https://github.com/google/ExoPlayer/issues/3856#issuecomment-366197586

person Mick    schedule 23.11.2018
comment
Спасибо @Mick, ваш ответ действительно помогает мне работать над правильной реализацией ключа Base64Url. Но после его реализации я получаю ту же ошибку. В моем логарифме я получаю сообщение Криптовалютный ключ недоступен, не могли бы вы помочь мне с этим. - person Kushal; 26.11.2018

Он отлично работает после удаления \n из keyString.. :)

person Kushal    schedule 26.11.2018