שילוב ExoPlayer

במאמר הזה מפורטת סקירה כללית של התמיכה בנושא תור ושילוב של ניהול זכויות דיגיטליות (DRM).

שיפורי DRM

הדגמת ההעברה של ExoPlayer עודכנה כדי להשתמש בדרך מובנית להעברת הגדרת DRM באמצעות ה-MediaInfo של ExoPlayer לאפליקציה המקבלת. דוגמת ההעברה כוללת גם מקלט הדגמה (דמו) שכולל את אותו הקוד בסקירה הכללית הזו, כדי שתוכלו לבדוק את התמיכה ב-DRM. עם זאת, אם אתם רוצים להעביר תוכן המוגן באמצעות DRM, עליכם ליצור ולארח Web Receiver משלכם.

לפני כן, כדאי להכיר את מסמכי התיעוד בנושא התמיכה בניהול זכויות דיגיטליות (DRM) ב-Google Cast וב-ExoPlayer. בסקירה הכללית הזו נסביר איך לחבר את תצורת ה-DRM של ExoPlayer למקלט אינטרנט. למידע על השימוש ב-DRM ב-ExoPlayer, אפשר לבקר באתר הרשמי של ExoPlayer.

מתן תצורת DRM

אפליקציית ההדגמה של ExoPlayer מכילה קוד לדוגמה שמראה איך לספק הגדרת DRM כחלק מ-MediaItem. ארבע האפשרויות שניתן להגדיר הן:

  • Headers – מילון של כותרות שמוחל על בקשת ה-HTTPS כדי לאחזר את רישיון ה-DRM.
  • כתובת ה-URL של הרישיון – כתובת ה-URL ששימשה לקבלת הרישיון.
  • Protection System – סכמת ההגנה על 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.

השלב הראשון הוא לרשום את ה-handlers לפני שמפעילים את אפליקציית ההעברה.

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});

טעינת הכלי ליירוט בקשות

הכלי ליירוט בקשות טעינה הוא קריאה חוזרת (callback) שמאפשרת להציג ולשנות את בקשת הטעינה של Cast לפני ש-CAF מנסה לטעון פריט מדיה. חשוב מכך, הוא נקרא לפני הגורם המטפל בבקשת הרישיון וה-handler של המידע של הפעלת המדיה.

מיירט בקשות הטעינה מועבר אובייקט LoadRequestData שמכיל את Exo Player Config שנשלח על ידי האפליקציה. אפשר לשמור את האובייקט הזה כמשתנה גלובלי לשימוש ב-handler של בקשות הרישיון וב-handler למידע על הפעלת מדיה.

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;
}

handler של בקשת רישיון

הגורם המטפל בבקשת הרישיון מאפשר לכם להתאים אישית את בקשת ה-HTTPS שמקבל האינטרנט שולח לשרת הרישיונות שלכם. ה-handler מעביר אובייקט NetworkRequestInfo, שבאמצעותו אפשר להוסיף כותרות HTTP, לכלול קובצי cookie ואפילו לשנות את כתובת ה-URL. ה-handler צריך להחזיר את האובייקט הזה.

אם, למשל, צריך להוסיף כותרות מותאמות אישית לבקשת הרישיון, תוכלו ליצור handler של בקשת רישיון באופן הבא:

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

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

    return networkRequestInfo;
}

handler של מידע להפעלת מדיה

ה-handler של פרטי ההפעלה של המדיה מאפשר לבצע שינויים בהגדרות ההפעלה על בסיס כל פריט מדיה בנפרד. ה-handler מעביר LoadRequestData ו-PlaybackConfig, וצריך להחזיר את הגדרת ההפעלה. ה-handler של פרטי הפעלת מדיה יופעל לפני טעינת כל פריט ש-Cast נטען. אם היו לכם כתובות 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 ובשילוב ההעברה שלו במאגר GitHub של ExoPlayer.