Упаковка содержимого на основе MP4 для PlayReady

Шифрование содержимого

Упаковщику необходимо зашифровать содержимое. Любой формат шифрования, использующий ключи AES-128, используемые в режиме CTR или режиме CBC, разрешен правилами соответствия требованиям.

Рекомендуется использовать форматы на основе MP4. CMAF — это предпочтительный формат на основе MP4 для клиентов PlayReady, Windows 10 и Xbox One.

Корпорация Майкрософт поддерживает две распространенные схемы шифрования, которые имеют широкое признание отрасли — схемы защиты AES-CBC и cenc AES-CTR. См. статью ISO/IEC ПИИИ 23001-7:2016 "Информационные технологии — технологии MPEG systems — часть 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 необходимо воспроизвести защищенное содержимое, он запросит лицензию на содержимое, если он еще не получил. Чтобы инициировать запрос лицензии, разработчик приложения может подготовить приложение с жестко заданными или динамическими значениями для массива KID, LA_URL и поведения в случае отказа в запросе лицензии. Приложение переопределяет значения KID или LA_URL по умолчанию. Если разработчик этого не сделал, клиент должен выполнить запрос лицензии на основе значений по умолчанию, найденных в самом заголовке содержимого.

Для ISO-файлов MP4 корпорация Майкрософт рекомендует следовать спецификации формата ISO и вставлять заголовок PlayReady в поле pssh.

Пример MP4-файла, содержащего объект PlayReady

На следующем рисунке показан сегментованный MP4-файл с объектом PlayReady, содержащим заголовок PlayReady:

PlayReady Header in MP4

Вот шестнадцатеричное представление этого файла:

PlayReady Object Hex Dump

На следующем рисунке показан сегментованный MP4-файл с объектом PlayReady, содержащим заголовок PlayReady, и другой объект PlayReady, содержащий хранилище лицензий PlayReady Embedded:

PlayReady Header and ELS in MP4

Для ресурсов адаптивной потоковой передачи корпорация Майкрософт рекомендует вставить заголовок PlayReady в манифест ресурса.

Пример манифеста MPEG-DASH, содержащего заголовок PlayReady

<?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