การผสานรวม ExoPlayer

เอกสารนี้ให้ภาพรวมเกี่ยวกับการรองรับการจัดคิวและการผสานรวม DRM

การเพิ่มประสิทธิภาพ DRM

เราได้ปรับปรุงการสาธิตการแคสต์ ExoPlayer ให้ใช้วิธีการแบบมีโครงสร้างในการส่งการกำหนดค่า 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;
  }
}

การตั้งค่าเบื้องต้น

คุณอาจต้องกำหนดค่า licenseRequestHandler และ mediaPlaybackInfoHandler โดยขึ้นอยู่กับโซลูชัน DRM ที่คุณใช้ licenseRequestHandler ให้คุณปรับแต่งวิธีที่ CAF ขอใบอนุญาตจากเซิร์ฟเวอร์คีย์ใบอนุญาต mediaPlaybackInfoHandler ช่วยให้คุณแก้ไข PlaybackConfig ได้ตามรายการสื่อ ในกรณีที่เนื้อหาแต่ละรายการต้องใช้ URL ของเซิร์ฟเวอร์ใบอนุญาตที่แตกต่างกัน เป็นต้น

หากต้องการบันทึกสำเนาของ ExoPlayerConfig จากออบเจ็กต์คำขอโหลดแต่ละรายการ ให้สร้างตัวตรวจจับคำขอโหลดในแอปพลิเคชัน SDK ของ Web Receiver

ขั้นตอนแรกคือการลงทะเบียนเครื่องจัดการก่อนที่จะเริ่มแอปพลิเคชัน 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 จะพยายามโหลดรายการสื่อ ที่สำคัญคือจะมีการเรียกใช้ก่อนตัวแฮนเดิลคำขอใบอนุญาตและเครื่องจัดการข้อมูลการเล่นสื่อ

ตัวตรวจจับคำขอโหลดจะส่งออบเจ็กต์ LoadRequestData ที่มีการกำหนดค่า Exo Player Config ที่แอปของคุณส่ง คุณบันทึกออบเจ็กต์นี้เป็นตัวแปรร่วมเพื่อใช้ในเครื่องจัดการคำขอใบอนุญาตและเครื่องจัดการข้อมูลการเล่นสื่อได้

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 ที่ WebReceiver ทำไปยังเซิร์ฟเวอร์ใบอนุญาตได้ เครื่องจัดการจะส่งผ่านออบเจ็กต์ NetworkRequestInfo ซึ่งคุณใช้เพื่อเพิ่มส่วนหัว HTTP รวมคุกกี้ หรือแก้ไข URL ได้ เครื่องจัดการควรส่งคืนออบเจ็กต์นี้

ตัวอย่างเช่น หากคุณต้องการเพิ่มส่วนหัวที่กำหนดเองในคำขอใบอนุญาต คุณอาจสร้างเครื่องจัดการคำขอใบอนุญาตที่มีลักษณะดังนี้

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

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

    return networkRequestInfo;
}

เครื่องจัดการข้อมูลการเล่นสื่อ

เครื่องจัดการข้อมูลการเล่นสื่อช่วยให้คุณเปลี่ยนแปลงการกำหนดค่าการเล่นของรายการสื่อแต่ละรายการได้ เครื่องจัดการจะส่งผ่าน LoadRequestData และ PlaybackConfig คุณควรส่งคืนการกำหนดค่าการเล่น ระบบจะเรียกเครื่องจัดการข้อมูลการเล่นสื่อก่อนที่แต่ละรายการที่คุณแคสต์จะโหลด หากมี 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 เพื่อให้แน่ใจว่าได้ติดตั้ง DRM ในแอปพลิเคชัน ExoPlayer และ Cast อย่างถูกต้อง

เว็บไซต์ของ ExoPlayer มีเอกสารประกอบและประกาศล่าสุด คุณสามารถรายงานปัญหาเกี่ยวกับ ExoPlayer และการผสานรวม Cast ได้ที่ที่เก็บ GitHub ของ ExoPlayer