Android MediaDrm PlayReady - API调用挂起

时间:2015-01-29 13:28:05

标签: android android-ndk drm playready

我使用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()做错了吗?

2 个答案:

答案 0 :(得分:0)

您是在仿真器下还是在附加调试器的情况下尝试此操作? DRM技术倾向于对这两种方法都采取非常暗淡的观点,并在尝试此类操作时自行禁用。

答案 1 :(得分: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);

我知道这有点晚了,所以我希望你找到解决问题的方法。