如何封裝 PlayReady 的 MP4 型內容
內容加密
封裝程式需要加密內容。 合規性規則允許使用 CTR 模式或 CBC 模式中使用 AES-128 金鑰的任何加密格式。
建議使用 MP4 格式。 CMAF 是 PlayReady 用戶端、Windows 10和Xbox One慣用的 MP4 格式。
Microsoft 支援兩種通用加密配置,這些配置接受廣泛的產業:'cbcs' AES-CBC 和 'cenc' AES-CTR 保護設定。 請參閱ISO/IEC FDIS 23001-7:2016「資訊技術 – MPEG 系統技術 – 第 7 部分:ISO 基底媒體檔案格式檔案中的一般加密」
如需詳細資訊,請參閱 內容加密和傳遞
在內容中插入 PlayReady 標頭
封裝程式必須插入它已在內容中產生的 PlayReady 標頭。 它通常會插入內容檔案的標頭,或插入串流資產的資訊清單中。
此標頭包含 PlayReady 用戶端要求此特定內容片段授權所需資訊的預設值。 例如,PlayReady 用戶端必須知道資產中使用哪些金鑰識別碼 (KID) ,才能要求金鑰值。 它也必須知道將傳遞此授權的授權伺服器位址。 如果授權伺服器拒絕授權要求,則選擇性地需要知道要轉譯給使用者的網頁, (使用者可能會導向付款頁面) 。
以下是 PlayReady 標頭的範例
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.3.0.0">
<DATA>
<PROTECTINFO>
<KIDS>
<KID ALGID="AESCTR" VALUE="PV1LM/VEVk+kEOB8qqcWDg=="></KID>
</KIDS>
</PROTECTINFO>
<LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
<LUI_URL>http://www.contoso.com/pay/</LUI_URL>
</DATA>
</WRMHEADER>
當 PlayReady 用戶端需要播放受保護的內容時,如果內容尚未取得,則會要求內容的授權。 若要起始授權要求,應用程式開發人員可能已布建具有硬式編碼或動態值的應用程式,LA_URL,以及授權要求拒絕時的行為。 應用程式已覆寫 KID 或LA_URL預設值。 如果開發人員尚未這麼做,用戶端應該根據內容標頭本身中找到的預設值來執行授權要求。
針對 MP4 ISO 檔案,Microsoft 建議遵循 ISO 格式規格,並將 PlayReady 標頭插入 'pssh' 方塊中。
包含 PlayReady 物件的 MP4 檔案範例
下圖顯示具有 PlayReady 物件的分段 MP4 檔案,其中包含 PlayReady 標頭:
以下是此檔案的 HEX 檢視:
下圖顯示具有 PlayReady Header 的 PlayReady 物件,以及另一個包含 PlayReady Embedded 授權的 PlayReady 物件,以及包含 PlayReady Embedded License Microsoft Store的分段 MP4 檔案:
針對自適性串流資產,Microsoft 建議在資產資訊清單中插入 PlayReady 標頭。
包含 PlayReady 標頭的 MPEG-DASH 資訊清單範例
<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" xmlns:cenc="urn:mpeg:cenc:2013" xmlns:mspr="urn:microsoft:playready" mediaPresentationDuration="PT10M56.907S" minBufferTime="PT4S">
<Period>
<AdaptationSet id="1" group="1" profiles="ccff" bitstreamSwitching="true" segmentAlignment="true" contentType="video" mimeType="video/mp4" codecs="avc1.640028" maxWidth="1920" maxHeight="1080" startWithSAP="1">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="10000000-1000-1000-1000-100000000001"/>
<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value="2.0" cenc:default_KID="10000000-1000-1000-1000-100000000001">
<mspr:pro>PABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMwAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBlAHgAcABlAHIAaQBtAGUAbgB0AGEAbAAxAC4AYQB6AHUAcgBlAHcAZQBiAHMAaQB0AGUAcwAuAG4AZQB0AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPwBjAGYAZwA9ACgAYwBrADoAVwAzADEAYgBmAFYAdAA5AFcAMwAxAGIAZgBWAHQAOQBXADMAMQBiAGYAUQA9AD0ALABjAGsAdAA6AEEARQBTADEAMgA4AEIAaQB0AEMAQgBDACkAPAAvAEwAQQBfAFUAUgBMAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAFMAPgA8AEsASQBEACAAQQBMAEcASQBEAD0AIgBBAEUAUwBDAEIAQwAiACAAVgBBAEwAVQBFAD0AIgBBAEEAQQBBAEUAQQBBAFEAQQBCAEEAUQBBAEIAQQBBAEEAQQBBAEEAQQBRAD0APQAiAD4APAAvAEsASQBEAD4APAAvAEsASQBEAFMAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</mspr:pro>
</ContentProtection>
<SegmentTemplate timescale="10000000" media="video/bbb_sunflower_1080p_60fps_normal_VIDEO$Number$.mp4" initialization="video/bbb_sunflower_1080p_60fps_normal_VIDEO0.mp4">
<SegmentTimeline>
<S d="83166700" />
<S d="79166700" />
<S d="80333300" />
<S d="73000000" />
</SegmentTimeline>
</SegmentTemplate>
<Representation id="video" bandwidth="10646158" width="1920" height="1080"/>
</AdaptationSet>
</Period>
</MPD>