DRM 用に Brightcove Player を設定する

このトピックでは、Brightcove Player がデジタル著作権管理(DRM)をどのように実装しているかについて学びます。本ドキュメントでは、まず DRM プラグインの実装方法を示し、その後にプラグインの詳細とその実装方法について説明します。

はじめに

Brightcove は、できる限り幅広いブラウザおよびデバイスに DRM 保護されたコンテンツを配信するため、以下の技術を採用しています。

  • Native/EME がサポートする CENC DRM を使用した MPEG-DASH
  • FairPlay を使用した HLS

Brightcove Player で DRM を使用するには、以下を行う必要があります。

  • DRM が有効化されたコンテンツを作成する
  • DRM プラグインを使用できるように Brightcove Player を有効化する
  • 場合によっては、ライセンス サーバーを使用するように DRM プラグインを設定する

用語

本ドキュメントで使用される主な用語を確認してください。

用語 定義
DRM Wikipedia より引用: デジタル著作権管理(DRM)とは、ハードウェアおよびソフトウェアの製造業者、出版社、著作権者、個人が、販売後のデジタル コンテンツおよびデバイスの使用を制御することを目的として用いるコピー防止技術の総称です。
MPEG-DASH Wikipedia より引用: Dynamic Adaptive Streaming over HTTP(DASH、別名 MPEG-DASH)は、従来の HTTP Web サーバーから配信されるメディア コンテンツを、インターネット経由で高品質にストリーミングできるアダプティブ ビットレート ストリーミング技術です。Apple の HTTP Live Streaming(HLS)ソリューションと同様に、MPEG-DASH はコンテンツを HTTP ベースの小さなファイル セグメントの連続に分割します。各セグメントには、映画やスポーツ イベントのライブ放送など、数時間にわたる可能性のあるコンテンツの短い再生時間が含まれます。
CENC ISO 規格より引用: 「CENC」共通暗号化方式は、複数のデジタル著作権および鍵管理システム(DRM システム)が利用できる標準的な暗号化および鍵マッピング方式を規定しており、異なる DRM システムを使用して同一ファイルを復号できるようにします。
Encrypted Media Extensions (EME) Wikipedia より引用: EME は、Web ブラウザとデジタル著作権管理(DRM)エージェント ソフトウェアとの間に通信チャネルを提供するための W3C のドラフト仕様です。これにより、Microsoft Silverlight などのサードパーティ製メディア プラグインを使用することなく、HTML5 動画で DRM 保護されたコンテンツを再生できるようになります。

Players モジュールを使用した実装

Studio で DRM プラグインを実装し、アカウント設定に基づいて DRM を有効化するには、以下の手順に従ってください。

  1. Players モジュールを開き、新しいプレーヤーを作成するか、DRM 機能を追加したいプレーヤーを選択します。
  2. プレーヤーのリンクをクリックして、プレーヤーのプロパティを開きます。
  3. Overview タブの Playback セクションを展開します。
  4. Enable DRM チェックボックスをオンにします。
  5. プレーヤーを公開するには、Publish Changes をクリックします。
  6. 開いているダイアログを閉じるには、Close をクリックします。

DRM プラグインのアーキテクチャ

DRM プラグイン(videojs-drm)は、次の 2 つのプラグインのラッパーです。

  • videojs-silverlight
  • videojs-contrib-eme

videojs-drm プラグインのバージョン 5 では、プレーヤーに組み込まれた DASH 再生機能を使用します。これは VHS を利用しており、VHS は組み込みの videojs-contrib-hls プラグインの後継であり、名称が変更されたバージョンです。

プレーヤー 6.26.0 以降、プレーヤーは DASH マルチピリオドをサポートしています。それ以前のバージョンのプレーヤーで DASH マルチピリオドを使用するには、Shaka Player が必要です。

バージョン 4 と同様に DASH 再生に Shaka Player を使用したい場合は、videojs-drm バージョン 5 のスクリプトとともに、次のスクリプトを含めることができます。

          https://players.brightcove.net/videojs-shaka/1/videojs-shaka.js
 

videojs-silverlight プラグインは、特定の Internet Explorer ブラウザで DASH コンテンツの再生を可能にします。

videojs-contrib-eme プラグインは、FairPlay HLS コンテンツの再生を可能にします。

使用される再生技術

Brightcove Player は、ブラウザごとに異なる DRM 再生技術を利用します。以下に、Brightcove Player で使用される DRM 技術の詳細を示します。

  • FairPlay: Apple の DRM システム
  • PlayReady: Microsoft の DRM システム
  • Widevine: Google の DRM システム

次の表は、Brightcove Player における、ブラウザ(最新バージョン)、フォーマット、および使用される再生技術の関係を示しています。

ブラウザ フォーマット DRM 再生技術 DRM コンテンツの配信に使用される
レンディション タイプ
Chrome Desktop Widevine を使用した HLS または DASH EME HLS または MPEG-DASH
Chrome Mobile1 Widevine を使用した HLS または DASH EME HLS または MPEG-DASH
Internet Explorer2 PlayReady を使用した HLS または DASH EME HLS または MPEG-DASH
Edge Widevine を使用した HLS または DASH EME HLS または MPEG-DASH
Safari FairPlay を使用した HLS Native HLS
Firefox Widevine を使用した HLS または DASH EME HLS または MPEG-DASH

1iOS 上の Chrome Mobile を使用した DRM 再生はサポートされていません。

DRM コンテンツの作成

DRM が有効化されたコンテンツを作成するには、次の 2 つの手順を実行する必要があります。

  1. アカウント マネージャーに連絡して、アカウントを DRM 対応にしてもらいます。その後、適切なライセンス キーおよび取り込みプロファイルを設定して、DRM 保護コンテンツの作成を可能にすることができます。
  2. DRM 保護されたコンテンツを作成します。新しいコンテンツをアップロードするか、既存のコンテンツを DRM として再エンコードするかを選択できます。これは、目的の暗号化技術を生成する Ingest Profile を選択することで行います。

セグメント化および暗号化された動画を含む MPEG-DASH マニフェスト、または HLS FairPlay コンテンツを使用する DRM 保護コンテンツを作成する必要があります。

コードでの FairPlay 再生の実装

インページ埋め込みコードを使用して FairPlay 再生を実装する場合は、DRM プラグインを使用するために以下の手順に従う必要があります。

  1. HTML ページのヘッダーに、プラグインのスタイルシートを含めます。
      <link href="https://players.brightcove.net/videojs-drm/5/videojs-drm.css" rel="stylesheet">
      
      
  2. プラグインの JavaScript を含めます。
      <script src="https://players.brightcove.net/videojs-drm/5/videojs-drm.min.js"></script>
  3. アカウントが Dynamic Delivery 用に設定されている場合は、EME プラグインを呼び出して初期化するだけで済みます。

      <script type="text/javascript">
        videojs.getPlayer('myPlayerID').ready(function() {
          var myPlayer = this;
          myPlayer.eme();
      });
      </script>

     

    アカウントが Dynamic Delivery 用に設定されていない場合は、FairPlay 認証情報を指定して EME プラグインを呼び出し、設定する必要があります。

      videojs.getPlayer('myPlayerID').ready(function() {
        var myPlayer = this;
        myPlayer.eme({
          "applicationId": "YOUR_APPLICATION_ID",
          "publisherId": "YOUR_PUBISHER_ID"
        });
      });
      </script>

    Brightcove Player は、FairPlay 認証情報を Video Cloud の FairPlay 証明書パスに送信します。

FairPlay で保護されたコンテンツで DRM プラグインを使用するには、以下の手順に従ってください。

  1. HTML ページのヘッダーに、プラグインのスタイルシートを含めます。
      <link href="https://players.brightcove.net/videojs-drm/5/videojs-drm.css" rel="stylesheet">
  2. プラグインの JavaScript を含めます。
      <script src="https://players.brightcove.net/videojs-drm/5/videojs-drm.min.js"></script>
  3. ページの JavaScript ブロック内で、EME プラグインに getCertificategetContentIdgetLicense 関数を提供することにより、FairPlay 認証情報を指定して EME プラグインを呼び出し、設定します。これらの関数は、お客様独自の FairPlay ライセンス サーバー実装に固有のものであり、src が設定される前に EME プラグインに直接渡すことができます。
      <script type="text/javascript">
        videojs.getPlayer('myPlayerID').ready(function() {
          var myPlayer = this;
          myPlayer.eme({
            keySystems: {
              'com.apple.fps.1_0': {
              getCertificate: function (emeOptions, callback) {
              // request certificate
              // if err, callback(err)
              // if success, callback(null, certificate) where certificate
              // is a Uint8Array
            },
            getContentId: function (emeOptions, initData) {
              // return content ID as a string
              },
              getLicense: function (emeOptions, contentId, keyMessage, callback) {
                // request key
                // if err, callback(err)
                // if success, callback(null, key) as an arraybuffer
              }
            }
          }
        });
      </script>

FairPlay 情報は、各 src オブジェクトの一部として渡すこともできます。emeOptions はすべての関数にパラメーターとして提供されます。これは、現在のソースのソース オプションでマージ(上書き)されたプラグイン オプションへの参照です。これにより、オプションを自分で管理する必要がなくなり、アクセスが容易になります。

  player.src({
    type: 'application/vnd.apple.mpegurl',
    src: 'http://www.example.com/path/to/master.m3u8',
    keySystems: {
      "com.apple.fps.1_0": {
        getCertificate: function(emeOptions, callback) { ... },
        getContentId: function(emeOptions, initData) { ... },
        getLicense: function(emeOptions, contentId, keyMessage, callback) { ... }
      }
    }
  });

たとえば、getCertificate リクエストで applicationId および publisherId を使用する必要がある場合、次のようにプラグイン オプションを渡すことができます。

  {
    keySystems: {
      "com.apple.fps.1_0": {
        getCertificate: function(emeOptions, callback) {
        var applicationId = emeOptions.applicationId; // 'application-id'
        var publisherId = emeOptions.publisherId; // 'publisher-id'
        // ...
      }
        // ...
      }
    },
    applicationId: 'application-id'
    publisherId: 'publisher-id'
  }

または、ソース固有の publisherId が必要な場合は、ソース オプションで上書きすることもできます。

  // plugin options
  {
    keySystems: {
      "com.apple.fps.1_0": {
      getCertificate: function(emeOptions, callback) {
      var applicationId = emeOptions.applicationId; // 'application-id'
      var publisherId = emeOptions.publisherId; // 'source-specific-publisher-id'
      // ...
    },
      // ...
    }
  },
  applicationId: 'application-id'
  publisherId: 'publisher-id'
  }
  // source options
  player.src({
    src: '<URL>',
    type: 'application/vnd.apple.mpegurl',
    publisherId: 'source-specific-publisher-id'
  });

以下は実装例で、オプションを src オプションとして渡し、ホスト名からコンテンツ ID を取得し、固定のライセンスおよび証明書 URI と、キー メッセージのボディを伴う POST が必要なライセンス URI を使用しています。

  var uint8ArrayToString = function(array) {
  return String.fromCharCode.apply(null, new Uint16Array(array.buffer));
  };
  var getHostnameFromUri = function(uri) {
    var link = document.createElement('a');
    link.href = uri;
    return link.hostname;
  };
  var getCertificate = function(emeOptions, callback) {
    videojs.xhr({
      uri: emeOptions.certificateUri,
      responseType: 'arraybuffer'
      }, function(err, response, responseBody) {
      if (err) {
        callback(err);
        return;
      }
      callback(null, new Uint8Array(responseBody));
    });
  };
  var getContentId = function(emeOptions, initData) {
    return getHostnameFromUri(uint8ArrayToString(initData));
  };
  var getLicense = function(emeOptions, contentId, keyMessage, callback) {
    videojs.xhr({
      uri: emeOptions.licenseUri,
      method: 'POST',
      responseType: 'arraybuffer',
      body: keyMessage,
      headers: {
        'Content-type': 'application/octet-stream'
      }
      }, function(err, response, responseBody) {
      if (err) {
        callback(err);
        return;
      }
      callback(null, responseBody);
    });
  };
  player.src({
    type: 'application/vnd.apple.mpegurl',
    src: 'http://www.example.com/path/to/master.m3u8',
    keySystems: {
      "com.apple.fps.1_0": {
      getCertificate: getCertificate,
      getContentId: getContentId,
      getLicense: getLicense
    }
    },
    certificateUri: 'http://example.com/fairplay/certificate/endpoint',
    licenseUri: 'http://example.com/fairplay/license/endpoint'
  });

コードでの Widevine 再生の実装

インページ埋め込みコードを使用して Widevine 再生を実装する場合は、DRM プラグインを使用するために以下の手順に従う必要があります。

  1. HTML ページのヘッダーに、プラグインのスタイルシートを含めます。
      <link href="https://players.brightcove.net/videojs-drm/5/videojs-drm.css" rel="stylesheet">
  2. プラグインの JavaScript を含めます。
      <script src="https://players.brightcove.net/videojs-drm/5/videojs-drm.min.js"></script>
  3. 次に、EME プラグインを呼び出して初期化するだけです。
      <script type="text/javascript">
        videojs.getPlayer('myPlayerID').ready(function() {
          var myPlayer = this;
          myPlayer.eme();
        });
      </script>

Widevine Modular コンテンツの場合、プレーヤーのソース ハンドラーを使用して、Widevine ライセンス サーバーを使用するようにプレーヤーを設定する必要があります。

Web ページ上のプレーヤーのインスタンスを更新するには、プレーヤーのソース ハンドラーを使用できます。以下は、player.src() 関数とともに keySystemsOptions 配列を使用する例です。

  player.src({
    src: 'http://example.com/my/manifest.mpd',
    type: 'application/dash+xml',
    keySystemOptions: [
    {
      name: 'com.widevine.alpha',
      options: {
      licenseUrl: 'http://m.widevine.com/proxy'
    }
    }]
  });

次のように updateSourceData 関数を使用することもできます。

  videojs.Html5DashJS.updateSourceData = function(source) {
  source.keySystemOptions = [{
  name: 'com.widevine.alpha',
  options: {
  serverURL:'https://example.com/anotherlicense'
  }
  }];
  return source;
  };

詳細については、GitHub 上の videojs-contrib-dash の情報をご参照ください。

その他の DRM プロバイダーのサポート

このプラグインには、お客様が他の DRM プロバイダーのサポートを実装できるパスが用意されています。これは、ライセンス情報を取得するために必要なカスタム ロジックが求められる Fairplay で特に有用です。特定のソースで keySystems vendor.name を追加すると、このロジックの利用が試行され、必要な証明書およびライセンス情報が含められます。以下は Azure の例です。

  player.ready(function(){
    player.eme();
    player.src({
    src: 'http://example.com/src-url.m3u8'
    type: '',
    keySystems: {
      'com.apple.fps.1_0': {
      vendor: {
      name: 'azure'
    },
    certificateUri: 'https://example.com/your-certificate-uri.cer',
    licenseUri: 'https://example.com/your-license-uri'
    }
    }
    });
  });

以下は castLabs の例です。

  var player = videojs.getPlayer('myPlayerID');
  player.ready(function(){
    player.eme();
    player.src({
      src: 'http://example.com/src-url.m3u8'
      type: '',
      keySystems: {
        'com.apple.fps.1_0': {
        vendor: {
        name: 'castlabs',
        options: {
        authToken: 'your-auth-token',
        customData: 'your-custom-data'
      }
      }
      certificateUri: 'https://example.com/your-certificate-uri.cer',
      licenseUri: 'https://example.com/your-license-uri'
      }
      }
    });
  });

次の例では、Widevine と PlayReady のソースを読み込みます。

  player.src({
    type: 'application/dash+xml',
    src: '<some src>',
       keySystems: {
    'com.widevine.alpha': '<license url>',
    'com.microsoft.playready': '<license url>'
    }
  });

デバッグの有効化

DRM DASH コンテンツのデバッグを有効にするには、以下の Shaka スクリプトを Brightcove Player に追加します。

  <!-- Script for the drm plugin -->
  <script src="https://players.brightcove.net/videojs-drm/5/videojs-drm.min.js"></script>
  <!-- Script for the shaka plugin -->
  <script src="https://players.brightcove.net/videojs-shaka/1/videojs-shaka.js"></script>
  <!-- Script for shaka debug plugin  -->
  <script src="https://players.brightcove.net/videojs-shaka/1/videojs-shaka.debug.js"></script>

以下は、プレーヤーの読み込み時のデバッグの例です。

Debugging in console at startup

以下は、動画の再生開始後のデバッグの例です。

Debugging in console after playing

DASH-IF

Brightcove Player は、DASH Industry Forum(DASH-IF)のアセットをサポートしており、Brightcove のデータを Native/EME に渡します。DASH-IF の詳細については、http://dashif.org をご参照ください。以下の DASH-IF のリンクも、DASH を使用する際に役立ちます。

再生制限

再生制限を使用するように Brightcove Player を設定するには、こちらをご参照ください。

既知の問題

  • Media モジュールの TEXT TRACK セクションにある Default (Auto Display) キャプション設定は、DRM およびマニフェスト内キャプションと併用した場合にはサポートされていません。マニフェスト内キャプションは、たとえば Brightcove の Dynamic Delivery および SSAI 製品で使用されます。この問題の回避策は、Advanced Brightcove Player 実装で <track> タグを使用することです。これは、プログラムで動画にキャプションを追加するドキュメントに詳細が記載されています。<track> タグには default 属性を使用する必要があることに注意してください。
  • DRM アセットと Chrome: Iframe プレーヤー実装で DRM プラグインを使用する場合、Chrome で DRM アセットを再生できるようにするには allow="encrypted-media" が必要です。
      <iframe src="https://players.brightcove.net/123456789/BydO6uuuu_default/index.html?videoId=5783262319001"
      allowfullscreen
      width="640" height="360"
      allow="encrypted-media"></iframe>
  • Silverlight/IE11 用の特別なイベント: ほとんどの場合、プレーヤーをプログラム的に操作するには、ready または loadedmetadata  イベントの発火を待ちます。ただし、IE11 で Silverlight 技術を使用し、かつ DRM コンテンツを再生する際にプレーヤーをプログラム的に操作したい場合は、canplay イベントを待つ必要があります。
  • iOS では、必要な DRM ブラウザー API(EME)を提供しているのは Safari のみで、WebView は現在 EME をサポートしていません。したがって、Fairplay DRM は Safari でのみ動作します。

変更履歴

DRM プラグイン リリースノートをご参照ください。

過去のリリースノートについては、こちらの変更履歴をご参照ください。