Media Services PlayReady license templates
Warning
Azure Media Services will be retired June 30th, 2024. For more information, see the AMS Retirement Guide.
Azure Media Services enables you to encrypt your content with Microsoft PlayReady and a PlayReady license. Media Services also provides a service for delivering PlayReady licenses. When a player tries to play your PlayReady-protected content, a request is sent to the license delivery service to obtain a license. If the license service approves the request, it issues the license that is sent to the client and is used to decrypt and play the specified content.
PlayReady licenses contain the rights and restrictions that you want the PlayReady digital rights management (DRM) runtime to enforce when a user tries to play back protected content. Here are some examples of PlayReady license restrictions that you can specify:
- The date and time from which the license is valid.
- The DateTime value when the license expires.
- For the license to be saved in persistent storage on the client. Persistent licenses are typically used to allow offline playback of the content.
- The minimum security level that a player must have to play your content.
- The output protection level for the output controls for audio\video content.
- For more information, see the "Output Controls" section (3.5) in the PlayReady Compliance Rules document.
PlayReady SL3000 support
The PlayReady DRM content protection and license delivery features of Media Services supports PlayReady SL3000. Security level is part of a PlayReady client. Every license delivered to a client has a property indicating the minimum security level required to allow binding to the license. Security Level 3000 is provided for devices with the highest security that consumes the highest quality commercial content. You can set the SL3000 license in Content Key policies.
For more details on PlayReady Security levels, see the article Using the Security Level in a License.
Some things to be aware of:
- If you add an SL3000 PlayReady ContentKeyPolicyOption to a Content Key Policy, that policy can only contain additional PlayReady SL3000 or Widevine L1 options.
- SL3000 requires that you use a different key for audio.
- The audio key should not use an SL3000 level license.
- The audio should be limited to SL2000 or lower or unencrypted.
- SL3000 playback does not work in Azure Media Player (AMP) at this time. Please test in a 3rd party player (e.g. Shaka Player) or device that supports SL3000 playback.
Example of SL3000 in a Content Key Policy
{
"properties": {
"description": "ArmPolicyDescription",
"options": [
{
"name": "ArmPolicyOptionName",
"configuration": {
"@odata.type": "#Microsoft.Media.ContentKeyPolicyPlayReadyConfiguration",
"licenses": [
{
"allowTestDevices": true,
"securityLevel": "SL3000",
"beginDate": "2022-10-16T18:22:53.46Z",
"playRight": {
"scmsRestriction": 2,
"digitalVideoOnlyContentRestriction": false,
"imageConstraintForAnalogComponentVideoRestriction": true,
"imageConstraintForAnalogComputerMonitorRestriction": false,
"allowPassingVideoContentToUnknownOutput": "NotAllowed"
},
"licenseType": "Persistent",
"contentKeyLocation": {
"@odata.type": "#Microsoft.Media.ContentKeyPolicyPlayReadyContentEncryptionKeyFromHeader"
},
"contentType": "UltraVioletDownload"
}
]
},
"restriction": {
"@odata.type": "#Microsoft.Media.ContentKeyPolicyOpenRestriction"
}
}
]
}
}
Basic streaming license example
The following example shows the simplest (and most common) template that configures a basic streaming license. With this license, your clients can play back your PlayReady-protected content.
The XML conforms to the PlayReady license template XML schema defined in the PlayReady license template XML schema section.
<?xml version="1.0" encoding="utf-8"?>
<PlayReadyLicenseResponseTemplate xmlns:i="https://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.microsoft.com/Azure/MediaServices/KeyDelivery/PlayReadyTemplate/v1">
<LicenseTemplates>
<PlayReadyLicenseTemplate>
<ContentKey i:type="ContentEncryptionKeyFromHeader" />
<PlayRight />
</PlayReadyLicenseTemplate>
</LicenseTemplates>
</PlayReadyLicenseResponseTemplate>
Use Media Services APIs to configure license templates
Media Services provides types that you can use to configure a PlayReady license template.
You can find samples for configuring license templates on the Content Protection samples page.
Important
PlayReady license has restrictions that are powerful. If the output protections are too restrictive, the content might be unplayable on some clients. For more information, see the PlayReady Compliance Rules.
PlayReady license template XML schema
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://schemas.microsoft.com/Azure/MediaServices/KeyDelivery/PlayReadyTemplate/v1" xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/Azure/MediaServices/KeyDelivery/PlayReadyTemplate/v1" xmlns:xs="https://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
<xs:complexType name="AgcAndColorStripeRestriction">
<xs:sequence>
<xs:element minOccurs="0" name="ConfigurationData" type="xs:unsignedByte" />
</xs:sequence>
</xs:complexType>
<xs:element name="AgcAndColorStripeRestriction" nillable="true" type="tns:AgcAndColorStripeRestriction" />
<xs:simpleType name="ContentType">
<xs:restriction base="xs:string">
<xs:enumeration value="Unspecified" />
<xs:enumeration value="UltravioletDownload" />
<xs:enumeration value="UltravioletStreaming" />
</xs:restriction>
</xs:simpleType>
<xs:element name="ContentType" nillable="true" type="tns:ContentType" />
<xs:complexType name="ExplicitAnalogTelevisionRestriction">
<xs:sequence>
<xs:element minOccurs="0" name="BestEffort" type="xs:boolean" />
<xs:element minOccurs="0" name="ConfigurationData" type="xs:unsignedByte" />
</xs:sequence>
</xs:complexType>
<xs:element name="ExplicitAnalogTelevisionRestriction" nillable="true" type="tns:ExplicitAnalogTelevisionRestriction" />
<xs:complexType name="PlayReadyContentKey">
<xs:sequence />
</xs:complexType>
<xs:element name="PlayReadyContentKey" nillable="true" type="tns:PlayReadyContentKey" />
<xs:complexType name="ContentEncryptionKeyFromHeader">
<xs:complexContent mixed="false">
<xs:extension base="tns:PlayReadyContentKey">
<xs:sequence />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="ContentEncryptionKeyFromHeader" nillable="true" type="tns:ContentEncryptionKeyFromHeader" />
<xs:complexType name="ContentEncryptionKeyFromKeyIdentifier">
<xs:complexContent mixed="false">
<xs:extension base="tns:PlayReadyContentKey">
<xs:sequence>
<xs:element minOccurs="0" name="KeyIdentifier" type="ser:guid" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="ContentEncryptionKeyFromKeyIdentifier" nillable="true" type="tns:ContentEncryptionKeyFromKeyIdentifier" />
<xs:complexType name="PlayReadyLicenseResponseTemplate">
<xs:sequence>
<xs:element name="LicenseTemplates" nillable="true" type="tns:ArrayOfPlayReadyLicenseTemplate" />
<xs:element minOccurs="0" name="ResponseCustomData" nillable="true" type="xs:string">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="PlayReadyLicenseResponseTemplate" nillable="true" type="tns:PlayReadyLicenseResponseTemplate" />
<xs:complexType name="ArrayOfPlayReadyLicenseTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="PlayReadyLicenseTemplate" nillable="true" type="tns:PlayReadyLicenseTemplate" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfPlayReadyLicenseTemplate" nillable="true" type="tns:ArrayOfPlayReadyLicenseTemplate" />
<xs:complexType name="PlayReadyLicenseTemplate">
<xs:sequence>
<xs:element minOccurs="0" name="AllowTestDevices" type="xs:boolean" />
<xs:element minOccurs="0" name="BeginDate" nillable="true" type="xs:dateTime">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ContentKey" nillable="true" type="tns:PlayReadyContentKey" />
<xs:element minOccurs="0" name="ContentType" type="tns:ContentType">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="ExpirationDate" nillable="true" type="xs:dateTime">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="GracePeriod" nillable="true" type="ser:duration">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="LicenseType" type="tns:PlayReadyLicenseType" />
<xs:element minOccurs="0" name="PlayRight" nillable="true" type="tns:PlayReadyPlayRight" />
</xs:sequence>
</xs:complexType>
<xs:element name="PlayReadyLicenseTemplate" nillable="true" type="tns:PlayReadyLicenseTemplate" />
<xs:simpleType name="PlayReadyLicenseType">
<xs:restriction base="xs:string">
<xs:enumeration value="Nonpersistent" />
<xs:enumeration value="Persistent" />
</xs:restriction>
</xs:simpleType>
<xs:element name="PlayReadyLicenseType" nillable="true" type="tns:PlayReadyLicenseType" />
<xs:complexType name="PlayReadyPlayRight">
<xs:sequence>
<xs:element minOccurs="0" name="AgcAndColorStripeRestriction" nillable="true" type="tns:AgcAndColorStripeRestriction">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="AllowPassingVideoContentToUnknownOutput" type="tns:UnknownOutputPassingOption">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="AnalogVideoOpl" nillable="true" type="xs:int">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="CompressedDigitalAudioOpl" nillable="true" type="xs:int">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="CompressedDigitalVideoOpl" nillable="true" type="xs:int">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="DigitalVideoOnlyContentRestriction" type="xs:boolean">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="ExplicitAnalogTelevisionOutputRestriction" nillable="true" type="tns:ExplicitAnalogTelevisionRestriction">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="FirstPlayExpiration" nillable="true" type="ser:duration">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="ImageConstraintForAnalogComponentVideoRestriction" type="xs:boolean">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="ImageConstraintForAnalogComputerMonitorRestriction" type="xs:boolean">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="ScmsRestriction" nillable="true" type="tns:ScmsRestriction">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="UncompressedDigitalAudioOpl" nillable="true" type="xs:int">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="UncompressedDigitalVideoOpl" nillable="true" type="xs:int">
<xs:annotation>
<xs:appinfo>
<DefaultValue EmitDefaultValue="false" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="PlayReadyPlayRight" nillable="true" type="tns:PlayReadyPlayRight" />
<xs:simpleType name="UnknownOutputPassingOption">
<xs:restriction base="xs:string">
<xs:enumeration value="NotAllowed" />
<xs:enumeration value="Allowed" />
<xs:enumeration value="AllowedWithVideoConstriction" />
</xs:restriction>
</xs:simpleType>
<xs:element name="UnknownOutputPassingOption" nillable="true" type="tns:UnknownOutputPassingOption" />
<xs:complexType name="ScmsRestriction">
<xs:sequence>
<xs:element minOccurs="0" name="ConfigurationData" type="xs:unsignedByte" />
</xs:sequence>
</xs:complexType>
<xs:element name="ScmsRestriction" nillable="true" type="tns:ScmsRestriction" />
</xs:schema>
Get help and support
You can contact Media Services with questions or follow our updates by one of the following methods:
- Q & A
- Stack Overflow. Tag questions with
azure-media-services
. - @MSFTAzureMedia or use @AzureSupport to request support.
- Open a support ticket through the Azure portal.
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for