Android 解密&;使用MediaCodec将加密数据解码到SurfaceTexture

Android 解密&;使用MediaCodec将加密数据解码到SurfaceTexture,android,android-mediacodec,drm,widevine,Android,Android Mediacodec,Drm,Widevine,是否可以使用MediaCodec API对数据进行解密和解码? 我想解密和解码由widevine或其他DRM机制加密的数据。 我想尝试的基本方法是 我用SurfaceTexure创建的Surface配置了MediaCodec。 MediaCodec->configure(..??,使用mediacrypto实例,…)我不确定在这种情况下是否可以传递SurfaceTexture? 或者我应该做的任何安全配置 MediaCodec->start() MediaCodec->queuese

是否可以使用MediaCodec API对数据进行解密和解码? 我想解密和解码由widevine或其他DRM机制加密的数据。 我想尝试的基本方法是 我用SurfaceTexure创建的Surface配置了MediaCodec。
MediaCodec->configure(..??,使用mediacrypto实例,…)
我不确定在这种情况下是否可以传递SurfaceTexture? 或者我应该做的任何安全配置

MediaCodec->start()
MediaCodec->queuesecureinputbuffer(...,with cryptoinfo,...)
MediaCodec->dequeoutputbuffer() to get the decoded data back....
我可以找到的示例是直接将解密数据呈现到SurfaceView上

但我只想得到解码后的缓冲区或由MediaCodec呈现的SurfaceTexture

如果我没有设置任何安全配置,例如
MediaFormat->SetFeatureEnabled(“安全播放”,true)
;使用OMX.qcom.video.decoder.avc创建解码器。 我会犯这样的错误

E/OMX-VDEC-1080P(23290): 
E/OMX-VDEC-1080P(23290): ERROR: Sending OMX_EventError to Client
E/        (23290): not in avi mode
E/ACodec  ( 1930): [OMX.qcom.video.decoder.avc] ERROR(0x80001009)
E/ACodec  ( 1930): signalError(omxError 0x80001009, internalError -2147483648)
E/MediaCodec( 1930): Codec reported err 0x80001009, actionCode 0, while in state 6
W/System.err( 1930): java.lang.IllegalStateException
W/System.err( 1930):  at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)
W/System.err( 1930):  at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:1033)
设置安全配置并使用MediaCodec::CreateByCodecName(附加“.secure”)后 我会得到这种错误

E/ACodec: native window could not be authenticated
E/ACodec: Failed to allocate buffers after transitioning to IDLE state (error 0xffffffff)
E/ACodec: signalError(omxError 0x80001001, internalError -1)

这在某种程度上取决于设备的硬件,但一般来说,受DRM保护的视频只能发送到SurfaceView。此外,SurfaceView的曲面必须位于硬件覆盖上

受DRM保护的视频由视频解码器硬件解密,解码后的帧写入软件无法访问的内存。甚至连Linux内核都无法读取它。帧通过句柄传递给Hardware Composer,它告诉显示硬件在覆盖平面上显示它们


由于内存只能由视频解码器和显示器访问,因此GPU无法访问内存,这意味着数据不能用作外部纹理。该帧无法与GLE合成,因此如果HWC无法分配覆盖,视频将不会显示。(有关HWC和合成的更多信息,请参阅。)

是否可以从SurfaceView转换到SurfaceTexture?或者是否可以使用MediaCodec->Configure(没有表面?)即使成功配置MediaCodec,“受信任路径”机制也会阻止您访问像素数据。例如,尝试在播放存储区播放受DRM保护的电影时旋转设备。通常情况下,框架会捕获屏幕并使用它来设置旋转动画,但视频播放器会变黑。。。甚至SurfaceFlinger都无法读取像素。该应用程序可以设置SurfaceView的位置、大小和方向,但仅此而已。我尝试将SurfaceView用于我们的代码。我播放了clearkey测试样本,并且在出列OutputBuffer时也得到了错误。queuesecureinputbuffer返回成功,我不知道为什么deuqueoutputbuffer会出现这样的错误。错误是E/OMX-VDEC-1080P(187):错误:将OMX_事件错误发送到客户端E/(187):不在avi模式下E/ACodec(21747):[OMX.qcom.video.decoder.avc]错误(0x80001009)E/ACodec(21747):信号错误(omxError 0x80001009,internalError-2147483648)E/MediaCodec(21747):编解码器报告错误0x80001009,操作代码0,而状态6 W/System.err(21747):java.lang.IllegalStateException W/System.err(21747):在android.media.MediaCodec.native\u dequeueOutputBuffer(native方法)W/System.err(21747):在android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:1033)