PlayReady の Encrypted Media ExtensionPlayReady Encrypted Media Extension

このセクションでは、以前の Windows 8.1 から、Windows 10 バージョンに加えられた変更をサポートするために、PlayReady Web アプリを変更する方法について説明します。This section describes how to modify your PlayReady web app to support the changes made from the previous Windows 8.1 version to the Windows 10 version.

Internet Explorer で PlayReady メディア要素を使うと、開発者はコンテンツ プロバイダーが定義したアクセス ルールを適用しながら、ユーザーに PlayReady コンテンツを提供することのできる Web アプリを作成することができます。Using PlayReady media elements in Internet Explorer enables developers to create web apps capable of providing PlayReady content to the user while enforcing the access rules defined by the content provider. ここでは、HTML5 と JavaScript のみを使って、既存の Web アプリに PlayReady メディア要素を追加する方法について説明します。This section describes how to add PlayReady media elements to your existing web apps by using only HTML5 and JavaScript.

PlayReady の Encrypted Media Extension の新機能What's new in PlayReady Encrypted Media Extension

このセクションでは、Windows 10 で PlayReady コンテンツ保護を有効にするために PlayReady Encrypted Media Extension (EME) に加えられた変更を示します。This section provides a list of changes made to the PlayReady Encrypted Media Extension (EME) to enable PlayReady content protection on Windows 10.

次に、Windows 10 の PlayReady Encrypted Media Extension に関する新機能や変更点について説明します。The following list describes the new features and changes made to PlayReady Encrypted Media Extension for Windows 10:

  • 追加されたハードウェア デジタル著作権管理 (DRM)。Added hardware digital rights management (DRM).

    ハードウェア ベースのコンテンツ保護により、複数のデバイス プラットフォーム上で、高解像度 (HD) と超高解像度 (UHD) のコンテンツを安全に再生できます。Hardware-based content protection support enables secure playback of high definition (HD) and ultra-high definition (UHD) content on multiple device platforms. キー マテリアル (秘密キー、コンテンツ キー、これらのキーを派生またはロック解除するために使われるその他のキー マテリアルを含みます)、および暗号化解除された圧縮および非圧縮ビデオ サンプルは、ハードウェア セキュリティを利用して保護されます。Key material (including private keys, content keys, and any other key material used to derive or unlock said keys), and decrypted compressed and uncompressed video samples are protected by leveraging hardware security.

  • 永続的でないライセンスの事前の取得を提供します。Provides proactive acquisition of non-persistent licenses.

  • 1 つのメッセージで複数のライセンスを取得できるようにします。Provides acquisition of multiple licenses in one message.

    Windows 8.1 のように PlayReady オブジェクトと複数のキー識別子 (KeyID) を使うか、Content Decryption Model データ (CDMData) と複数の KeyID を使うことができます。You can either use a PlayReady object with multiple key identifiers (KeyIDs) as in Windows 8.1, or use content decryption model data (CDMData) with multiple KeyIDs.

    注意

    Windows 10 では、複数のキー識別子が CDMData の <KeyID> でサポートされます。In Windows 10, multiple key identifiers are supported under <KeyID> in CDMData.

  • リアルタイムの有効期限のサポートや期間限定ライセンス (LDL) が追加されました。Added real time expiration support, or limited duration license (LDL).

    ライセンスに対してリアルタイムの有効期限を設定することができます。Provides the ability to set real-time expiration on licenses.

  • HDCP Type 1 (バージョン 2.2) ポリシーのサポートを追加しました。Added HDCP Type 1 (version 2.2) policy support.

  • Miracast が暗黙的な出力となりました。Miracast is now implicit as an output.

  • セキュア ストップが追加されました。Added secure stop.

    セキュア ストップによって、特定のコンテンツについてのメディア再生が停止したメディア ストリーミング サービスに対して、PlayReady デバイスが確実にアサートするための手段が提供されます。Secure stop provides the means for a PlayReady device to confidently assert to a media streaming service that media playback has stopped for any given piece of content.

  • オーディオとビデオに関するライセンスの分離が追加されました。Added audio and video license separation.

    トラックを分離することによって、ビデオがオーディオにデコードされるのを防ぐことができます。これにより、さらに強力なコンテンツ保護が可能になります。Separate tracks prevent video from being decoded as audio; enabling more robust content protection. 最新の標準では、オーディオ トラックと映像トラックに対して別々のキーが必要になります。Emerging standards are requiring separate keys for audio and visual tracks.

  • MaxResDecode が追加されました。Added MaxResDecode.

    この機能は、コンテンツの再生を最大解像度に制限するために追加されました (ライセンスではなく、より強力なキーを所有している場合にも制限を受けます)。This feature was added to limit playback of content to a maximum resolution even when in possession of a more capable key (but not a license). これは、複数のストリーム サイズが 1 つのキーでエンコードされる状況をサポートします。It supports cases where multiple stream sizes are encoded with a single key.

PlayReady の Encrypted Media Extension のサポートEncrypted Media Extension support in PlayReady

このセクションでは、PlayReady でサポートされている W3C 暗号化メディア拡張機能のバージョンについて説明します。This section describes the version of the W3C Encrypted Media Extension supported by PlayReady.

Web アプリ用の PlayReady は、現在 2013 年 5 月 10 日付けの W3C Encrypted Media Extension (EME) 草案に準拠しています。PlayReady for Web Apps is currently bound to the W3C Encrypted Media Extension (EME) draft of May 10, 2013. このサポートは、将来のバージョンの Windows では更新された EME 仕様に合わせて変更されます。This support will be changed to the updated EME specification in future versions of Windows.

ハードウェア DRM の使用Use hardware DRM

このセクションでは、Web アプリで PlayReady ハードウェア DRM を使う方法と、保護されたコンテンツがハードウェア DRM をサポートしていない場合にそれを無効にする方法について説明します。This section describes how your web app can use PlayReady hardware DRM, and how to disable hardware DRM if the protected content does not support it.

PlayReady ハードウェア DRM を使うには、JavaScript Web アプリは、キー システム識別子 com.microsoft.playready.hardware と共に isTypeSupported EME メソッドを使って、ブラウザーから PlayReady ハードウェア DRM のサポートを照会する必要があります。To use PlayReady hardware DRM, your JavaScript web app should use the isTypeSupported EME method with a key system identifier of com.microsoft.playready.hardware to query for PlayReady hardware DRM support from the browser.

一部のコンテンツは、ハードウェア DRM ではサポートされない場合があります。Occasionally, some content is not supported in hardware DRM. Cocktail コンテンツがハードウェア DRM でサポートされることはありません。Cocktail コンテンツを再生する場合は、ハードウェア DRM を除外する必要があります。Cocktail content is never supported in hardware DRM; if you want to play cocktail content, you must opt out of hardware DRM. 一部のハードウェア DRM は HEVC をサポートしますが、サポートしないものもあります。HEVC コンテンツを再生したいが、ハードウェア DRM がサポートしていない場合も、これを除外してください。Some hardware DRM will support HEVC and some will not; if you want to play HEVC content and hardware DRM doesn’t support it, you will want to opt out as well.

注意

HEVC コンテンツがサポートされているかどうかを判断するには、com.microsoft.playready をインスタンス化した後で、PlayReadyStatics.CheckSupportedHardware メソッドを使います。To determine whether HEVC content is supported, after instantiating com.microsoft.playready, use the PlayReadyStatics.CheckSupportedHardware method.

Web アプリにセキュア ストップを追加するAdd secure stop to your web app

このセクションでは、Web アプリにセキュア ストップを追加する方法を説明します。This section describes how to add secure stop to your web app.

セキュア ストップによって、特定のコンテンツについてのメディア再生が停止したメディア ストリーミング サービスに対して、PlayReady デバイスが確実にアサートするための手段が提供されます。Secure stop provides the means for a PlayReady device to confidently assert to a media streaming service that media playback has stopped for any given piece of content. この機能により、メディア ストリーミング サービスは、特定のアカウントのさまざまなデバイスに対する使用制限を正しく適用し報告することができるようになります。This capability ensures your media streaming services provide accurate enforcement and reporting of usage limitations on different devices for a given account.

セキュア ストップのチャレンジを送信する主なシナリオが 2 つあります。There are two primary scenarios for sending a secure stop challenge:

  • コンテンツの最後に達したか、ユーザーがメディア プレゼンテーションを途中で停止したため、メディア プレゼンテーションが停止した場合。When the media presentation stops because end of content was reached or when the user stopped the media presentation somewhere in the middle.
  • (システムまたはアプリのクラッシュなどにより) 前回のセッションが予期せずに終了した場合。When the previous session ends unexpectedly (for example, due to a system or app crash). アプリは、起動時またはシャットダウン時に、未処理のセキュア ストップ セッションについて照会し、その他のメディア再生とは別にチャレンジを送信する必要があります。The app will need to query, either at startup or shutdown, for any outstanding secure stop sessions and send challenge(s) separate from any other media playback.

次の手順は、さまざまなシナリオでセキュア ストップを設定する方法について説明します。The following procedures describe how to set up secure stop for various scenarios.

プレゼンテーションの通常の終了時にセキュア ストップを設定するにはTo set up secure stop for a normal end of a presentation:

  1. 再生が開始する前に onEnded イベントを登録します。Register the onEnded event before playback starts.
  2. onEnded イベント ハンドラーは、ビデオ/オーディオ要素のオブジェクトから removeAttribute("src") を呼び出し、ソースを NULL に設定する必要があります。これにより、メディア ファンデーションをトリガーしてトポロジを終了し、暗号化解除機能を破棄して、停止状態を設定します。The onEnded event handler needs to call removeAttribute("src") from the video/audio element object to set the source to NULL which will trigger the media foundation to tear down the topology, destroy the decryptor(s), and set the stop state.
  3. ハンドラー内の CDM セッションのセキュア ストップを開始し、セキュア ストップ チャレンジをサーバーに送信して、現在は再生が停止したが、後でも実行できることを通知できます。You can start the secure stop CDM session inside the handler to send the secure stop challenge to the server to notify the playback has stopped at this time, but it can be done later as well.

ユーザーがページから移動したか、タブまたはブラウザーを閉じた場合にセキュア ストップを設定するにはTo set up secure stop if the user navigates away from the page or closes down the tab or browser:

  • 停止状態を記録するためにアプリの操作は必要ありません。自動的に記録されます。No app action is required to record the stop state; it will be recorded for you.

カスタム ページ コントロールまたはユーザーの操作 (カスタム ナビゲーション ボタンや、現在のプレゼンテーションを完了する前に新しいプレゼンテーションを開始するなど) のセキュア ストップを設定するにはTo set up secure stop for custom page controls or user actions (such as custom navigation buttons or starting a new presentation before the current presentation completed):

  • カスタム ユーザー アクションが発生すると、アプリは、ソースを NULL に設定する必要があります。これにより、メディア ファンデーションをトリガーして、トポロジを終了し、暗号化解除機能を破棄して、停止状態を設定します。When custom user action occurs, the app needs to set the source to NULL which will trigger the media foundation to tear down the topology, destroy the decryptor(s), and set the stop state.

次の例は、Web アプリでのセキュア ストップの使い方を示しています。The following example demonstrates how to use secure stop in your web app:

// JavaScript source code

var g_prkey = null;
var g_keySession = null;
var g_fUseSpecificSecureStopSessionID = false;
var g_encodedMeteringCert = 'Base64 encoded of your metering cert (aka publisher cert)';

// Note: g_encodedLASessionId is the CDM session ID of the proactive or reactive license acquisition 
//       that we want to initiate the secure stop process.
var g_encodedLASessionId = null;

function main()
{
    ...

    g_prkey = new MSMediaKeys("com.microsoft.playready");

    ...

    // add 'onended' event handler to the video element
    // Assume 'myvideo' is the ID of the video element
    var videoElement = document.getElementById("myvideo");
    videoElement.onended = function (e) { 

        //
        // Calling removeAttribute("src") will set the source to null
        // which will trigger the MF to tear down the topology, destroy the
        // decryptor(s) and set the stop state.  This is required in order
        // to set the stop state.
        //
        videoElement.removeAttribute("src");
        videoElement.load();

        onEndOfStream();
    };
}

function onEndOfStream()
{
    ...

    createSecureStopCDMSession();

    ...    
}

function createSecureStopCDMSession()
{
    try{    
        var targetMediaCodec = "video/mp4";
        var customData = "my custom data";

        var encodedSessionId = g_encodedLASessionId;
        if( !g_fUseSpecificSecureStopSessionID )
        {
            // Use "*" (wildcard) as the session ID to include all secure stop sessions
            // TODO: base64 encode "*" and place encoded result to encodedSessionId
        }

        var int8ArrayCDMdata = formatSecureStopCDMData( encodedSessionId, customData,  g_encodedMeteringCert );
        var emptyArrayofInitData = new Uint8Array();

        g_keySession = g_prkey.createSession(targetMediaCodec, emptyArrayofInitData, int8ArrayCDMdata);

        addPlayreadyKeyEventHandler();

    } catch( e )
    {
        // TODO: Handle exception
    }
}

function addPlayreadyKeyEventHandler()
{
    // add 'keymessage' eventhandler   
    g_keySession.addEventListener('mskeymessage', function (event) {

        // TODO: Get the keyMessage from event.message.buffer which contains the secure stop challenge
        //       The keyMessage format for the secure stop is similar to LA as below:
        //
        //            <PlayReadyKeyMessage type="SecureStop" >
        //              <SecureStop version="1.0" >
        //                <Challenge encoding="base64encoded">
        //                    secure stop challenge
        //                </Challenge>
        //                <HttpHeaders>
        //                    <HttpHeader>
        //                      <name>Content-Type</name>
        //                         <value>"content type data"</value>
        //                    </HttpHeader>
        //                    <HttpHeader>
        //                         <name>SOAPAction</name>
        //                         <value>soap action</value>
        //                     </HttpHeader>
        //                    ....
        //                </HttpHeaders>
        //              </SecureStop>
        //            </PlayReadyKeyMessage>
                
        // TODO: send the secure stop challenge to a server that handles the secure stop challenge

        // TODO: Receive and response and call event.target.Update() to proecess the response
    });
    
    // add 'keyerror' eventhandler
    g_keySession.addEventListener('mskeyerror', function (event) {
        var session = event.target;
        
        ...

        session.close();
    });
    
    // add 'keyadded' eventhandler
    g_keySession.addEventListener('mskeyadded', function (event) {
        
        var session = event.target;

        ...

        session.close();             
    });
}

/**
* desc@ formatSecureStopCDMData
*   generate playready CDMData
*   CDMData is in xml format:
*   <PlayReadyCDMData type="SecureStop">
*     <SecureStop version="1.0">
*       <SessionID>B64 encoded session ID</SessionID>
*       <CustomData>B64 encoded custom data</CustomData>
*       <ServerCert>B64 encoded server cert</ServerCert>
*     </SecureCert>
* </PlayReadyCDMData>        
*/
function formatSecureStopCDMData(encodedSessionId, customData, encodedPublisherCert) 
{
    var encodedCustomData = null;

    // TODO: base64 encode the custom data and place the encoded result to encodedCustomData

    var CDMDataStr = "<PlayReadyCDMData type=\"SecureStop\">" +
                     "<SecureStop version=\"1.0\" >" +
                     "<SessionID>" + encodedSessionId + "</SessionID>" +
                     "<CustomData>" + encodedCustomData + "</CustomData>" +
                     "<ServerCert>" + encodedPublisherCert + "</ServerCert>" +
                     "</SecureStop></PlayReadyCDMData>";
    
    var int8ArrayCDMdata = null

    // TODO: Convert CDMDataStr to Uint8 byte array and palce the converted result to int8ArrayCDMdata

    return int8ArrayCDMdata;
}

注意

上記のサンプルのセキュリティで保護された停止データは、 <SessionID>B64 encoded session ID</SessionID> アスタリスク () にすることができ * ます。これは、記録されたすべてのセキュリティ停止セッションのワイルドカードです。The secure stop data’s <SessionID>B64 encoded session ID</SessionID> in the sample above can be an asterisk (*), which is a wild card for all the secure stop sessions recorded. つまり、 SessionID タグは、特定のセッション、またはワイルドカード () を使用し * て、すべてのセキュリティで保護された停止セッションを選択できます。That is, the SessionID tag can be a specific session, or a wild card (*) to select all the secure stop sessions.

Encrypted Media Extension のプログラミングについての考慮事項Programming considerations for Encrypted Media Extension

このセクションでは、PlayReady 対応の Windows 10 用の Web アプリを作成するときに検討する必要があるプログラミングの考慮事項を示します。This section lists the programming considerations that you should take into account when creating your PlayReady-enabled web app for Windows 10.

アプリで作成した MSMediaKeys オブジェクトと MSMediaKeySession オブジェクトは、アプリが終了するまで有効なままである必要があります。The MSMediaKeys and MSMediaKeySession objects created by your app must be kept alive until your app closes. これらのオブジェクトが必ず有効な状態にとどまるようにする方法の 1 つは、それらをグローバル変数として割り当てることです (関数内でローカル変数宣言された場合、変数はスコープ外になり、ガベージ コレクションの対象になります)。One way of ensuring these objects stay alive is to assign them as global variables (the variables would become out of scope and subject to garbage collection if declared as a local variable inside of a function). たとえば、次のサンプルでは、変数 g _ msmediakeysg _ mediakeysession をグローバル変数として割り当てます。この変数は、関数の msmediakeys オブジェクトと msmediakeysession オブジェクトに割り当てられます。For example, the following sample assigns the variables g_msMediaKeys and g_mediaKeySession as global variables, which are then assigned to the MSMediaKeys and MSMediaKeySession objects in the function.

var g_msMediaKeys;
var g_mediaKeySession;

function foo() {
  ...
  g_msMediaKeys = new MSMediaKeys("com.microsoft.playready");
  ...
  g_mediaKeySession = g_msMediaKeys.createSession("video/mp4", intiData, null);
  g_mediaKeySession.addEventListener(this.KEYMESSAGE_EVENT, function (e) 
  {
    ...
    downloadPlayReadyKey(url, keyMessage, function (data) 
    {
      g_mediaKeySession.update(data);
    });
  });
  g_mediaKeySession.addEventListener(this.KEYADDED_EVENT, function () 
  {
    ...
    g_mediaKeySession.close();
    g_mediaKeySession = null;
  });
}

詳しくは、サンプル アプリケーションをご覧ください。For more information, see the sample applications.

関連項目See also