Using multiple DRMs in Parallel

The Bitmovin encoding and player allows you to use multiple DRMs in parallel. This means that you encode, encrypt and package your content once and you can playback with several different DRMs, such as Widevine, PlayReady, PrimeTime, etc. This is especially important if you want to increase your device reach. Due to fragmentation in the market it is not possible to reach all major devices with just one DRM. Therefore, you need to use multiple in parallel which is possible as all DRM systems use AES for encryption. If you use the same key in the different DRM systems for the same video you just need to add additional metadata for each DRM to this video and then it can be played back by with DRM systems. In detail it’s a little bit more complex as this needs additional logic on the encoding as well as on the player side but Bitmovin provides you solutions both. What you also need for such a setup is a 3rd party multi DRM provider such as Irdeto, EZDRM, ExpressPlay, Axinom, etc. It’s also possible to create your own licensing backend if you have a contract with Google (Widevine), Microsoft (PlayReady), Adobe (PrimeTime) or Apple (Fairplay) directly and you implement the specification.

Encoding & Packaging

Combined PlayReady, Widevine and Fairplay encryption can be achieved through our encoding REST API or one of our API Clients available in different languages such as PHP, Python, Java, JavaScript, Node.js, Ruby, etc. You just need to add an CombinedDrmConfig and a HLSEncryptionConfig to the encoding job as shown in the following Java example:

CombinedDrmConfig drmConfig = new CombinedDrmConfig();
drmConfig.kid = "YOUR_KEY_ID";
drmConfig.key = "YOUR_KEY";
drmConfig.laUrl = "YOUR_LICENSE_SERVER_URL";
drmConfig.pssh = "YOUR_PSSH";

HlsEncryptionConfig hlsEncryptionConfig = new HlsEncryptionConfig();
hlsEncryptionConfig.method = HlsMethod.FAIRPLAY;
hlsEncryptionConfig.key = "YOUR_KEY";
hlsEncryptionConfig.iv = "YOUR_IV";
hlsEncryptionConfig.uri = "skd://YOUR_SKD_URL";
/* Create Encoding Job */
JobConfig jobConfig = new JobConfig();
jobConfig.speed = Speed.STANDARD;
jobConfig.hlsEncryptionConfig = hlsEncryptionConfig;
jobConfig.drmConfig = drmConfig;

The parameters of the combined configuration have the following meaning:

  • key: This is the common content encryption key
  • kid: This is the common unique identifier for your content key in hex format
  • laUrl: This is the URL to the PlayReady license server
  • pssh: This is the value for the Widevine pssh box

This values will be provided by your multi DRM licensing server provider such as Irdeto, EZDRM, ExpressPlay, Axinom, etc. We are currently working on PrimeTime support for our multi DRM encoding. Join our Newsletter to stay up to date with the latest updates!


Using the Bitmovin player in a multi DRM configuration is very simple. You can add multiple DRM configurations (e.g., Widevine configuration, PlayReady configuration, etc.) to the player configuration and you can also set all the advanced options for each DRM configuration. An example multi DRM configuration could look like the following:

drm : {
  widevine                : {
    LA_URL                : '',
    prepareMessage        : function(keyMessage) {
                              return keyMessage.message;
  playready               : {
    LA_URL                : '',
    customData            : 'INSERT-YOUR-CUSTOMDATA'
  access                  : {
    LA_URL                : '',
    authToken             : 'INSERT-YOUR-BASE64-ENCODED-AUTH-TOKEN'
  primetime               : {
      LA_URL              : ''
  fairplay                : {
    LA_URL                : '',
    certificateURL        : ''
Back to Top
Simple Share Buttons