Microsoft PlayReady DRM
支持在 Web 瀏覽器中使用加密媒體擴展和 Microsoft PlayReady DRM
?
- 簡介
- 實現方法
萬維網聯合會 (W3C) HTML5 加密媒體擴展 (EME) 為網站引入了一項功能,可在不使用插件的情況下播放受數字版權管理 (DRM) 保護的內容。Windows?8.1 上的 Internet Explorer?11 支持結合使用 EME 和 Microsoft PlayReady DRM。 本指南介紹了其他瀏覽器如何在 Windows?8.1 上采用類似方式啟用 Microsoft PlayReady DRM 播放。
該信息適用于以下操作系統:
- Windows?8.1
簡介
瀏覽器中的 DRM
有一段時間瀏覽器可以播放受 DRM 保護的內容,最常見的方式是支持啟用 DRM 的 Adobe?Flash 或 Microsoft Silverlight 版本。 這些組件過去作為瀏覽器插件提供。 它們(及其基礎媒體平臺)過去用于標準化媒體管道并為最終用戶免費提供插件播放。
插件可以限制與 Web 內容兼容的設備,這樣可支持 HTML 擴展,這些擴展允許瀏覽器直接支持豐富的功能,并減少對插件組件的需求。 上一個示例中添加了漸進式播放 HTML5 中添加的媒體內容。 這樣允許瀏覽器直接播放媒體文件,不需要使用任何媒體播放器插件。 現在,新的規范已定義 HTML 功能,這些功能允許自適應流式播放受 DRM 保護的媒體。
隨著 Windows?8.1 的發布,IE11 支持高級 HTML 流式傳送擴展。 使用這些新擴展,Internet Explorer 可以在受到大范圍的網絡和系統約束下播放多種來源的高級視頻內容,無須使用瀏覽器插件。 Windows?8.1 設計使用 Microsoft PlayReady DRM,并適用于傳統桌面和新體驗桌面瀏覽器版本。
兩個 W3C Web 規范支持在 Windows?8.1 上的 IE11 中使用以下新功能:
- 媒體源擴展:此規范定義支持自適應流式傳送的 HTMLMediaElement 擴展。 它允許 JavaScript 為音頻和視頻元素動態構造流,方法是將分段附加到媒體 sourceBuffer。 JavaScript 可以實現自適應流式處理,方法是調整這些附加分段的質量級別以響應一系列的網絡或媒體渲染瓶頸。
- 加密媒體擴展:此規范定義支持內容保護系統的 HTMLMediaElement 擴展。 它允許標識瀏覽器支持的保護技術,并且為密鑰交換定義支持播放受 DRM 保護媒體的方法。
如果在 Web 瀏覽器中組合使用自適應流式處理和 DRM 播放功能,則允許使用高級媒體消耗體驗,該體驗得到 Web 服務器發布的 JavaScript 的完全支持,并且可能由適用于所有設備種類的可互操作瀏覽器解決方案進行托管。
IE11 支持 Microsoft PlayReady DRM 的媒體源擴展和加密媒體擴展。 本指南的作用是提供其他瀏覽器實現 Windows?8.1 上運行的瀏覽器中類似功能所需的信息。
Microsoft PlayReady DRM
Microsoft PlayReady 是一個數字版權管理 (DRM) 系統,它提供了對多種設備和計算機的支持。 它采用以下幾種方式支持:
- Microsoft PlayReady 移植工具包:提供了可輕松部署的實現方法和源代碼,允許在任一設備(不論操作系統如何)上都支持 Microsoft PlayReady 客戶端。
- Microsoft PlayReady 許可證服務器:用于托管頒發受 DRM 保護內容播放許可證所需的許可證服務。
還有一個 Microsoft PlayReady PC 軟件開發工具包 (SDK),用于為具有 DRM 功能的傳統 Windows 應用程序提供 Windows 桌面運行時。 此 SDK 仍然處于活動狀態,但不是 IE11 用于實現 Microsoft PlayReady 支持的方法。
新的應用模型首次在 Windows?8 中發布時,還發布了 Microsoft PlayReady AppX 框架。 它支持從 Windows 應用商店下載應用,并且與其他預安裝的應用一起暫存,以便成為 Windows?8 和之后強大系統上首次運行體驗的一部分。
Windows?8.1 中的 IE11 會利用暫存 Microsoft PlayReady 框架的優勢。 它雖然不是 Windows 組件(它在單獨的進程中開發和編譯),但是可用于所有啟用媒體的 Windows SKU,因此可供 Windows?8.1 上運行的新體驗瀏覽器使用。
加密媒體擴展 CDM
加密媒體擴展 (EME) 規范定義了內容解密模型 (CDM),該模型將通用 EME API 轉換為特定 DRM 解決方案可能需要的特定數據交換。 該操作允許一般化 EME,從而將系統特定方面留給 CDM 處理。
Windows?8.1 應用使用的 Microsoft PlayReady 框架包含 CDM 功能。 并且設備的 Microsoft PlayReady 移植工具包中還包含了 CDM 接口支持。 如果使用 Windows?8.1 系統框架和其他設備的啟用 CDM 的移植工具包,則允許 Microsoft PlayReady 支持大量系統和設備上運行的瀏覽器。
此指南的目標是僅詳細介紹此 CDM 支持的 Windows?8.1 方面。
實現方法
概述
過去,在 Microsoft PlayReady SDK 上為 Windows 構建的應用負責授權該技術、符合嚴格的媒體管道要求,以確保以解密的形式一次性保護媒體,并且這些應用還具備與其 Microsoft PlayReady 許可證關聯的金融義務。 為 Windows?8 開發的 Microsoft PlayReady 框架(現在已針對 Windows?8.1 使用 EME/CDM 支持擴展)為選擇使用它的應用提供了強勁優勢:
- 已授予技術:如此這樣,就不需要使用單獨的許可證。 應用將構建在公開記錄的 API 上并提供啟用 Microsoft PlayReady 且無其他授權的系統。
- 已保護媒體管道的安全:Microsoft PlayReady 框架使用 Microsoft 媒體基礎實現的媒體服務,并且此管道已構建并認證符合 DRM 要求。 應用免費使用此管道,不需要任何其他認證(或根據設計變化重新認證)。
IE11 中的 EME 實現方法使用特別為 EME 支持構建的更新媒體基礎 API。 這是為 Windows?8.1(和以后版本)上運行的其他瀏覽器(桌面和新體驗)推薦的實現方法。
| 技術 | 說明 |
| 使用 MF 實現瀏覽器 MSE/EME API | 新的媒體基礎 API 直接映射到 W3C MSE 和 EME 標準中介紹的 API。 |
| 附加 IMFMediaSourceExtension 對象 | 將 MSE API 映射到其 MF 等效后,瀏覽器必須將 IMFMediaSourceExtension 對象附加到元素中。 |
| PlayReady AppX 框架 | AppX 框架通常會基于應用清單中聲明的依存關系進行注冊。 對于新體驗桌面瀏覽器,在用戶第一次登錄時會自動執行此操作。 |
| 支持 In Private | Internet Explorer 分離 Microsoft PlayReady 許可證存儲用于 In Private 并在 In Private 會話結束時刪除該存儲。 這樣會刪除可能已在 In Private 會話過程中存儲的許可證。 |
| 支持選項卡掛起 | 選項卡掛起將新體驗瀏覽器上的選項卡分成單獨的進程,并允許 Microsoft?WindowsWindows 中的電源管理功能管理哪些選項卡在后臺保持活動狀態和掛起哪些選項卡可改進瀏覽器電源配置文件。 選項卡掛起具有特定的實現方法要求,瀏覽器必須符合這些要求才能保證媒體體驗正常運行。 |
?
媒體基礎 API
若要支持 Microsoft PlayReady EME,瀏覽器必須將 MSE 和 EME API 實現到其媒體基礎等效。 媒體基礎 API 已直接映射到 EME,如下圖所示:
使用 API 映射,可以直接在 MSE/EME 功能上構建 Microsoft Win32 桌面應用程序,并且還允許第三方瀏覽器實現這些功能。 下表列出了與 EME 接口對應的特定媒體基礎 MediaEngine API:
下表顯示了從 MSE(采用 JavaScript)映射到媒體基礎 MediaEngine(采用 C++)的 API。
| JavaScript (MSE) | MFMediaEngine C++ |
|---|---|
| [構造函數] | 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 | 媒體基礎中無等效 |
| 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 | 無媒體基礎等效 |
| VideoPlaybackQuality.totalVideoFrames | MF_MEDIA_ENGINE_STATISTIC_FRAMES_RENDERED + MF_MEDIA_ENGINE_STATISTIC_FRAMES_DROPPED 這些標記在 MF_MEDIA_ENGINE_STATISTIC 中定義 |
| VideoPlaybackQuality.droppedVideoFrames | MF_MEDIA_ENGINE_STATISTIC_FRAMES_DROPPED 此標記在 MF_MEDIA_ENGINE_STATISTIC 中定義。 |
| VideoPlaybackQuality.totalFrameDelay | MF_MEDIA_ENGINE_STATISTIC_TOTAL_FRAME_DELAY 此標記在 MF_MEDIA_ENGINE_STATISTIC 中定義。 |
| DOMString URL.createObjectURL(MediaSource mediaSource) | 媒體基礎中無等效 |
| HTMLVideoElement .getVideoPlaybackQuality | 請參閱以上的 VideoPlaybackQuality 說明 |
| AudioTrack.kind | 無媒體基礎等效 |
| AudioTrack.language | IMFMediaEngineEx::GetStreamAttribute 注意,將 MF_SD_LANGUAGE 作為 guidMFAttribute 參數的值傳遞。 |
| 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)映射到媒體基礎 MediaEngine(采用 C++)的 API。
| JavaScript (MSE) | MFMediaEngine C++ |
|---|---|
| HTMLMediaElement.msKeys | IMFMediaEngineEME::get_Keys |
| HTMLMediaElement.msSetMediaKeys | IMFMediaEngineEME::SetMediaKeys |
| onmsneedkey | ? |
| [構造函數] | 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 |
| 事件接口增項 | ? |
| MediaKeyMessageEvent | 等效于 IMFMediaKeySessionNotify |
| MediaKeyMessageEvent.message | ? |
| MediaKeyMessageEvent.destinationURL | ? |
| MediaKeyNeededEvent | 等效于 IMFMediaEngineNeedKeyNotify |
| MediaKeyNeededEvent.initData | ? |
| 事件 | ? |
| keyadded | IMFMediaKeySessionNotify::KeyAdded |
| keyerror | IMFMediaKeySessionNotify::KeyError |
| keymessage | IMFMediaKeySessionNotify::KeyMessage |
| msneedkey | IMFMediaEngineNeedKeyNotify::NeedKey |
?
IMFMediaSourceExtension 對象
將 MSE API 映射到其媒體基礎等效后,瀏覽器必須將 IMFMediaSourceExtension 對象附加到元素中。 執行此操作的一個方法如下:
-
根據 W3C MSE 標準實現 URL.createObjectURL (MediaSource mediaSource)。
-
將 MediaSource 對象 URL 設置為媒體元素的源后,通過 IMFMediaEngine::SetSource 方法將 URL 傳遞到媒體基礎。
-
創建媒體引擎的實例時,通過在傳遞到 IMFMediaEngineClassFactory::CreateInstance 的 IMFAttributes 存儲上設置 MF_MEDIA_ENGINE_EXTENSION 屬性來傳遞實現 IMFMediaEngineExtension 的對象。
-
實現 IMFMediaEngineExtension 以致使用 type=MF_OBJECT_MEDIASOURCE 和 MediaSource URL 調用 BeginCreateObject 時會導致通過提供的回調異步返回關聯的 IMFMediaSourceExtension 實例。
PlayReady AppX 框架
四個框架會暫存在 Windows?8.1 中。 x86 和 amd64 變體成對出現。 另外,如果要與 Windows?8 Windows 應用商店應用兼容,則需要使用為其保持的特定版本(在系列名稱 Microsoft.Media.PlayReadyClient 下)以及使用所添加 EME 功能提供的新版本。
AppX PackageManager 跟蹤 AppX 框架上的應用依存關系。 這些框架通常在應用清單中聲明,但新體驗瀏覽器會作為桌面應用構建且沒有清單選項。 它們必須明確引用框架以通知程序包管理器框架具有需要安裝該框架的桌面應用。 這樣可確保程序包管理器會保持框架的活動狀態,即便需要使用該框架的所有 Windows?8 Windows 應用程序應用都已被刪除。
AppX 框架通常會限制為僅供 Windows 應用商店應用使用。 在 Windows?8.1 中,Microsoft PlayReady 應用包可供桌面或新體驗桌面瀏覽器使用。 如果瀏覽器使用媒體基礎 API 實現 EME,則會自動出現此情形。
InPrivate 瀏覽
IE11 刪除了在 In Private 瀏覽會話過程中獲取的 Microsoft PlayReady 許可證。 建議實現 EME 的其他瀏覽器執行此嘗試。
使用新的 Microsoft PlayReady 框架,應用可以為任何會話指定許可證存儲位置(也稱為確立數據存儲或 HDS)。 此默認 HDS 還特定于使用框架的應用,以便其中存儲的許可證可由應用隔離。 默認 HDS 還包含 Indiv 數據和可以獲取的所有永久性許可證。 鑒于此原因,Microsoft 建議不要刪除該 HDS。
IE11 將默認 HDS 用于常規 EME 會話,并且使用 Microsoft PlayReady HDS 路徑功能為 In Private 瀏覽指定單獨的 HDS。 這樣允許刪除 In Private HDS,并且不會對 Indiv 數據或永久性許可證造成任何影響。
瀏覽器可以使用 cdmStorePath 的可選 IMFMediaEngineClassFactory2::CreateMediaKeys2 參數執行相同的操作來指定 Microsoft PlayReady CDM 的目錄路徑。
HRESULT CreateMediaKeys2( [annotation("_In_")] BSTR keySystem, [annotation("_In_")] BSTR defaultCdmStorePath, [annotation("_In_opt_")] BSTR inprivateCdmStorePath, [annotation("_COM_Outptr_")] IMFMediaKeys **ppKeys ); 當 In Private 會話結束時,Windows Internet Explorer 會刪除整個 cdmStorePath 目錄。這表示 In Private 過程中存儲的所有永久性許可證都會被刪除。
選項卡掛起
IE11 實現選項卡掛起以在用戶使用瀏覽器時幫助最小化電源消耗。
使用選項卡掛起,可針對后臺操作單獨管理瀏覽器選項卡。 使用選項卡掛起,Windows 可在瀏覽器打開多個選項卡時管理 CPU 需求。
某些主要系統要求先通知,然后掛起,包括 Microsoft PlayReady。 掛起選項卡之前,瀏覽器應為選項卡中運行的每個唯一主要系統執行以下步驟:
-
為框架進程中的主要系統創建新的媒體密鑰實例。
-
調用 IMFMediaKeys::GetSuspendNotify 可檢索主要系統的掛起處理程序。 主要系統可以在不許要使用掛起處理程序時返回 HRESULT E_NOTIMPL。
-
在掛起選項卡之前,請調用 IMFCdmSuspendNotify::Begin。 如果掛起處理程序返回除 S_OK 之外的任何內容,則中止選項卡掛起,然后在幾分鐘后重試。
-
掛起選項卡之后,請調用 IMFCdmSuspendNotify::End。
-
發布由框架進程創建的掛起處理程序和媒體密鑰。
轉載于:https://www.cnblogs.com/roland1982/p/3489367.html
總結
以上是生活随笔為你收集整理的Microsoft PlayReady DRM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个qq情侣四个字网名
- 下一篇: 10平方电缆大概多少钱一米