Возможно, вы пытаетесь сделать это под эмулятором или с прикрепленным отладчиком? Технологии DRM, как правило, имеют очень туманный взгляд на любой из них и отключают себя, когда предпринимаются такие действия.
Я использую Android NDK MediaDrm API для дешифрования блоков доступа к видео с помощью PlayReady.
Я обнаружил, что некоторые вызовы API зависают бесконечно. Эти призы все успешны в этом порядке:
AMediaDrm_createByUUID()
AMediaDrm_openSession()
AMediaDrm_getKeyRequest()
AMediaDrm_provideKeyResponse()
Но после AMediaDrm_provideKeyResponse()
звонка любой звонок AMediaDrm_closeSession()
или AMediaDrm_decrypt()
будет вечно вечно. Рассматривая разборку в обоих случаях, мы застреваем на линии, прыгающей на себя, например:
0xf2ea9dec: jmp 0xf2ea9dec
AMediaDrm_closeSession()
работает при вызове сразу после AMediaDrm_openSession()
или AMediaDrm_getKeyRequest()
.
Кто-нибудь испытал эту проблему раньше? С чем я могу ошибиться AMediaDrm_provideKeyResponse()
?
android,android-ndk,drm,playready,
Поэтому я просто наткнулся на это сам. Я тестирую Android 6 прямо сейчас, поэтому я надеюсь, что это исправлено в A7 или в какой-то будущей версии (API для закрытия сеанса, который висит, кажется ужасной идеей, поэтому я предполагаю, что это ошибка).
Однако я придумал решение. Я подозреваю, что мы оба не использовали API, как предполагалось, потому что, если я выпущу ключи из сеанса перед закрытием сессии drm, все будет работать отлично. Вот так:
AMediaDrm* mediadrm = NULL;
AMediaDrmKeySetId keySetId;
AMediaDrmSessionId drmsessionid;
< ... Code to do everything else that you need to do before you get to this point ... >
AMediaDrm_provideKeyResponse(mediadrm, &drmsessionid, &drmKey[0], drmKey.size(), &keySetId);
< ... Use your session to playback some DRM protected content ... >
AMediaDrm_removeKeys(mediadrm,&keySetId);
AMediaDrm_closeSession(mediadrm, &drmsessionid);
AMediaDrm_release(mediadrm);
Я знаю, что это немного поздно, поэтому я надеюсь, что вы нашли решение своей проблемы.