Microsoft PlayReady DRM
支持在 Web 瀏覽器中使用加密媒體擴(kuò)展和 Microsoft PlayReady DRM
?
- 簡介
- 實(shí)現(xiàn)方法
萬維網(wǎng)聯(lián)合會(huì) (W3C) HTML5 加密媒體擴(kuò)展 (EME) 為網(wǎng)站引入了一項(xiàng)功能,可在不使用插件的情況下播放受數(shù)字版權(quán)管理 (DRM) 保護(hù)的內(nèi)容。Windows?8.1 上的 Internet Explorer?11 支持結(jié)合使用 EME 和 Microsoft PlayReady DRM。 本指南介紹了其他瀏覽器如何在 Windows?8.1 上采用類似方式啟用 Microsoft PlayReady DRM 播放。
該信息適用于以下操作系統(tǒng):
- Windows?8.1
簡介
瀏覽器中的 DRM
有一段時(shí)間瀏覽器可以播放受 DRM 保護(hù)的內(nèi)容,最常見的方式是支持啟用 DRM 的 Adobe?Flash 或 Microsoft Silverlight 版本。 這些組件過去作為瀏覽器插件提供。 它們(及其基礎(chǔ)媒體平臺(tái))過去用于標(biāo)準(zhǔn)化媒體管道并為最終用戶免費(fèi)提供插件播放。
插件可以限制與 Web 內(nèi)容兼容的設(shè)備,這樣可支持 HTML 擴(kuò)展,這些擴(kuò)展允許瀏覽器直接支持豐富的功能,并減少對(duì)插件組件的需求。 上一個(gè)示例中添加了漸進(jìn)式播放 HTML5 中添加的媒體內(nèi)容。 這樣允許瀏覽器直接播放媒體文件,不需要使用任何媒體播放器插件。 現(xiàn)在,新的規(guī)范已定義 HTML 功能,這些功能允許自適應(yīng)流式播放受 DRM 保護(hù)的媒體。
隨著 Windows?8.1 的發(fā)布,IE11 支持高級(jí) HTML 流式傳送擴(kuò)展。 使用這些新擴(kuò)展,Internet Explorer 可以在受到大范圍的網(wǎng)絡(luò)和系統(tǒng)約束下播放多種來源的高級(jí)視頻內(nèi)容,無須使用瀏覽器插件。 Windows?8.1 設(shè)計(jì)使用 Microsoft PlayReady DRM,并適用于傳統(tǒng)桌面和新體驗(yàn)桌面瀏覽器版本。
兩個(gè) W3C Web 規(guī)范支持在 Windows?8.1 上的 IE11 中使用以下新功能:
- 媒體源擴(kuò)展:此規(guī)范定義支持自適應(yīng)流式傳送的 HTMLMediaElement 擴(kuò)展。 它允許 JavaScript 為音頻和視頻元素動(dòng)態(tài)構(gòu)造流,方法是將分段附加到媒體 sourceBuffer。 JavaScript 可以實(shí)現(xiàn)自適應(yīng)流式處理,方法是調(diào)整這些附加分段的質(zhì)量級(jí)別以響應(yīng)一系列的網(wǎng)絡(luò)或媒體渲染瓶頸。
- 加密媒體擴(kuò)展:此規(guī)范定義支持內(nèi)容保護(hù)系統(tǒng)的 HTMLMediaElement 擴(kuò)展。 它允許標(biāo)識(shí)瀏覽器支持的保護(hù)技術(shù),并且為密鑰交換定義支持播放受 DRM 保護(hù)媒體的方法。
如果在 Web 瀏覽器中組合使用自適應(yīng)流式處理和 DRM 播放功能,則允許使用高級(jí)媒體消耗體驗(yàn),該體驗(yàn)得到 Web 服務(wù)器發(fā)布的 JavaScript 的完全支持,并且可能由適用于所有設(shè)備種類的可互操作瀏覽器解決方案進(jìn)行托管。
IE11 支持 Microsoft PlayReady DRM 的媒體源擴(kuò)展和加密媒體擴(kuò)展。 本指南的作用是提供其他瀏覽器實(shí)現(xiàn) Windows?8.1 上運(yùn)行的瀏覽器中類似功能所需的信息。
Microsoft PlayReady DRM
Microsoft PlayReady 是一個(gè)數(shù)字版權(quán)管理 (DRM) 系統(tǒng),它提供了對(duì)多種設(shè)備和計(jì)算機(jī)的支持。 它采用以下幾種方式支持:
- Microsoft PlayReady 移植工具包:提供了可輕松部署的實(shí)現(xiàn)方法和源代碼,允許在任一設(shè)備(不論操作系統(tǒng)如何)上都支持 Microsoft PlayReady 客戶端。
- Microsoft PlayReady 許可證服務(wù)器:用于托管頒發(fā)受 DRM 保護(hù)內(nèi)容播放許可證所需的許可證服務(wù)。
還有一個(gè) Microsoft PlayReady PC 軟件開發(fā)工具包 (SDK),用于為具有 DRM 功能的傳統(tǒng) Windows 應(yīng)用程序提供 Windows 桌面運(yùn)行時(shí)。 此 SDK 仍然處于活動(dòng)狀態(tài),但不是 IE11 用于實(shí)現(xiàn) Microsoft PlayReady 支持的方法。
新的應(yīng)用模型首次在 Windows?8 中發(fā)布時(shí),還發(fā)布了 Microsoft PlayReady AppX 框架。 它支持從 Windows 應(yīng)用商店下載應(yīng)用,并且與其他預(yù)安裝的應(yīng)用一起暫存,以便成為 Windows?8 和之后強(qiáng)大系統(tǒng)上首次運(yùn)行體驗(yàn)的一部分。
Windows?8.1 中的 IE11 會(huì)利用暫存 Microsoft PlayReady 框架的優(yōu)勢(shì)。 它雖然不是 Windows 組件(它在單獨(dú)的進(jìn)程中開發(fā)和編譯),但是可用于所有啟用媒體的 Windows SKU,因此可供 Windows?8.1 上運(yùn)行的新體驗(yàn)瀏覽器使用。
加密媒體擴(kuò)展 CDM
加密媒體擴(kuò)展 (EME) 規(guī)范定義了內(nèi)容解密模型 (CDM),該模型將通用 EME API 轉(zhuǎn)換為特定 DRM 解決方案可能需要的特定數(shù)據(jù)交換。 該操作允許一般化 EME,從而將系統(tǒng)特定方面留給 CDM 處理。
Windows?8.1 應(yīng)用使用的 Microsoft PlayReady 框架包含 CDM 功能。 并且設(shè)備的 Microsoft PlayReady 移植工具包中還包含了 CDM 接口支持。 如果使用 Windows?8.1 系統(tǒng)框架和其他設(shè)備的啟用 CDM 的移植工具包,則允許 Microsoft PlayReady 支持大量系統(tǒng)和設(shè)備上運(yùn)行的瀏覽器。
此指南的目標(biāo)是僅詳細(xì)介紹此 CDM 支持的 Windows?8.1 方面。
實(shí)現(xiàn)方法
概述
過去,在 Microsoft PlayReady SDK 上為 Windows 構(gòu)建的應(yīng)用負(fù)責(zé)授權(quán)該技術(shù)、符合嚴(yán)格的媒體管道要求,以確保以解密的形式一次性保護(hù)媒體,并且這些應(yīng)用還具備與其 Microsoft PlayReady 許可證關(guān)聯(lián)的金融義務(wù)。 為 Windows?8 開發(fā)的 Microsoft PlayReady 框架(現(xiàn)在已針對(duì) Windows?8.1 使用 EME/CDM 支持?jǐn)U展)為選擇使用它的應(yīng)用提供了強(qiáng)勁優(yōu)勢(shì):
- 已授予技術(shù):如此這樣,就不需要使用單獨(dú)的許可證。 應(yīng)用將構(gòu)建在公開記錄的 API 上并提供啟用 Microsoft PlayReady 且無其他授權(quán)的系統(tǒng)。
- 已保護(hù)媒體管道的安全:Microsoft PlayReady 框架使用 Microsoft 媒體基礎(chǔ)實(shí)現(xiàn)的媒體服務(wù),并且此管道已構(gòu)建并認(rèn)證符合 DRM 要求。 應(yīng)用免費(fèi)使用此管道,不需要任何其他認(rèn)證(或根據(jù)設(shè)計(jì)變化重新認(rèn)證)。
IE11 中的 EME 實(shí)現(xiàn)方法使用特別為 EME 支持構(gòu)建的更新媒體基礎(chǔ) API。 這是為 Windows?8.1(和以后版本)上運(yùn)行的其他瀏覽器(桌面和新體驗(yàn))推薦的實(shí)現(xiàn)方法。
| 技術(shù) | 說明 |
| 使用 MF 實(shí)現(xiàn)瀏覽器 MSE/EME API | 新的媒體基礎(chǔ) API 直接映射到 W3C MSE 和 EME 標(biāo)準(zhǔn)中介紹的 API。 |
| 附加 IMFMediaSourceExtension 對(duì)象 | 將 MSE API 映射到其 MF 等效后,瀏覽器必須將 IMFMediaSourceExtension 對(duì)象附加到元素中。 |
| PlayReady AppX 框架 | AppX 框架通常會(huì)基于應(yīng)用清單中聲明的依存關(guān)系進(jìn)行注冊(cè)。 對(duì)于新體驗(yàn)桌面瀏覽器,在用戶第一次登錄時(shí)會(huì)自動(dòng)執(zhí)行此操作。 |
| 支持 In Private | Internet Explorer 分離 Microsoft PlayReady 許可證存儲(chǔ)用于 In Private 并在 In Private 會(huì)話結(jié)束時(shí)刪除該存儲(chǔ)。 這樣會(huì)刪除可能已在 In Private 會(huì)話過程中存儲(chǔ)的許可證。 |
| 支持選項(xiàng)卡掛起 | 選項(xiàng)卡掛起將新體驗(yàn)瀏覽器上的選項(xiàng)卡分成單獨(dú)的進(jìn)程,并允許 Microsoft?WindowsWindows 中的電源管理功能管理哪些選項(xiàng)卡在后臺(tái)保持活動(dòng)狀態(tài)和掛起哪些選項(xiàng)卡可改進(jìn)瀏覽器電源配置文件。 選項(xiàng)卡掛起具有特定的實(shí)現(xiàn)方法要求,瀏覽器必須符合這些要求才能保證媒體體驗(yàn)正常運(yùn)行。 |
?
媒體基礎(chǔ) API
若要支持 Microsoft PlayReady EME,瀏覽器必須將 MSE 和 EME API 實(shí)現(xiàn)到其媒體基礎(chǔ)等效。 媒體基礎(chǔ) API 已直接映射到 EME,如下圖所示:
使用 API 映射,可以直接在 MSE/EME 功能上構(gòu)建 Microsoft Win32 桌面應(yīng)用程序,并且還允許第三方瀏覽器實(shí)現(xiàn)這些功能。 下表列出了與 EME 接口對(duì)應(yīng)的特定媒體基礎(chǔ) MediaEngine API:
下表顯示了從 MSE(采用 JavaScript)映射到媒體基礎(chǔ) MediaEngine(采用 C++)的 API。
| JavaScript (MSE) | MFMediaEngine C++ |
|---|---|
| [構(gòu)造函數(shù)] | IMFMediaEngineClassFactoryEx::CreateMediaSourceExtension |
| MediaSource | IMFMediaSourceExtension |
| MediaSource.sourceBuffers | IMFMediaSourceExtension::GetSourceBuffers |
| MediaSource.activeSourceBuffers | IMFMediaSourceExtension::GetActiveSourceBuffers |
| MediaSource.readyState | IMFMediaSourceExtension::GetReadyState |
| MediaSource.duration | IMFMediaSourceExtension::GetDuration IMFMediaSourceExtension::SetDuration |
| MediaSource.addSourceBuffer | IMFMediaSourceExtension::AddSourceBuffer |
| MediaSource.removeSourceBuffer | IMFMediaSourceExtension::RemoveSourceBuffer |
| MediaSource.endOfStream | IMFMediaSourceExtension::SetEndOfStream |
| MediaSource.isTypeSupported | IMFMediaSourceExtension::IsTypeSupported |
| SourceBuffer | IMFSourceBuffer |
| SourceBuffer.updating | IMFSourceBuffer::GetUpdating |
| SourceBuffer.buffered | IMFSourceBuffer::GetBuffered |
| SourceBuffer.timestampOffset | IMFSourceBuffer::GetTimeStampOffset IMFSourceBuffer::SetTimeStampOffset |
| SourceBuffer.audioTracks | 媒體基礎(chǔ)中無等效 |
| SourceBuffer.appendWindowStart; | IMFSourceBuffer::GetAppendWindowStart IMFSourceBuffer::SetAppendWindowStart |
| SourceBuffer.appendWindowEnd | IMFSourceBuffer::GetAppendWindowEnd IMFSourceBuffer::SetAppendWindowEnd |
| SourceBuffer.appendBuffer(ArrayBuffer data) | IMFSourceBuffer::Append |
| SourceBuffer.appendBufferArrayBufferView data) | IMFSourceBuffer::Append |
| SourceBuffer.appendStream | IMFSourceBuffer::AppendByteStream |
| SourceBuffer.abort | IMFSourceBuffer::Abort |
| SourceBuffer.remove | IMFSourceBuffer::Remove |
| SourceBufferList | IMFSourceBufferList |
| SourceBufferList.length | IMFSourceBufferList::GetLength |
| getter SourceBuffer | IMFSourceBufferList::GetSourceBuffer |
| VideoPlaybackQuality | IMFMEdiaEngineEx::GetStatistics |
| VideoPlaybackQuality.creationTime | 無媒體基礎(chǔ)等效 |
| VideoPlaybackQuality.totalVideoFrames | MF_MEDIA_ENGINE_STATISTIC_FRAMES_RENDERED + MF_MEDIA_ENGINE_STATISTIC_FRAMES_DROPPED 這些標(biāo)記在 MF_MEDIA_ENGINE_STATISTIC 中定義 |
| VideoPlaybackQuality.droppedVideoFrames | MF_MEDIA_ENGINE_STATISTIC_FRAMES_DROPPED 此標(biāo)記在 MF_MEDIA_ENGINE_STATISTIC 中定義。 |
| VideoPlaybackQuality.totalFrameDelay | MF_MEDIA_ENGINE_STATISTIC_TOTAL_FRAME_DELAY 此標(biāo)記在 MF_MEDIA_ENGINE_STATISTIC 中定義。 |
| DOMString URL.createObjectURL(MediaSource mediaSource) | 媒體基礎(chǔ)中無等效 |
| HTMLVideoElement .getVideoPlaybackQuality | 請(qǐng)參閱以上的 VideoPlaybackQuality 說明 |
| AudioTrack.kind | 無媒體基礎(chǔ)等效 |
| AudioTrack.language | IMFMediaEngineEx::GetStreamAttribute 注意,將 MF_SD_LANGUAGE 作為 guidMFAttribute 參數(shù)的值傳遞。 |
| AudioTrack.sourceBuffer | IMFMediaSourceExtension::GetSourceBuffer |
| Events by target | ? |
| MediaSource.sourceopen | IMFMediaSourceExtensionNotify |
| MediaSource.sourceended | IMFMediaSourceExtensionNotify::OnSourceEnded |
| MediaSource.sourceclose | IMFMediaSourceExtensionNotify::OnSourceClose |
| SourceBuffer.updatestart | IMFSourceBufferNotify::OnUpdateStart |
| SourceBuffer.update | IMFSourceBufferNotify::OnUpdate |
| SourceBuffer.updateend | IMFSourceBufferNotif::OnUpdateEnd |
| SourceBuffer.error | IMFSourceBufferNotify::OnError |
| SourceBuffer.abort | IMFSourceBufferNotify::OnAbort |
| SourceBufferList.addsourcebuffer | IMFBufferListNotify::OnAddSourceBuffer |
| SourceBufferList.removesourcebuffer | IMFBufferListNotify::OnRemoveSourceBuffer |
?
下表顯示了從 EME(采用 JavaScript)映射到媒體基礎(chǔ) MediaEngine(采用 C++)的 API。
| JavaScript (MSE) | MFMediaEngine C++ |
|---|---|
| HTMLMediaElement.msKeys | IMFMediaEngineEME::get_Keys |
| HTMLMediaElement.msSetMediaKeys | IMFMediaEngineEME::SetMediaKeys |
| onmsneedkey | ? |
| [構(gòu)造函數(shù)] | IMFMediaEngineClassFactory2::CreateMediaKeys2 |
| MSMediaKeys | IMFMediaKeys |
| MSMediaKeys.keySystem | IMFMediaKeys::get_KeySystem |
| MSMediaKeys.createSession | IMFMediaKeys::CreateSession |
| MSMediaKeys.isTypeSupported | IMFMediaEngineClassFactoryEx::IsTypeSupported |
| ? | IMFMediaKeys::GetSuspendNotify |
| ? | IMFMediaKeys::Shutdown |
| MediaKeySession | IMFMediaKeySession |
| MediaKeySession.error | IMFMediaKeySession::GetError |
| MediaKeySession.keySystem | IMFMediaKeySession::get_KeySystem |
| MediaKeySession.sessionId | IMFMediaKeySession::get_SessionId |
| MediaKeySession.update | IMFMediaKeySession::Update |
| MediaKeySession.close | IMFMediaKeySession::Close |
| HTMLSourceElement.keySystem | IMFMediaEngineSrcElementsEx::GetKeySystem |
| 事件接口增項(xiàng) | ? |
| MediaKeyMessageEvent | 等效于 IMFMediaKeySessionNotify |
| MediaKeyMessageEvent.message | ? |
| MediaKeyMessageEvent.destinationURL | ? |
| MediaKeyNeededEvent | 等效于 IMFMediaEngineNeedKeyNotify |
| MediaKeyNeededEvent.initData | ? |
| 事件 | ? |
| keyadded | IMFMediaKeySessionNotify::KeyAdded |
| keyerror | IMFMediaKeySessionNotify::KeyError |
| keymessage | IMFMediaKeySessionNotify::KeyMessage |
| msneedkey | IMFMediaEngineNeedKeyNotify::NeedKey |
?
IMFMediaSourceExtension 對(duì)象
將 MSE API 映射到其媒體基礎(chǔ)等效后,瀏覽器必須將 IMFMediaSourceExtension 對(duì)象附加到元素中。 執(zhí)行此操作的一個(gè)方法如下:
-
根據(jù) W3C MSE 標(biāo)準(zhǔn)實(shí)現(xiàn) URL.createObjectURL (MediaSource mediaSource)。
-
將 MediaSource 對(duì)象 URL 設(shè)置為媒體元素的源后,通過 IMFMediaEngine::SetSource 方法將 URL 傳遞到媒體基礎(chǔ)。
-
創(chuàng)建媒體引擎的實(shí)例時(shí),通過在傳遞到 IMFMediaEngineClassFactory::CreateInstance 的 IMFAttributes 存儲(chǔ)上設(shè)置 MF_MEDIA_ENGINE_EXTENSION 屬性來傳遞實(shí)現(xiàn) IMFMediaEngineExtension 的對(duì)象。
-
實(shí)現(xiàn) IMFMediaEngineExtension 以致使用 type=MF_OBJECT_MEDIASOURCE 和 MediaSource URL 調(diào)用 BeginCreateObject 時(shí)會(huì)導(dǎo)致通過提供的回調(diào)異步返回關(guān)聯(lián)的 IMFMediaSourceExtension 實(shí)例。
PlayReady AppX 框架
四個(gè)框架會(huì)暫存在 Windows?8.1 中。 x86 和 amd64 變體成對(duì)出現(xiàn)。 另外,如果要與 Windows?8 Windows 應(yīng)用商店應(yīng)用兼容,則需要使用為其保持的特定版本(在系列名稱 Microsoft.Media.PlayReadyClient 下)以及使用所添加 EME 功能提供的新版本。
AppX PackageManager 跟蹤 AppX 框架上的應(yīng)用依存關(guān)系。 這些框架通常在應(yīng)用清單中聲明,但新體驗(yàn)瀏覽器會(huì)作為桌面應(yīng)用構(gòu)建且沒有清單選項(xiàng)。 它們必須明確引用框架以通知程序包管理器框架具有需要安裝該框架的桌面應(yīng)用。 這樣可確保程序包管理器會(huì)保持框架的活動(dòng)狀態(tài),即便需要使用該框架的所有 Windows?8 Windows 應(yīng)用程序應(yīng)用都已被刪除。
AppX 框架通常會(huì)限制為僅供 Windows 應(yīng)用商店應(yīng)用使用。 在 Windows?8.1 中,Microsoft PlayReady 應(yīng)用包可供桌面或新體驗(yàn)桌面瀏覽器使用。 如果瀏覽器使用媒體基礎(chǔ) API 實(shí)現(xiàn) EME,則會(huì)自動(dòng)出現(xiàn)此情形。
InPrivate 瀏覽
IE11 刪除了在 In Private 瀏覽會(huì)話過程中獲取的 Microsoft PlayReady 許可證。 建議實(shí)現(xiàn) EME 的其他瀏覽器執(zhí)行此嘗試。
使用新的 Microsoft PlayReady 框架,應(yīng)用可以為任何會(huì)話指定許可證存儲(chǔ)位置(也稱為確立數(shù)據(jù)存儲(chǔ)或 HDS)。 此默認(rèn) HDS 還特定于使用框架的應(yīng)用,以便其中存儲(chǔ)的許可證可由應(yīng)用隔離。 默認(rèn) HDS 還包含 Indiv 數(shù)據(jù)和可以獲取的所有永久性許可證。 鑒于此原因,Microsoft 建議不要?jiǎng)h除該 HDS。
IE11 將默認(rèn) HDS 用于常規(guī) EME 會(huì)話,并且使用 Microsoft PlayReady HDS 路徑功能為 In Private 瀏覽指定單獨(dú)的 HDS。 這樣允許刪除 In Private HDS,并且不會(huì)對(duì) Indiv 數(shù)據(jù)或永久性許可證造成任何影響。
瀏覽器可以使用 cdmStorePath 的可選 IMFMediaEngineClassFactory2::CreateMediaKeys2 參數(shù)執(zhí)行相同的操作來指定 Microsoft PlayReady CDM 的目錄路徑。
HRESULT CreateMediaKeys2( [annotation("_In_")] BSTR keySystem, [annotation("_In_")] BSTR defaultCdmStorePath, [annotation("_In_opt_")] BSTR inprivateCdmStorePath, [annotation("_COM_Outptr_")] IMFMediaKeys **ppKeys ); 當(dāng) In Private 會(huì)話結(jié)束時(shí),Windows Internet Explorer 會(huì)刪除整個(gè) cdmStorePath 目錄。這表示 In Private 過程中存儲(chǔ)的所有永久性許可證都會(huì)被刪除。
選項(xiàng)卡掛起
IE11 實(shí)現(xiàn)選項(xiàng)卡掛起以在用戶使用瀏覽器時(shí)幫助最小化電源消耗。
使用選項(xiàng)卡掛起,可針對(duì)后臺(tái)操作單獨(dú)管理瀏覽器選項(xiàng)卡。 使用選項(xiàng)卡掛起,Windows 可在瀏覽器打開多個(gè)選項(xiàng)卡時(shí)管理 CPU 需求。
某些主要系統(tǒng)要求先通知,然后掛起,包括 Microsoft PlayReady。 掛起選項(xiàng)卡之前,瀏覽器應(yīng)為選項(xiàng)卡中運(yùn)行的每個(gè)唯一主要系統(tǒng)執(zhí)行以下步驟:
-
為框架進(jìn)程中的主要系統(tǒng)創(chuàng)建新的媒體密鑰實(shí)例。
-
調(diào)用 IMFMediaKeys::GetSuspendNotify 可檢索主要系統(tǒng)的掛起處理程序。 主要系統(tǒng)可以在不許要使用掛起處理程序時(shí)返回 HRESULT E_NOTIMPL。
-
在掛起選項(xiàng)卡之前,請(qǐng)調(diào)用 IMFCdmSuspendNotify::Begin。 如果掛起處理程序返回除 S_OK 之外的任何內(nèi)容,則中止選項(xiàng)卡掛起,然后在幾分鐘后重試。
-
掛起選項(xiàng)卡之后,請(qǐng)調(diào)用 IMFCdmSuspendNotify::End。
-
發(fā)布由框架進(jìn)程創(chuàng)建的掛起處理程序和媒體密鑰。
轉(zhuǎn)載于:https://www.cnblogs.com/roland1982/p/3489367.html
總結(jié)
以上是生活随笔為你收集整理的Microsoft PlayReady DRM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个qq情侣四个字网名
- 下一篇: 关于成功的因素-----谨记