1

我正在使用 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()or之后直接调用时有效AMediaDrm_getKeyRequest()

有没有人遇到过这个问题?有什么我可能做错了AMediaDrm_provideKeyResponse()吗?

4

2 回答 2

0

您是在模拟器下还是在附加调试器的情况下尝试这个?DRM 技术倾向于对其中任何一个采取非常模糊的看法,并在尝试此类操作时禁用自身。

于 2015-02-03T07:02:11.207 回答
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);

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

于 2016-10-14T16:58:48.813 回答