分享方式:


如何封裝 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 標頭:

PlayReady Header in MP4

以下是此檔案的 HEX 檢視:

PlayReady Object Hex Dump

下圖顯示具有 PlayReady Header 的 PlayReady 物件,以及另一個包含 PlayReady Embedded 授權的 PlayReady 物件,以及包含 PlayReady Embedded License Microsoft Store的分段 MP4 檔案:

PlayReady Header and ELS in 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>

另請參閱

支援的格式

PlayReady Test Server 內容