最近需要做在Android中做DRM相关内容,简单研究了一下MediaDRM文档,翻译如下;个人水平有限,有错误的地方欢迎指正:
MediaDRM extends Object
类概述:
MediaDRM结合MediaCrypto可以用来获取keys来解密加密的媒体流。MediaDRM的API设计来支持ISO/ICE 23001-7:Common Encryption标准的,但是也可以用来解决其他的加密方案。
加密的内容是通过加密的服务器来提供的保存在内容库里,加密的内容从内容服务器以流的形式下载到客户端的服务器中。观看内容的许可证从许可证服务器获取。
keys是通过key请求向服务器来获取的。key的响应分发到客户端的app中,app把key的响应提供到MediaDRM的API。
还可能需要一个额外的供应服务器将设备唯一凭证分发给该设备。
执行与相关多个设备可能同时播放的需求可以通过密钥更新,或者使用安全的停止方法。
下面的时序图展示了在播放加密内容时类之间的交互:
app首先创建MediaExtractor类和MediaCodec类。它接收DRM方案标识:UUID,一般是内容里的metadata信息,然后用这个UUID创建一个MediaDRM的实例,这个实例能够支持内容所需求的DRM方案。加密方案被分配16字节的UUID。isCryptoSchemeSupported(UUID) 方法
可以用来检查DRM方案该设备支不支持。
app调用openSession()
来生成一个
sessionID,作为后续交互中的唯一的session标识。app然后用MediaDRM对象来获取一个key的请求信息,并把它发给许可证书服务器,然后得到服务器的响应之后,把结果发给MediaDRM。
一旦app有了sessionID,他就能通过SessionID和UUID来创建一个MediaCrypto类。MediaCrypto类会在MediaCodec的configure(MediaFormat, Surface, MediaCrypto, int)
方法中来注册,从而使codec能够解密内容。
当APP创建了MediaCodec,MediaExtractor,MediaCrypto类,它就会从extractor中提取samples,并以队列的形式送到decoder中。对于加密内容来说,从extractor中返回来的samples依然是加密的,它们只有在分发给decoder的时候才解密。
当一个MediaDRM中的方法被插件或者硬件安全环境调用时发生了不可恢复的错误时,MediaDRM会抛出MediaDrm.MediaDrmStateException。MediaDrm.MediaDrmStateException
继承自IllegalStateException,
提供了开发人员可以具体定位的具体字符串信息。
在MediaServer进程crash或者restart的时候,如果MediaDRM还是active状态,那么就会抛出MediaDrmResetException
异常
。为了恢复异常,app必须是放掉旧的MediaDRM,创建一个新的对象。
因为MediaDrm.MediaDrmStateException和MediaDrmResetException异常都是继承自IllegalStateException,因此如果要单独处理的话,应该要在比IllegalStateException要早的catch语句中。
回调:
app应该在视频播放的过程中注册信息事件以被通知key的信息更新。这种事件的注册通过如下方法:setOnEventListener(MediaDrm.OnEventListener)。
为了接收与
该listener相关的回调,app应该在其单独运行的的loop方法中创建MediaDRM对象。(默认情况下,主UI线程有一个loop程序在运行)
摘要:
详细的类的摘要,常量,方法,具体可参考如下的API: