2015-01-29 2 views
1

Я использую API NDK MediaDrm для Android, чтобы расшифровать блоки доступа к видео с помощью PlayReady.Android MediaDrm PlayReady - вызовы API зависают

Я обнаружил, что некоторые вызовы 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()?

ответ

0

Возможно, вы пытаетесь сделать это под эмулятором или с прикрепленным отладчиком? Технологии DRM, как правило, имеют очень туманный взгляд на любой из них и отключают себя, когда предпринимаются такие действия.

+0

Я использую Nexus Player. У меня был прикрепленный отладчик, но он был перестроен с помощью 'APP_OPTIM: = release' и опустил' NDK_DEBUG = 1' из моего вызова 'ndk-build', и я все еще испытываю эту проблему. – Jack

0

Так что я просто наткнулся на это сам. Я тестирую 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); 

Я знаю, что это немного поздно, поэтому я надеюсь, что вы нашли решение своей проблемы.

 Смежные вопросы

  • Нет связанных вопросов^_^