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()またはの直後に呼び出されたときに機能しAMediaDrm_getKeyRequest()ます。

以前にこの問題を経験した人はいますか? 私が間違っているかもしれない何かがありますAMediaDrm_provideKeyResponse()か?

4

2 に答える 2

0

だから私は自分でこれに出くわしました。私は現在 Android 6 でテストしているので、これが A7 または将来のリリースで修正されることを願っています (ハングするセッションを閉じるための API はひどい考えのように思えるので、バグであるに違いないと思います)。

しかし、私は解決策を思いつきました。drm セッションを閉じる前にセッションからキーを解放すると、すべてが完全に機能するため、意図したとおりに API を使用していなかったのではないかと思います。そのようです:

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 に答える
0

おそらく、エミュレーターまたはデバッガーを接続してこれを試していますか? DRM テクノロジは、これらのいずれかについて非常に曖昧な見方をする傾向があり、そのようなアクションが試みられると、自身を無効にします。

于 2015-02-03T07:02:11.207 に答える