Como empacotar conteúdo baseado em MP4 para PlayReady
Criptografia de Conteúdo
O empacotador precisa criptografar o conteúdo. Qualquer formato de criptografia que use chaves AES-128 usadas no modo CTR ou no modo CBC é permitido pelas Regras de Conformidade.
Os formatos baseados em MP4 são recomendados. CMAF é o formato baseado em MP4 preferencial para Clientes PlayReady, Windows 10 e Xbox One.
A Microsoft dá suporte aos dois esquemas de criptografia comuns que têm ampla aceitação do setor : os esquemas de proteção AES-CBC e AES-CTR 'cenc' 'cbcs'. Consulte ISO/IEC FDIS 23001-7:2016 "Tecnologia da informação – tecnologias de sistemas MPEG – Parte 7: criptografia comum em arquivos de formato de arquivo de mídia base ISO"
Para obter mais informações, consulte Criptografia e Entrega de Conteúdo
Inserindo um cabeçalho PlayReady no conteúdo
O empacotador precisa inserir o Cabeçalho PlayReady gerado no conteúdo. Normalmente, ele é inserido no cabeçalho dos arquivos de conteúdo ou no manifesto dos ativos de streaming.
Esse cabeçalho inclui valores padrão para informações necessárias por um cliente PlayReady para solicitar uma licença para esta peça de conteúdo específica. Por exemplo, um cliente PlayReady precisa saber quais IDs de chave (KIDs) são usadas no ativo para que ele possa solicitar os valores de chave. Ele também precisa saber o endereço de um servidor de licença que entregará essa licença. Opcionalmente, ele precisa saber qual página da Web será renderizada para o usuário no caso de uma solicitação de licença ser recusada pelo servidor de licença (o usuário pode ser direcionado para uma página de pagamento).
Aqui está um exemplo de um cabeçalho 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>
Quando um cliente Do PlayReady precisar reproduzir o conteúdo protegido, ele solicitará uma licença para o conteúdo se ainda não tiver nenhum. Para iniciar a solicitação de licença, o desenvolvedor do aplicativo pode ter provisionado o aplicativo com valores codificados ou dinâmicos para a matriz KID, LA_URL e o comportamento em caso de negação de solicitação de licença. O aplicativo substituiu os valores padrão KID ou LA_URL. Se o desenvolvedor não tiver feito isso, espera-se que o cliente faça a solicitação de licença com base nos valores padrão encontrados no próprio cabeçalho de conteúdo.
Para arquivos ISO MP4, a Microsoft recomenda seguir a especificação de formato ISO e inserir o Cabeçalho PlayReady em uma caixa 'pssh'.
Exemplo de um arquivo MP4 que contém um objeto PlayReady
A figura a seguir mostra um arquivo MP4 segmentado com um objeto PlayReady que contém um cabeçalho PlayReady:
Aqui está a exibição HEX deste arquivo:
A figura a seguir mostra um arquivo MP4 segmentado com um objeto PlayReady que contém um cabeçalho PlayReady e outro objeto PlayReady que contém um Repositório de Licenças Do PlayReady Embedded:
Para ativos de streaming adaptáveis, a Microsoft recomenda inserir o Cabeçalho PlayReady no manifesto do ativo.
Exemplo de um manifesto MPEG-DASH contendo um cabeçalho 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>