Поделиться через


Расширение мультимедиа PlayReady Encrypted

В этом разделе описывается изменение веб-приложения PlayReady для поддержки изменений, внесенных в предыдущую версию Windows 8.1 на версию Windows 10.

Использование элементов мультимедиа PlayReady в Internet Explorer позволяет разработчикам создавать веб-приложения, способные предоставлять пользователю содержимое PlayReady при применении правил доступа, определенных поставщиком контента. В этом разделе описывается, как добавить элементы мультимедиа PlayReady в существующие веб-приложения с помощью только HTML5 и JavaScript.

Новые возможности расширения мультимедиа PlayReady Encrypted

В этом разделе представлен список изменений, внесенных в расширение мультимедиа PlayReady Encrypted (EME), чтобы включить защиту содержимого PlayReady в Windows 10.

В следующем списке описываются новые функции и изменения, внесенные в расширение мультимедиа PlayReady Encrypted для Windows 10:

  • Добавлено аппаратное управление цифровыми правами (DRM).

    Поддержка защиты содержимого на основе оборудования обеспечивает безопасное воспроизведение содержимого с высоким определением (HD) и ультра-высоким определением (UHD) на нескольких платформах устройств. Материалы ключей (включая закрытые ключи, ключи содержимого и любые другие ключевые материалы, используемые для получения или разблокировки указанных ключей), а расшифрованные сжатые и несжатые примеры видео защищены с помощью аппаратной безопасности.

  • Обеспечивает упреждающее приобретение непрекращающихся лицензий.

  • Предоставляет получение нескольких лицензий в одном сообщении.

    Можно использовать объект PlayReady с несколькими идентификаторами ключей (KeyID), как в Windows 8.1, или использовать данные модели расшифровки содержимого (CDMData) с несколькими ключами.

    Примечание.

    В Windows 10 несколько идентификаторов ключей поддерживаются в <KeyID> в CDMData.

  • Добавлена поддержка срока действия в режиме реального времени или ограниченная лицензия на срок действия (LDL).

    Предоставляет возможность задать срок действия лицензий в режиме реального времени.

  • Добавлена поддержка политики HDCP Типа 1 (версия 2.2).

  • Miracast теперь неявно является выходным.

  • Добавлена безопасная остановка.

    Безопасная остановка предоставляет средства для устройства PlayReady, чтобы уверенно утверждать в службе потоковой передачи мультимедиа, что воспроизведение мультимедиа остановлено для любого заданного содержимого.

  • Добавлено разделение лицензий на аудио и видео.

    Отдельные треки предотвращают декодирование видео в виде звука; включение более надежной защиты содержимого. Новые стандарты требуют отдельных ключей для звуковых и визуальных треков.

  • Добавлен MaxResDecode.

    Эта функция была добавлена, чтобы ограничить воспроизведение содержимого максимальным разрешением, даже если имеется более способный ключ (но не лицензия). Он поддерживает случаи, когда несколько размеров потока кодируются одним ключом.

Поддержка расширения зашифрованного носителя в PlayReady

В этом разделе описывается версия расширения зашифрованного носителя W3C, поддерживаемого PlayReady.

PlayReady для веб-приложения в настоящее время привязан к черновику расширения зашифрованного носителя W3C (EME) 10 мая 2013 года. Эта поддержка будет изменена на обновленную спецификацию EME в будущих версиях Windows.

Использование аппаратного DRM

В этом разделе описывается, как веб-приложение может использовать аппаратный DRM PlayReady и как отключить аппаратный DRM, если защищенное содержимое не поддерживает его.

Чтобы использовать аппаратный DRM PlayReady, веб-приложение JavaScript должно использовать метод isTypeSupported EME с ключевым идентификатором com.microsoft.playready.hardware системы для запроса поддержки аппаратного DRM PlayReady из браузера.

Иногда некоторые содержимое не поддерживается в аппаратном drM. Содержимое коктейля никогда не поддерживается в аппаратном DRM; Если вы хотите воспроизвести содержимое коктейля, необходимо отказаться от аппаратного DRM. Некоторые аппаратные drM поддерживают HEVC, и некоторые не будут; Если вы хотите воспроизвести содержимое HEVC и оборудование DRM не поддерживает его, вы также захотите отказаться.

Примечание.

Чтобы определить, поддерживается ли содержимое HEVC после создания экземпляра com.microsoft.playready, используйте метод PlayReadyStatics.CheckSupportedHardware .

Добавление безопасной остановки в веб-приложение

В этом разделе описывается, как добавить безопасную остановку в веб-приложение.

Безопасная остановка предоставляет средства для устройства PlayReady, чтобы уверенно утверждать в службе потоковой передачи мультимедиа, что воспроизведение мультимедиа остановлено для любого заданного содержимого. Эта возможность гарантирует, что службы потоковой передачи мультимедиа обеспечивают точное применение и отчеты об ограничениях использования на разных устройствах для данной учетной записи.

Существует два основных сценария отправки задачи безопасной остановки.

  • Когда презентация мультимедиа останавливается из-за достижения конца содержимого или когда пользователь остановил презентацию мультимедиа где-то в середине.
  • Когда предыдущий сеанс неожиданно завершается (например, из-за сбоя системы или приложения). Приложению потребуется запрашивать запросы при запуске или завершении работы для любых незадающихся сеансов безопасной остановки и отправки вызовов отдельно от любого другого воспроизведения мультимедиа.

В следующих процедурах описывается настройка безопасной остановки для различных сценариев.

Чтобы настроить безопасную остановку для обычного конца презентации, выполните приведенные ниже действия.

  1. Зарегистрируйте событие onEnded перед началом воспроизведения.
  2. Обработчик событий onEnded должен вызываться removeAttribute("src") из объекта элемента видео/аудио, чтобы задать источнику значение NULL , которое активирует основу мультимедиа для удаления топологии, уничтожения расшифровки и установки состояния остановки.
  3. Вы можете запустить сеанс CDM безопасной остановки внутри обработчика, чтобы отправить вызов безопасной остановки на сервер, чтобы уведомить воспроизведение остановлено в это время, но это можно сделать позже.

Чтобы настроить безопасную остановку, если пользователь переходит от страницы или закрывает вкладку или браузер:

  • Для записи состояния остановки не требуется никаких действий приложения; он будет записан для вас.

Чтобы настроить безопасную остановку для пользовательских элементов управления страницами или действий пользователей (например, пользовательских кнопок навигации или запуска новой презентации до завершения текущей презентации):

  • Когда происходит пользовательское действие пользователя, приложение должно задать источнику значение NULL , которое активирует основу мультимедиа для удаления топологии, уничтожения расшифровки и установки состояния остановки.

В следующем примере показано, как использовать безопасную остановку в веб-приложении:

// 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 process 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> . То есть тег SessionID может быть определенным сеансом или подстановочной карточкой (*), чтобы выбрать все сеансы безопасной остановки.

Рекомендации по программированию для расширения зашифрованных носителей

В этом разделе перечислены рекомендации по программированию, которые следует учитывать при создании веб-приложения с поддержкой PlayReady для Windows 10.

Объекты MSMediaKeys и MSMediaKeySession, созданные приложением, должны оставаться в живых до закрытия приложения. Один из способов обеспечения активности этих объектов заключается в назначении их в качестве глобальных переменных (переменные становятся вне области и подвергаются сборке мусора, если они объявлены как локальная переменная внутри функции). Например, следующий пример назначает переменные g_msMediaKeys и g_mediaKeySession в качестве глобальных переменных, которые затем назначаются объектам MSMediaKeys и MSMediaKeySession в функции.

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;
  });
}

Дополнительные сведения см. в примерах приложений.

См. также