Comment empaqueter du contenu MP4 pour PlayReady
Chiffrement du contenu
Le packageur doit chiffrer le contenu. Tout format de chiffrement qui utilise des clés AES-128 utilisées en mode CTR ou en mode CBC est autorisé par les règles de conformité.
Les formats MP4 sont recommandés. CMAF est le format MP4 préféré pour les clients PlayReady, Windows 10 et Xbox One.
Microsoft prend en charge les deux schémas de chiffrement courants qui ont une large acceptation de l’industrie — les schémas de protection AES-CBC et « cenc » AES-CTR. Voir ISO/IEC FDIS 23001-7:2016 « Technologies de l’information – Technologies des systèmes MPEG – Partie 7 : Chiffrement commun dans les fichiers de format de fichiers multimédias de base ISO »
Pour plus d’informations, consultez Chiffrement de contenu et remise
Insertion d’un en-tête PlayReady dans le contenu
Le packager doit insérer l’en-tête PlayReady qu’il a généré dans le contenu. Il est généralement inséré dans l’en-tête des fichiers de contenu ou dans le manifeste des ressources de streaming.
Cet en-tête inclut des valeurs par défaut pour les informations nécessaires par un client PlayReady pour demander une licence pour ce contenu particulier. Par exemple, un client PlayReady doit savoir quels ID de clé (KID) sont utilisés dans la ressource afin qu’il puisse demander les valeurs de clé. Il doit également connaître l’adresse d’un serveur de licences qui fournira cette licence. Il doit éventuellement connaître la page web à afficher à l’utilisateur si une demande de licence est refusée par le serveur de licence (l’utilisateur peut être dirigé vers une page de paiement).
Voici un exemple d’en-tête 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>
Lorsqu’un client PlayReady doit lire du contenu protégé, il demande une licence pour le contenu s’il n’en a pas encore. Pour lancer la demande de licence, le développeur de l’application peut avoir provisionné l’application avec des valeurs codées en dur ou dynamiques pour le tableau KID, LA_URL et le comportement en cas de refus de demande de licence. L’application a substitué les valeurs KID ou LA_URL valeurs par défaut. Si le développeur ne l’a pas fait, le client est censé effectuer la demande de licence en fonction des valeurs par défaut trouvées dans l’en-tête de contenu lui-même.
Pour les fichiers ISO MP4, Microsoft recommande de suivre la spécification de format ISO et d’insérer l’en-tête PlayReady dans une zone « pssh ».
Exemple de fichier MP4 contenant un objet PlayReady
La figure suivante montre un fichier MP4 segmenté avec un objet PlayReady qui contient un en-tête PlayReady :
Voici la vue HEX de ce fichier :
La figure suivante montre un fichier MP4 segmenté avec un objet PlayReady qui contient un en-tête PlayReady et un autre objet PlayReady qui contient un magasin de licences Incorporée PlayReady :
Pour les ressources de diffusion en continu adaptative, Microsoft recommande d’insérer l’en-tête PlayReady dans le manifeste de la ressource.
Exemple de manifeste MPEG-DASH contenant un en-tête 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>