Интеграция ExoPlayer

В этом документе представлен обзор поддержки интеграции очередей и DRM.

Улучшения DRM

Демонстрация ExoPlayer Cast была обновлена, чтобы использовать структурированный способ передачи конфигурации DRM с использованием MediaInfo ExoPlayer в приложение-получатель. В примере Cast также используется демонстрационный приемник, включающий тот же код, что и в этом обзоре, что позволяет протестировать поддержку DRM. Однако если вы хотите транслировать контент, защищенный DRM, вам следует создать и разместить собственный веб-приемник .

Прежде чем начать, было бы полезно ознакомиться с документацией по поддержке DRM в Google Cast и ExoPlayer . В этом обзоре показано, как подключить конфигурацию DRM ExoPlayer к веб-приемнику. Информацию о том, как использовать DRM в ExoPlayer, см. на официальном сайте ExoPlayer .

Предоставление конфигурации DRM

Демо-приложение ExoPlayer содержит пример кода, показывающий, как предоставить конфигурацию DRM как часть MediaItem. Вы можете настроить следующие четыре параметра:

  • Заголовки — словарь заголовков, которые применяются к HTTPS-запросу на получение лицензии DRM.
  • URL-адрес лицензии — URL-адрес, используемый для получения лицензии.
  • Система защиты — схема защиты DRM, используемая для защиты контента, например Widevine.

Конфигурация DRM, которую вы предоставляете ExoPlayer, отправляется в приложение-получатель как свойство в customData объекта MediaInformation как часть запроса на загрузку. По умолчанию это свойство называется exoPlayerConfig , что соответствует следующему определению.

/**
 * Extended configuration settings for ExoPlayer.
 */

ExoPlayerConfig class {
   constructor
() {
   
/**
     * Dictionary of headers to apply to the license request.
     * @type {!Object|undefined}
     */

   
this.headers;

   
/**
     * The URL for your DRM server.
     * @type {string|undefined}
     */

   
this.licenseUrl;

   
/**
     * Preferred protection system to use for decrypting content.
     * @type {!cast.framework.ContentProtection|undefined}
     */

   
this.protectionSystem;

   
/**
     * Indicates whether CORS Access-Control requests should be made using
     * credentials such as cookies or authorization headers.
     *
     * If withCredentials is set to true then Access-Control-Allow-Origin cannot
     * be set to '*'.
     * @type {boolean|undefined}
     */

   
this.withCredentials;
 
}
}

Первоначальная настройка

В зависимости от используемого вами решения DRM вам может потребоваться настроить licenseRequestHandler и mediaPlaybackInfoHandler . licenseRequestHandler позволяет вам настроить способ запроса CAF лицензии с вашего сервера лицензионных ключей. mediaPlaybackInfoHandler позволяет изменять PlaybackConfig для каждого элемента мультимедиа, если, например, каждый фрагмент контента должен использовать другой URL-адрес сервера лицензий.

Чтобы получить копию ExoPlayerConfig из каждого объекта запроса на загрузку, создайте перехватчик запроса на загрузку в приложении Web Receiver SDK.

Первым шагом является регистрация обработчиков перед запуском приложения Cast.

const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();

playbackConfig
.licenseRequestHandler =
    licenseRequestHandler
;
context
.getPlayerManager().setMediaPlaybackInfoHandler(
    mediaPlaybackInfoHandler
);
context
.getPlayerManager().setMessageInterceptor(
    cast
.framework.messages.MessageType.LOAD,
    loadInterceptor
);

// starts the Cast application
context
.start({playbackConfig: playbackConfig});

Перехватчик запросов загрузки

Перехватчик запроса загрузки — это обратный вызов, который позволяет просматривать и изменять запрос загрузки Cast до того, как CAF попытается загрузить элемент мультимедиа. Важно отметить, что он вызывается перед обработчиком запроса лицензии и обработчиком информации о воспроизведении мультимедиа.

Перехватчику запроса загрузки передается объект LoadRequestData , содержащий конфигурацию Exo Player, отправленную вашим приложением. Вы можете сохранить этот объект как глобальную переменную для использования в обработчике запроса лицензии и обработчике информации о воспроизведении мультимедиа.

loadInterceptor(loadRequestData) {
   
// not every load request will have a customData object
   
if (loadRequestData.media && loadRequestData.media.customData &&
            loadRequestData
.media.customData['exoPlayerConfig']) {
       
// exoPlayerConfig is a global variable here
        exoPlayerConfig
=
                loadRequestData
.media.customData['exoPlayerConfig'];
   
}

   
// you must return the loadRequestData object
   
return loadRequestData;
}

Обработчик запроса лицензии

Обработчик запросов лицензии позволяет вам настроить запросы HTTPS, которые веб-приемник отправляет вашему серверу лицензий. Обработчику передается объект NetworkRequestInfo , который затем можно использовать для добавления заголовков HTTP, включения файлов cookie или даже изменения URL-адреса. Обработчик должен вернуть этот объект.

Если, например, вам нужно добавить собственные заголовки в запрос на лицензию, вы можете создать обработчик запроса на лицензию, подобный этому:

licenseRequestHandler(networkRequestInfo) {
   
if (!exoPlayerConfig) {
       
return networkRequestInfo;
   
}

    networkRequestInfo
.headers =
            exoPlayerConfig
.headers ? exoPlayerConfig.headers : undefined;

   
return networkRequestInfo;
}

Обработчик информации о воспроизведении мультимедиа

Обработчик информации о воспроизведении мультимедиа позволяет вам вносить изменения в конфигурацию воспроизведения для каждого медиа-элемента. Обработчику передаются LoadRequestData и PlaybackConfig , вы должны вернуть конфигурацию воспроизведения. Обработчик информации о воспроизведении мультимедиа будет вызываться перед загрузкой каждого транслируемого элемента. Если у вас есть URL-адреса лицензий для каждого контента, вы можете изменить их и систему защиты перед загрузкой.

mediaPlaybackInfoHandler(loadRequest, playbackConfig) {
   
if (!exoPlayerConfig) {
       
return;
   
}

    playbackConfig
.licenseUrl = exoPlayerConfig.licenseUrl ?
            exoPlayerConfig
.licenseUrl :
           
undefined;
    playbackConfig
.protectionSystem = exoPlayerConfig.protectionSystem ?
            exoPlayerConfig
.protectionSystem :
           
undefined;

   
return playbackConfig;
}

Дополнительные ресурсы

Каждая реализация DRM индивидуальна, и этот код предоставляется только в качестве демонстрации. Вам следует проконсультироваться со своим поставщиком DRM, чтобы убедиться, что вы правильно внедрили DRM в своих приложениях ExoPlayer и Cast.

На веб-сайте ExoPlayer представлена ​​актуальная документация и объявления. О проблемах с ExoPlayer и его интеграцией Cast можно сообщить в репозитории ExoPlayer на GitHub .