Крипто ключ недоступен - ExoPlayer - PullRequest
0 голосов
/ 20 марта 2020

Итак, я пытаюсь воспроизвести зашифрованное содержимое в файле Da sh (.mpd), упакованном с помощью Shaka Packager и зашифрованном методом CEN C. Медиа воспроизводится абсолютно нормально на Shaka Player, но я не могу воспроизвести его на ExoPlayer в Android. При воспроизведении Logcat отображает следующую ошибку:

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:2699)
    at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:1188)
    at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:719) 
    at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:599) 
    at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:329) 
    at android.os.Handler.dispatchMessage(Handler.java:103) 
    at android.os.Looper.loop(Looper.java:237) 
    at android.os.HandlerThread.run(HandlerThread.java:67) 

Build.Gradle имеет ограничение минимального Sdk на API 21, поэтому проверяется, и используется код:

    player = new SimpleExoPlayer.Builder(this).build();
    ep.setPlayer(player);

    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "AppName"));
    Uri uri = Uri.parse(Tools.baseAddress+"VIDEO/"+i.getStringExtra("ModuleID")+"/index.php").buildUpon().appendQueryParameter("token", Tools.token).build();

    String keyString = "{\"keys\":[{\"kty\":\"oct\",\"k\":\"76a6c65c5ea762046bd749a2e632ccbb\",\"kid\":\"a7e61c373e219033c21091fa607bf3b8\"}],'type':\"temporary\"}";

    LocalMediaDrmCallback drmCallback = new LocalMediaDrmCallback(keyString.getBytes());
    DrmSessionManager manager=null;
    manager = new DefaultDrmSessionManager.Builder()
            .setPlayClearSamplesWithoutKeys(true)
            .setMultiSession(false)
            .setUuidAndExoMediaDrmProvider(C.CLEARKEY_UUID, FrameworkMediaDrm.DEFAULT_PROVIDER)
            .build(drmCallback);

    MediaSource dashMediaSource = new DashMediaSource.Factory(dataSourceFactory).setDrmSessionManager(manager).createMediaSource(uri);

    player = new SimpleExoPlayer.Builder(this).build();

    ep.setPlayer(player);
    player.prepare(dashMediaSource);

И команда, использованная при упаковке видео MP4 с использованием Shaka Packager, была:

.\packager input=videoplayback.mp4,stream=video,output=video.mp4 input=videoplayback.mp4,stream=audio,output=audio.mp4 --enable_raw_key_encryption --keys key_id=a7e61c373e219033c21091fa607bf3b8:key=76a6c65c5ea762046bd749a2e632ccbb --clear_lead 0 --mpd_output dash.mpd

Я не уверен, что правильное формирование ключа или диспетчер сеансов DRM правильно инициализирован. Буду очень признателен за любую помощь.
Заранее спасибо.

1 Ответ

1 голос
/ 23 марта 2020

Наиболее вероятная причина заключается в том, что метод LocalMediaDrmCallback ожидает, что ключ и key_id будут в кодировке base64url.

Вы можете преобразовать свой ключ и key_id в это с помощью онлайн-инструмента, такого как:

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

...