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