如何为 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 客户端需要知道资产中使用哪些密钥 ID (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 客户端需要播放受保护的内容时,如果内容尚未获得许可证,它将请求该内容的许可证。 若要启动许可证请求,应用开发人员可能已为 KID 数组预配硬编码或动态值的应用,LA_URL,以及许可证请求拒绝时的行为。 应用已覆盖 KID 或LA_URL默认值。 如果开发人员尚未这样做,则客户端应根据内容标头本身中找到的默认值执行许可证请求。

对于 MP4 ISO 文件,Microsoft 建议遵循 ISO 格式规范,并在“pssh”框中插入 PlayReady 标头。

包含 PlayReady 对象的 MP4 文件的示例

下图显示了包含 PlayReady 标头的 PlayReady 对象的分段 MP4 文件:

PlayReady Header in MP4

下面是此文件的 HEX 视图:

PlayReady Object Hex Dump

下图显示了包含 PlayReady Header 的 PlayReady 对象的分段 MP4 文件,以及另一个包含 PlayReady Embedded 许可证的 PlayReady 对象Microsoft Store:

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 测试服务器内容