2015-01-29 4 views
1

Android NDK MediaDrm API를 사용하여 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); 

나는 이것이 조금 늦다는 것을 알고 있습니다. 그래서 당신의 문제에 대한 해결책을 찾았 으면합니다.