我使用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()
做错了吗?
答案 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);
我知道这有点晚了,所以我希望你找到解决问题的方法。