天天看點

MediaDRM 中文翻譯

最近需要做在Android中做DRM相關内容,簡單研究了一下MediaDRM文檔,翻譯如下;個人水準有限,有錯誤的地方歡迎指正:

MediaDRM extends  Object

類概述:

MediaDRM結合MediaCrypto可以用來擷取keys來解密加密的媒體流。MediaDRM的API設計來支援ISO/ICE 23001-7:Common Encryption标準的,但是也可以用來解決其他的加密方案。

加密的内容是通過加密的伺服器來提供的儲存在内容庫裡,加密的内容從内容伺服器以流的形式下載下傳到用戶端的伺服器中。觀看内容的許可證從許可證伺服器擷取。

MediaDRM 中文翻譯

 keys是通過key請求向伺服器來擷取的。key的響應分發到用戶端的app中,app把key的響應提供到MediaDRM的API。

還可能需要一個額外的供應伺服器将裝置唯一憑證分發給該裝置。

執行與相關多個裝置可能同時播放的需求可以通過密鑰更新,或者使用安全的停止方法。

下面的時序圖展示了在播放加密内容時類之間的互動:

MediaDRM 中文翻譯

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:

MediaDRM官網詳細介紹

DRM

繼續閱讀