是否可以使用MediaCodec API解密和解码数据?
我想解密和解码由broadvine或其他DRM机制加密的数据。
我想要尝试的基本事情是
我使用SurfaceTexure创建的Surface配置MediaCodec。
MediaCodec->configure(..????., with mediacrypto instance, ...)
我不确定在这种情况下是否可以通过SurfaceTexture?
或者我应该做的任何安全配置?
MediaCodec->start()
MediaCodec->queuesecureinputbuffer(...,with cryptoinfo,...)
MediaCodec->dequeoutputbuffer() to get the decoded data back....
我能找到的样本是直接将解密数据渲染到SurfaceView上。
但我只想获得解码缓冲区或由MediaCodec渲染的SurfaceTexture。
如果我没有设置任何安全配置,例如MediaFormat->SetFeatureEnabled("secure-playback", 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)
答案 0 :(得分:3)
这在某种程度上取决于设备的硬件,但一般而言,受DRM保护的视频只能发送到SurfaceView。此外,SurfaceView的Surface必须位于硬件覆盖层上。
受DRM保护的视频由视频解码器硬件解密,并且解码的帧被写入软件无法访问的存储器。甚至Linux内核也无法读取它。这些帧通过句柄传递给硬件编写器,硬件编写器告诉显示硬件在覆盖平面上显示它们。
由于存储器只能由视频解码器和显示器访问,因此GPU无法访问它,这意味着数据不能用作GLES外部纹理。帧无法与GLES合成,因此如果HWC无法分配叠加层,则视频将不会出现。 (有关HWC和组合的更多信息,请参阅graphics arch doc。)