ExoPlayer משתמש ב-API MediaDrm של Android כדי לתמוך בהפעלה של תוכן שמוגן על ידי DRM.
בטבלה הבאה מפורטות גרסאות Android המינימליות שנדרשות לשיטות שונות של DRM, וגם פורמטי הסטרימינג שבהם הן נתמכות:
| סכמת DRM | מספר גרסה של Android | רמת ה-API ב-Android | פורמטים נתמכים |
|---|---|---|---|
| Widevine 'cenc' | 4.4 | 19 | DASH, HLS (FMP4 בלבד) |
| Widevine 'cbcs' | 7.1 | 25 | DASH, HLS (FMP4 בלבד) |
| ClearKey "cenc" | 5.0 | 21 | DASH |
| PlayReady SL2000 "cenc" | Android TV | Android TV | DASH, SmoothStreaming, HLS (FMP4 בלבד) |
כדי להפעיל תוכן שמוגן באמצעות DRM ב-ExoPlayer, צריך לציין את ה-UUID של מערכת ה-DRM כשיוצרים פריט מדיה, ואפשר לספק גם מאפיינים אחרים. לאחר מכן, נתוני המאפיינים האלה ישמשו את נגן המדיה כדי ליצור הטמעה של DrmSessionManager שמתאימה לרוב תרחישי השימוש. ההטמעה הזו נקראת DefaultDrmSessionManager. במקרים מסוימים, יכול להיות שיהיה צורך במאפייני DRM נוספים, כפי שמפורט בקטעים הבאים.
רוטציית מפתחות
כדי להפעיל סטרימינג עם מפתחות מתחלפים, מעבירים את true אל MediaItem.DrmConfiguration.Builder.setMultiSession כשיוצרים את פריט המדיה.
תוכן עם כמה מפתחות
תוכן עם כמה מפתחות מורכב מכמה סטרימינגים, שחלקם משתמשים במפתחות שונים מאחרים. אפשר להפעיל תוכן עם כמה מפתחות באחת משתי דרכים, בהתאם לאופן שבו שרת הרישיון מוגדר.
מקרה 1: שרת הרישיונות מגיב עם כל המפתחות של התוכן
במקרה כזה, שרת הרישיונות מוגדר כך שכשהוא מקבל בקשה למפתח אחד, הוא מגיב עם כל המפתחות של התוכן. המקרה הזה מטופל על ידי ExoPlayer בלי צורך בהגדרה מיוחדת. ההתאמה בין הסטרימינגים (למשל, סרטון באיכות SD וסרטון באיכות HD) חלקה גם אם נעשה בהם שימוש במפתחות שונים.
במקרים שבהם הדבר אפשרי, מומלץ להגדיר את שרת הרישיונות כך שיתנהג בצורה הזו. זו הדרך היעילה והאמינה ביותר לתמוך בהפעלה של תוכן עם כמה מפתחות, כי היא לא מחייבת את הלקוח לשלוח כמה בקשות לרישיון כדי לגשת לזרמים השונים.
מקרה 2: שרת הרישיונות מגיב רק עם המפתח המבוקש
במקרה הזה, שרת הרישיונות מוגדר להגיב רק עם המפתח שצוין בבקשה. כדי להפעיל תוכן עם כמה מפתחות באמצעות ההגדרה הזו של שרת רישיונות, צריך להעביר את הערך true אל MediaItem.DrmConfiguration.Builder.setMultiSession כשיוצרים את פריט המדיה.
אנחנו לא ממליצים להגדיר את שרת הרישיונות כך שיתנהג בצורה הזו. כדי להפעיל תוכן עם כמה מפתחות, צריך לשלוח בקשות רישיון נוספות, ולכן השיטה הזו פחות יעילה וחזקה מהשיטה החלופית שמתוארת למעלה.
מפתחות אופליין
כדי לטעון קבוצת מפתחות אופליין, צריך להעביר את מזהה קבוצת המפתחות אל MediaItem.DrmConfiguration.Builder.setKeySetId כשיוצרים את פריט המדיה.
כך אפשר להפעיל את התוכן באמצעות המפתחות שמאוחסנים בקבוצת המפתחות במצב אופליין עם המזהה שצוין.
סשנים של DRM לתוכן לא מוצפן
השימוש בפלייסהולדר DrmSessions מאפשר ל-ExoPlayer להשתמש באותם מפענחים לתוכן לא מוצפן כמו אלה שמשמשים להפעלת תוכן מוצפן. כשמדיה מכילה קטעים מוצפנים וגם קטעים לא מוצפנים, כדאי להשתמש ב-placeholder DrmSessions כדי להימנע מיצירה מחדש של פענוחים כשמתרחשים מעברים בין קטעים מוצפנים לקטעים לא מוצפנים. כדי להשתמש ב-placeholder DrmSessions עבור רצועות אודיו ווידאו, צריך להעביר את הערך true אל MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks כשיוצרים את פריט המדיה.
שימוש ב-DrmSessionManager מותאם אישית
אם אפליקציה רוצה להתאים אישית את DrmSessionManager שמשמש להפעלה, היא יכולה להטמיע DrmSessionManagerProvider ולהעביר אותו אל MediaSource.Factory שמשמש ליצירת הנגן. הספק יכול לבחור אם ליצור מופע חדש של מנהל בכל פעם או לא. כדי להשתמש תמיד באותו מופע:
Kotlin
val customDrmSessionManager: DrmSessionManager = CustomDrmSessionManager() // Pass a drm session manager provider to the media source factory. val mediaSourceFactory = DefaultMediaSourceFactory(context).setDrmSessionManagerProvider { customDrmSessionManager }
Java
DrmSessionManager customDrmSessionManager = new CustomDrmSessionManager(/* ... */ ); // Pass a drm session manager provider to the media source factory. MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setDrmSessionManagerProvider(mediaItem -> customDrmSessionManager);
שיפור ביצועי ההפעלה
אם אתם נתקלים בגימגום של סרטונים כשמפעילים תוכן שמוגן על ידי DRM במכשיר עם גרסה כלשהי של Android מ-Android 6.0 (רמת API 23) עד Android 11 (רמת API 30) כולל, אתם יכולים לנסות להפעיל תור מאגר אסינכרוני.