Freigeben über


So generieren Sie einen PlayReady-Header

Der Paketer muss einen PlayReady-Header in den verschlüsselten Inhalt einschließen.

Eine detaillierte Beschreibung des PlayReady-Headers und des PlayReady-Objekts finden Sie in der PlayReady-Headerspezifikation.

Der PlayReady-Header enthält Informationen zu den Inhalten, die wiedergegeben werden, einschließlich der Schlüsselbezeichner (KIDs), die die Schlüssel identifizieren, die zum Verschlüsseln der Daten verwendet werden, die Standardlizenzkäufe-URL des PlayReady-Lizenzservers und alle benutzerdefinierten Daten, die Sie einschließen möchten. Der Schlüssel und die KID, die zum Verschlüsseln des Inhalts verwendet werden, müssen mit dem PlayReady-Lizenzserver freigegeben werden, der die Lizenzen für diesen bestimmten Inhalt ausgibt, normalerweise über ein Key Management System (KMS).

Hinweis

Microsoft stellt kein Key Management System mit PlayReady bereit.

Der folgende XML-Code enthält ein Beispiel für einen PlayReady-Header, der in der Kopfzeile einer segmentierten MP4-Datei eingefügt werden kann, in der Regel für On-Demand-Inhalte. Es enthält die Liste der KIDs (die IDs der Inhaltsverschlüsselungsschlüssel), die für einen Client erforderlich sind, um den Inhalt zu entschlüsseln. Es ist die häufigste Möglichkeit, diese KIDs für eine On-Demand-Datei oder einen Stream zu signalisieren.

<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>
        <KID ALGID="AESCTR" VALUE="tuhDoKUN7EyxDPtMRNmhyA=="></KID>
      </KIDS>
    </PROTECTINFO>
    <LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
    <DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
  </DATA>
</WRMHEADER>

Der folgende XML-Code enthält ein Beispiel für einen PlayReady-Header für Live linearen Inhalt. Es enthält keine KID, da sich die Inhaltsverschlüsselungsschlüssel (und ihre zugeordneten KIDs) gelegentlich ändern (z. B. sehr häufig oder bei Programmgrenzen oder jeder Stunde oder jeden Tag). Die für den Inhaltsdatenstrom verwendeten KIDs werden in den Segmentkopfzeilen signalisiert, und es ist nicht erforderlich, eine dieser Daten in den PlayReady-Header der Datenstromebene einzuschließen. Die Eigenschaft ENTSCHLÜSSELUNGORSETUP ist auf ONDEMAND festgelegt, was bedeutet, dass der PlayReady-Header und -Entschlüsselungsor auf Bedarf festgelegt wird, d. h. wenn der Client tatsächlich mit der Entschlüsselung eines Segments beginnen muss – und an diesem Punkt hat der Client Zugriff auf einen anderen PlayReady-Header im Segmentheader, um herauszufinden, welche KID beteiligt ist.

Hinweis

ENTSCHLÜSSELUNGSSETUP = ONDEMAND bedeutet nicht, dass der Inhalt on-Demand bereitgestellt wird, es ist tatsächlich das Gegenteil.

<WRMHEADER version="4.2.0.0" xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
  <DATA>
    <DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
  </DATA>
</WRMHEADER>

Es gibt mehrere Möglichkeiten zum Erstellen eines PlayReady-Header-Generators in Ihrem Packager. In den folgenden Abschnitten wird im Allgemeinen beschrieben, wie Sie eine PlayReady-Kopfzeile generieren können.

Methode 1 – Erstellen Ihres eigenen Codes basierend auf der PlayReady-Headerspezifikation

Die PlayReady-Objekt- und Headerspezifikation ist öffentlich, sodass es möglich ist, Code in Ihrer Appliance oder Ihrem Dienst zu schreiben, das ein PlayReady-Objekt und einen PlayReady-Header generiert, um Inhalte zu verpacken.

Der PlayReady-Header-Generator muss Eingabeparameter wie:

  • On Demand-Inhalt oder Live Linearen Inhalt.
  • KID oder Liste der KIDs, die verwendet werden, um das gesamte Objekt zu schützen.
  • Verschlüsselungstyp verwendet (AESCTR oder AESCBC).
  • Defaut LA-URL – die Standard-URL des PlayReady-Lizenzservers, der Lizenzen ausgibt, falls zur Verpackungszeit bekannt.
  • Standarddomänendienstbezeichner, wenn der Dienst Domänen verwendet.

Sie können jetzt das PlayReady-Objekt und den zugeordneten PlayReady-Header erstellen. Im folgenden Codebeispiel wird veranschaulicht, wie Sie ein PlayReady-Objekt erstellen, das einen PlayReady-Header enthält, der für On-Demand-Inhalte verwendet wird.

// This function gets values from the key management system and your specified encryption mode
// (and optionally the domainID), creates a PlayReady Header, adds the header to a 
// PlayReady Object, and stores them in a file in UTF-16 little endian format

void buildRMObject(string KeyID1, string KeyID2, string encryptMode, string domainID)
{
	// The string parameters include the following:
	// KeyID1, KeyID2 - The key identifiers - these values are returned from the key management system or
	//                                        the KeySeed mechanism
	// encryptMode - the encryption mode used to encrypt content, can be AESCTR or AESCBC
	// domainID - the optional domain service identifier (only used for domains)

	string xmlString = "<WRMHEADER xmlns=\"http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader\" version=\"4.3.0.0\"><DATA><PROTECTINFO><KIDS><KID ALGID=\"";
	xmlString.append(encryptMode);
	xmlString.append("\" VALUE=\"");
	xmlString.append(KeyID1);
	xmlString.append("\"></KID><KID ALGID=\"");
	xmlString.append(encryptMode);
	xmlString.append("\" VALUE=\"");
	xmlString.append(KeyID2);
	xmlString.append("\"></KID></KIDS></PROTECTINFO><LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL><DS_ID>");
	xmlString.append(domainID);
	xmlString.append("</DS_ID></DATA></WRMHEADER>");

	// Convert the PlayReady header to UFT-16 format
	wstring_convert<codecvt_utf8_utf16<wchar_t>> convert;
	wstring utf16XML = convert.from_bytes(xmlString);

	// Calculate the length of the PlayReady Header
	int32_t headerLength = (utf16XML.size() * sizeof(wchar_t));
	// Calculate the length of the PlayReady Object
	int32_t objectLength = headerLength + 10;
	// Set the number of PlayReady object records (in this case, 1)
	int16_t recordCount = 1;
	// Set the record type (in this case, a PlayReady Header)
	// If this was an embedded license store, this value would be 3
	int16_t recordType = 1;

	// Write the PlayReady Object and PlayReady Header to a file
	wofstream wofs("C:\\Temp\\PRObject.txt", ios::binary);
	wofs.imbue(locale(wofs.getloc(),
			  new codecvt_utf16<wchar_t, 0x10ffff, little_endian>));
	wofs.write(reinterpret_cast<const wchar_t *>(&objectLength), 2);
	wofs.write(reinterpret_cast<const wchar_t *>(&recordCount), 1);
	wofs.write(reinterpret_cast<const wchar_t *>(&recordType), 1);
	wofs.write(reinterpret_cast<const wchar_t *>(&headerLength), 1);
	wofs <<  utf16XML;
}

Methode 2 – Verwenden der PlayReady Server-API

Wenn Sie eine PlayReady Server SDK-Lizenz sind, enthält das Server-SDK die PlayReadyHeader-Klasse , die zum Erstellen eines PlayReady-Headers verwendet werden kann. Es enthält Methoden, die Sie verwenden und Eigenschaften verwenden können, die Sie mit den für einen PlayReady-Header erforderlichen Informationen ausfüllen können.

Die PlayReadyHeader-Klasse wird ausführlich in der PlayReady-Dokumentation beschrieben, die Sie mit Ihrer PlayReady Server SDK-Lizenz erhalten. Das PlayReady Server SDK enthält auch einen Beispielpaketer (AESPackaging), der veranschaulicht, wie ein PlayReady-Header erstellt wird.

Wie bei Methode 1 benötigen Sie die KeyID(s), die vom Schlüsselverwaltungssystem generiert wurden, den Verschlüsselungstyp (AESCTR oder AESCBC), die URL des PlayReady-Lizenzservers und optional den Domänendienstbezeichner.

Methode 3 – Verwenden einer Windows Anwendung

Dinge, die Sie benötigen, bevor Sie beginnen.

  1. Sie müssen über die KeyID(s) verfügen, die vom Schlüsselverwaltungssystem generiert wurden.
  2. Sie müssen den Verschlüsselungstyp (AESCTR oder AESCBC) kennen.
  3. Erstellen Sie die PlayReady-Kopfzeile im PlayReady-Objekt mithilfe der Windows 10 PlayReadyContentHeader-Klasse.

Wie in den vorherigen Methoden benötigen Sie die KeyID(s), die vom Schlüsselverwaltungssystem generiert wurden, den Verschlüsselungstyp (AESCTR oder AESCBC), die URL des PlayReady-Lizenzservers und optional den Domänendienstbezeichner.