ExoPlayer 통합

이 문서에서는 현재 재생목록 및 DRM 통합 지원에 관해 간략하게 설명합니다.

DRM 강화

ExoPlayer 전송 데모는 ExoPlayer의 MediaInfo를 사용하여 DRM 구성을 수신기 애플리케이션에 전달하는 구조화된 방법을 활용하도록 업데이트되었습니다. Cast 샘플은 이 개요와 동일한 코드가 포함된 데모 수신기도 사용하므로 DRM 지원을 테스트할 수 있습니다. 하지만 DRM으로 보호된 콘텐츠를 전송하려면 자체 웹 수신기를 빌드하고 호스팅해야 합니다.

시작하기 전에 Google CastExoPlayer의 DRM 지원 문서를 숙지하면 도움이 됩니다. 이 개요에서는 ExoPlayer DRM 구성을 웹 수신기에 연결하는 방법을 보여줍니다. ExoPlayer에서 DRM을 활용하는 방법에 관한 자세한 내용은 공식 ExoPlayer 웹사이트를 참고하세요.

DRM 구성 제공

ExoPlayer 데모 앱에는 MediaItem의 일부로 DRM 구성을 제공하는 방법을 보여주는 샘플 코드가 포함되어 있습니다. 다음과 같은 네 가지 옵션을 구성할 수 있습니다.

  • 헤더 - DRM 라이선스를 검색하기 위해 HTTPS 요청에 적용되는 헤더 사전.
  • 라이선스 URL - 라이선스를 취득하는 데 사용되는 URL입니다.
  • 보호 시스템 - 콘텐츠를 보호하는 데 사용되는 DRM 보호 체계(예: Widevine)

ExoPlayer에 제공하는 DRM 구성은 로드 요청의 일부로 MediaInformation 객체의 customData에 있는 속성으로 수신기 애플리케이션에 전송됩니다. 기본적으로 이 속성의 이름은 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 솔루션에 따라 licenseRequestHandlermediaPlaybackInfoHandler을 구성해야 할 수 있습니다. licenseRequestHandler를 사용하면 CAF가 라이선스 키 서버에서 라이선스를 요청하는 방법을 맞춤설정할 수 있습니다. 예를 들어 각 콘텐츠가 다른 라이선스 서버 URL을 사용해야 하는 경우 mediaPlaybackInfoHandler를 사용하면 미디어 항목별로 PlaybackConfig를 수정할 수 있습니다.

각 로드 요청 객체에서 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});

로드 요청 인터셉터

로드 요청 인터셉터는 CAF에서 미디어 항목을 로드하려고 시도하기 전에 전송 로드 요청을 보고 수정할 수 있는 콜백입니다. 중요한 점은 라이선스 요청 핸들러와 미디어 재생 정보 핸들러 이전에 호출됩니다.

앱에서 보낸 Exo 플레이어 구성이 포함된 LoadRequestData 객체가 로드 요청 인터셉터에 전달됩니다. 이 객체를 라이선스 요청 핸들러와 미디어 재생 정보 핸들러에서 사용할 전역 변수로 저장할 수 있습니다.

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 헤더를 추가하거나 쿠키를 포함하거나 URL을 수정할 수도 있습니다. 핸들러는 이 객체를 반환해야 합니다.

예를 들어 라이선스 요청에 커스텀 헤더를 추가해야 한다면 다음과 같은 라이선스 요청 핸들러를 만들 수 있습니다.

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

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

    return networkRequestInfo;
}

미디어 재생 정보 핸들러

미디어 재생 정보 핸들러를 사용하면 미디어 항목별로 재생 구성을 변경할 수 있습니다. 핸들러에 LoadRequestDataPlaybackConfig가 전달되면 재생 구성을 반환해야 합니다. 미디어 재생 정보 핸들러는 Cast가 각각 로드되기 전에 호출됩니다. 콘텐츠별 라이선스 URL이 있는 경우 로드 전에 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 제공업체에 문의하여 ExoPlayer 및 Cast 애플리케이션에 DRM을 올바르게 구현했는지 확인해야 합니다.

ExoPlayer의 웹사이트에서는 최신 문서 및 공지사항을 제공합니다. ExoPlayer 및 Cast 통합 관련 문제는 ExoPlayer의 GitHub 저장소에 신고할 수 있습니다.