2

是否可以使用 MediaCodec API 解密和解码数据?我想解密和解码由 Widevine 或其他 DRM 机制加密的数据。我想尝试的基本事情是我用 Surface 配置了 MediaCodec,它是从 SurfaceTexure 创建的。 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)
4

1 回答 1

4

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

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

因为内存只有视频解码器和显示器可以访问,GPU不能访问,这意味着数据不能用作GLES外部纹理。该帧无法与 GLES 合成,因此如果 HWC 无法分配覆盖,则不会出现视频。(有关 HWC 和组合的更多信息,请参阅图形拱门文档。)

于 2016-05-17T19:19:58.993 回答