我正在使用Android NDK MediaDrm API通过PlayReady来解密视频访问单元。
我发现某些API调用会无限期地挂起。这些调用都是成功的,顺序如下:
AMediaDrm_createByUUID()
AMediaDrm_openSession()
AMediaDrm_getKeyRequest()
AMediaDrm_provideKeyResponse()
但是在AMediaDrm_provideKeyResponse()
调用之后,对AMediaDrm_closeSession()
或AMediaDrm_decrypt()
的任何调用都将永远挂起。看看这两种情况下的反汇编,我们都会陷入跳转到自身的行上,比如:
0xf2ea9dec: jmp 0xf2ea9dec
当直接在AMediaDrm_openSession()
或AMediaDrm_getKeyRequest()
之后调用时,AMediaDrm_closeSession()
可以工作。
以前有没有人遇到过这个问题?我是不是对AMediaDrm_provideKeyResponse()
做错了什么?
发布于 2015-02-03 15:02:11
您是否正在尝试在仿真器或附加调试器的情况下执行此操作?DRM技术倾向于对这两种行为中的任何一种都持非常悲观的看法,并在尝试这样的动作时禁用自己。
发布于 2016-10-15 00:58:49
所以我自己也遇到了这个问题。我现在正在测试Android6,所以我希望这个问题能在A7或未来的某个版本中得到修复(关闭挂起的会话似乎是一个糟糕的想法,所以我认为这一定是个bug)。
不过,我确实想出了一个解决方案。我怀疑我们都没有像预期的那样使用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);
我知道这有点晚了,所以我希望你能找到解决你的问题的方法。
https://stackoverflow.com/questions/28215948
复制相似问题