Итак, я пытаюсь воспроизвести зашифрованное содержимое в файле 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 правильно инициализирован. Буду очень признателен за любую помощь.
Заранее спасибо.