В этом документе представлен обзор поддержки интеграции очередей и 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 из каждого объекта запроса загрузки, создайте перехватчик запроса загрузки в приложении 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 .