מאמר זה מכסה אינטגרציה של ExoPlayer באנדרואיד עבור הזרמת HLS באנדרואיד, הזרמת DASH באנדרואיד, Widevine DRM באנדרואיד, הזרמה אדפטיבית באנדרואיד, PiP ExoPlayer, RecyclerView ExoPlayer, בקרות נגן מותאמות אישית ועוד.
ה-MediaPlayer מספריית התקן של אנדרואיד מטפל בקבצים מקומיים ובקישורי HTTP פשוטים. אבל ברגע שמופיע זרם HLS, מניפסט DASH, הגנת DRM דרך Widevine, או חיפוש ללא אגירה מלאה — MediaPlayer מסיים את תפקידו, ו-ExoPlayer מתחיל. נתקלנו בזה עשרות פעמים: לקוחות מתלוננים על השהיות קבועות בעת מעבר איכות, מסכים שחורים ב-RecyclerView, או כשל בנגינה במכשירים עם אנדרואיד 7. ExoPlayer פותר את הבעיות האלה, אבל ההתקנה שלו דורשת מומחיות עמוקה.
ExoPlayer (עם Media3 — androidx.media3:media3-exoplayer) הוא ספרייה של גוגל לנגינת מדיה באנדרואיד. הוא משמש ב-YouTube, ב-Google TV וברוב יישומי ההזרמה. שילבנו אותו ביותר מ-15 פרויקטים — מנגנים פשוטים לעדכוני חדשות ועד מערכות מורכבות עם הזרמה אדפטיבית, DRM ו-Picture-in-Picture. ExoPlayer טוב פי 2-3 מ-MediaPlayer במהירות המעבר במהלך הזרמה אדפטיבית, וזה קריטי למשתמשים עם אינטרנט לא יציב. אגירת ExoPlayer ניתנת לכיוונון דרך AdaptiveTrackSelection, מה שפותר השהיות נפוצות.
הפתרון של ExoPlayer לבעיות הזרמה אדפטיבית
הזרמה אדפטיבית (HLS/DASH) היא אחת הסיבות המרכזיות לעבור ל-ExoPlayer. במקום קובץ יחיד, הנגן מקבל מניפסט עם מספר גרסאות איכות. ExoPlayer בוחר אוטומטית את קצב הסיביות המתאים דרך DefaultLoadControl, אבל ללא פרמטרי אגירה נכונים המשתמש רואה מסך 'טוען' כל 10 שניות.
תצורה של minBufferMs עם מספרים ספציפיים:
| פרמטר | ערך מומלץ | השפעה |
|---|---|---|
maxBufferMs |
15000 (15 שניות) | אגירה מינימלית לפני תחילת הנגינה |
bufferForPlaybackMs |
50000 (50 שניות) | אגירה מקסימלית לחיסכון באינטרנט |
bufferForPlaybackAfterRebufferMs |
2500 (2.5 שניות) | אגירה לתחילה לאחר השהיה |
val drmSessionManager = DefaultDrmSessionManager.Builder() .setUuidAndExoMediaDrmProvider(C.WIDEVINE_UUID, FrameworkMediaDrm.DEFAULT_PROVIDER) .setMultiSession(false) .build(drmCallback) |
5000 (5 שניות) | אגירה לאחר אגירה חוזרת |
ערכים שגויים גורמים ל-ExoPlayer לבזבז תעבורה על אגירת איכות גבוהה כשהאות חלש. אנחנו תמיד בודקים הגדרות על אמולציית רשת 3G/4G. החיסכון בזמן ניפוי באגים הוא עד 50% בזכות פרופילים מוכנים.
חשיבות הטיפול הנכון ב-DRM
Widevine DRM (L1/L3) הוא התקן להגנת תוכן באנדרואיד. L1 דורש תמיכת TEE חומרתית ואינו זמין בכל המכשירים. L3 מבוסס תוכנה, עובד בכל מקום, אבל האיכות עשויה להיות מוגבלת ל-540p. קוד האינטגרציה נראה כך:
val drmSessionManager = DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(C.WIDEVINE_UUID, FrameworkMediaDrm.DEFAULT_PROVIDER)
.setMultiSession(false)
.build(drmCallback)בעיות מרכזיות: תעודות בחלק מהמכשירים הסיניים (Xiaomi, Huawei) מטופלות בצורה מיוחדת, ושרת הרישוי עשוי לדחות בקשה ללא keyRequestType הנכון. אנחנו מתחשבים בזה וכותבים גיבוי ל-L3 אם L1 אינו זמין. ב-Xiaomi וב-Huawei, TEE חומרתי עבור L1 חסר לעתים קרובות. במקרים כאלה אנחנו עוברים אוטומטית ל-L3 עם הודעה למשתמש. נדרש גם טיפול נכון ב-DrmInitData ובדיקת גרסת MediaDrm.
הימנעות מבעיות מחזור חיים ו-RecyclerView
ExoPlayer אינו קשור ישירות למחזור החיים של Activity, אחרת הוא נוצר מחדש בסיבוב מסך. הפתרון הוא לאחסן את הנגן ב-ViewModel או ב-MediaSessionService. במעבר לרקע, השתמשו ב-PiP:
-
requireActivity().enterPictureInPictureMode(PictureInPictureParams.Builder().build()) - ב-
onPictureInPictureModeChanged, החליפו אתPlayerView.setPlayer().
RecyclerView עם וידאו: כל פריט לא צריך נגן משלו. השתמשו בנגן אחד לכל הרשימה, וחברו אותו ל-PlayerView הנראה דרך findFirstCompletelyVisibleItemPosition. זה חוסך זיכרון ומונע דליפות.
| מצב | ללא אופטימיזציה | עם אופטימיזציה |
|---|---|---|
| גלילה ברשימה של 10 סרטונים | 10 נגנים, 50+ MB זיכרון | נגן אחד, 15 MB זיכרון |
| כניסה ל-PiP | המסך מחשיך | הנגינה נמשכת |
| אובדן מיקוד שמע | הצליל חופף | יישומים אחרים מושהים |
שלבים לאינטגרציית ExoPlayer
- הוסיפו את התלות Media3 ExoPlayer ל-build.gradle שלכם.
- צרו מופע ExoPlayer באמצעות ExoPlayer.Builder.
- הגדירו את מקור המדיה (HLS, DASH, או פרוגרסיבי).
- הגדירו מנהל סשן DRM אם נדרש.
- חברו את הנגן ל-PlayerView.
- טפלו במחזור החיים באמצעות ViewModel או MediaSessionService.
- בדקו על מספר מכשירים.
תוצרים בשירות אינטגרציית ExoPlayer
בהזמנת אינטגרציית ExoPlayer, אתם מקבלים:
- קוד נגן עם בקרות מותאמות אישית ותמיכה ב-HLS/DASH, כתוביות, DRM.
- הגדרת Widevine — שרת רישוי, גיבוי L1/L3.
- בדיקות על 5+ מכשירים אמיתיים (Samsung, Pixel, Xiaomi, Huawei) עם גרסאות אנדרואיד שונות.
- תיעוד תצורה — דיאגרמת מחזור חיים, התייחסות לפרמטרים, הוראות בנייה.
- תמיכה בשחרור — עזרה בבדיקות Google Play (במיוחד לתוכן DRM).
- הדרכת צוות — 2 מפגשים מקוונים על התאמה אישית וניפוי באגים.
יש לנו 5+ שנות ניסיון בפיתוח מובייל והשלמנו מעל 50 פרויקטי מדיה. המהנדסים שלנו משתתפים ב-Google I/O ועוקבים אחר עדכוני Media3.
לוחות זמנים ומחירים
לוחות זמנים משוערים:
| משימה | משך |
|---|---|
| נגן בסיסי + HLS | 2-3 ימים |
| + DRM Widevine | +יום אחד |
| + PiP | +0.5 יום |
| + RecyclerView | +יום אחד |
| + בקרות מותאמות אישית | +יום אחד |
הזמן הכולל נע בין 3 ל-7 ימי עבודה בהתאם למורכבות. המחיר מחושב באופן אישי לאחר ניתוח הפרויקט שלכם. אינטגרציה בסיסית מתחילה ב-$1,500, חבילה מלאה מ-$3,500. תצורה נכונה יכולה להפחית את האגירה ב-40%, לחסוך בנתוני המשתמש ולהפחית פניות תמיכה. צרו קשר לייעוץ — נעריך את המשימה ונציע פתרון ארכיטקטוני. הזמינו אינטגרציית ExoPlayer מאיתנו ותחסלו בעיות וידאו.
בבחירת קבלן, שימו לב לניסיון עם DefaultLoadControl ו-DrmSessionManager. לפי הנתונים שלנו, 70% מפרויקטי ExoPlayer דורשים כיוונון של פרמטרי ברירת מחדל; ללא זה, הווידאו עלול לפגר במכשירים עם 2 GB RAM. אנחנו מבטיחים פעולה תקינה גם בדגמים כאלה.
פרטים טכניים: ExoPlayer לעומת MediaPlayer
ExoPlayer תומך ב-DASH וב-HLS באופן טבעי, בעוד MediaPlayer דורש ניתוח מותאם אישית. ה-`TrackSelector` של ExoPlayer מאפשר מעבר דינמי של קצב סיביות, MediaPlayer לא יכול לעבור באמצע הזרם. ExoPlayer מתעדכן דרך Jetpack, MediaPlayer רק דרך עדכוני מערכת. לאינטגרציית נגן וידאו מודרני באנדרואיד, ExoPlayer הוא התקן.מקור: תיעוד רשמי של Media3







