Интеграция 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 .