הזרמת אודיו למובייל: בופרינג, קאשינג והשמעה ברקע

משתמשים מצפים שהשמע באפליקציה ימשיך לנגן גם כשהם ממזערים אותה או נועלים את המסך, אך ביצוע טכני של זה הוא מורכב. אנחנו בונים ניגון סטרימינג לאנדרואיד ו-iOS שעובד בצורה אמינה ברקע ונשאר מסונכרן עם הממשק. הצוות שלנו מספק את הפרויקט במפתח מלא—מבחירת הנגן ועד לשמירה במטמון ולתמיכה—ומבטיח ביצועים אמינים ללא פשרות על לוחות זמנים.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
הזרמת אודיו למובייל: בופרינג, קאשינג והשמעה ברקע
בינוני
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

לעתים קרובות אנו נתקלים בפרויקטים שבהם משתמשים רוצים להאזין לרדיו, פודקאסטים או מוזיקה ברקע, לעבור בין אפליקציות, ולא לאבד את המיקום שלהם. האתגר הטכני העיקרי הוא שהנגן חייב לשרוד יציאה וחזרה לאפליקציה ללא טעינה מחדש, ולהישאר מסונכרן עם ממשק המשתמש. לדוגמה, בפרויקט רדיו אינטרנטי אחד, הדרישה הייתה שאחרי 10 מעברים בין אפליקציות, ההשמעה תמשיך ללא תקלות, ובקרות המדיה במסך הנעילה יתעדכנו באופן מיידי. במאמר זה, אנו צוללים לפרטים טכניים: מבחירת נגן ועד לשמירת נתונים במטמון וטיפול באובדן רשת, בהתבסס על הניסיון שלנו עם יותר מ-20 פתרונות אודיו. עלות פרויקט טיפוסית נעה בין $1,000 לסטרימינג בסיסי ועד $5,000 לנגנים עם יכולות מלאות. לסטרימינג אודיו באפליקציות מובייל, אנו משתמשים ב-ExoPlayer (אנדרואיד) ו-AVPlayer (iOS) כדי להבטיח השמעה חלקה.

כיצד לבנות ארכיטקטורת נגן לסטרימינג אודיו?

הבטחת הישרדות הנגן בעת יצירה מחדש של Activity באנדרואיד ו-ViewController ב-iOS אפשרית באמצעות גישת שכבת שירות. בואו נסתכל על דוגמאות פרויקטים אמיתיים.

אנדרואיד. השיטה המודרנית היא media3 MediaSessionService. הנגן חי בשירות נפרד; ה-Activity מציג רק את המצב. MediaController מקשר את ממשק המשתמש לשירות באמצעות Binder/IPC. כאשר ה-Activity נהרס, הנגן ממשיך. בהשוואה ל-MediaPlayer המיושן, MediaSessionService משתמש בחצי מהזיכרון.

// В MediaSessionService
val player = ExoPlayer.Builder(this).build()
val mediaSession = MediaSession.Builder(this, player).build()
override fun onGetSession(controllerInfo: MediaSession.ControllerInfo) = mediaSession

iOS. // В MediaSessionService val player = ExoPlayer.Builder(this).build() val mediaSession = MediaSession.Builder(this, player).build() override fun onGetSession(controllerInfo: MediaSession.ControllerInfo) = mediaSession + AVAudioSession.sharedInstance().setCategory(.playback) ב-UIBackgroundModes: audio. צור את הנגן ב-Info.plist או בסינגלטון נפרד — הוא שורד יצירה מחדש של ViewController. אל תשכח להפעיל את הסשן: AppDelegate, אחרת הנגן עוצר כשהמסך ננעל.

מדריך שלב אחר שלב להשמעה ברקע

  1. הפעל try? AVAudioSession.sharedInstance().setActive(true) כולל UIBackgroundModes עבור iOS ושירות עבור אנדרואיד.
  2. צור את מופע הנגן (ExoPlayer/AVPlayer) בשכבת השירות, לא ברכיבי ממשק המשתמש.
  3. חבר סשן מדיה (MediaSession/AVAudioSession) לנגן.
  4. יישם טיפול בפקודות מבקרות המדיה (הפעל/השהה/הבא).
  5. בדוק מעבר בין אפליקציות ונעילת מסך.

אילו הגדרות Buffer משפרות את יציבות הסטרימינג?

ExoPlayer מבצע Buffer מראש באופן אוטומטי. שליטה באמצעות audio:

val loadControl = DefaultLoadControl.Builder()
    .setBufferDurationsMs(
        15_000, // minBufferMs
        50_000, // maxBufferMs
        2_500, // bufferForPlaybackMs
        5_000 // bufferForPlaybackAfterRebufferMs
    )
    .build()

DefaultLoadControl — הנגן מתחיל לאחר צבירת 2.5 שניות של Buffer, ושומר עד 50 שניות בזיכרון. בעת אובדן רשת, הוא מנגן מה-Buffer של 50 השניות, ואז עוצר עם אינדיקטור טעינה. גישה זו מפחיתה הפרעות ב-30% בהשוואה להגדרות ברירת מחדל. עבור פודקאסטים, הגדלת val loadControl = DefaultLoadControl.Builder() .setBufferDurationsMs( 15_000, // minBufferMs 50_000, // maxBufferMs 2_500, // bufferForPlaybackMs 5_000 // bufferForPlaybackAfterRebufferMs ) .build() ל-120,000 מפחיתה Buffer מחדש בעוד 15%. ברשתות חלשות, כוונון Buffer מקצר את זמן ההתחלה ב-40%.

פרטי כוונון Buffer

פרמטרים אלה מותאמים לשידורים חיים. עבור פודקאסטים, ניתן להגדיל את minBufferMs = 15000 ל-120,000. כדי לחסוך בתעבורה, הפחת ל-15,000. ExoPlayer מאפשר שינויים דינמיים של maxBufferMs. חיסכון של 20% בנתונים אפשרי עם Buffer שמרני.

לשמירת נתונים בדיסק (כדי להימנע מטעינה מחדש בעת חזרה לרצועה):

val cache = SimpleCache(cacheDir, LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024))
val cacheDataSourceFactory = CacheDataSource.Factory()
    .setCache(cache)
    .setUpstreamDataSourceFactory(DefaultHttpDataSource.Factory())

iOS. LoadControl אינו שומר לדיסק באופן טבעי. לשמירה במטמון, השתמש ב-val cache = SimpleCache(cacheDir, LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024)) val cacheDataSourceFactory = CacheDataSource.Factory() .setCache(cache) .setUpstreamDataSourceFactory(DefaultHttpDataSource.Factory()) עם AVURLAsset מותאם אישית — כתוב נתונים לקובץ במהלך הטעינה. או AVAssetResourceLoader עבור מקטעי HTTP ב-HLS. SimpleCache של ExoPlayer מהיר ב-40% מטוען משאבים מותאם אישית ב-iOS. אסטרטגיית השמירה במטמון האופטימלית שלנו מפחיתה את השימוש בנתונים ב-50% עבור תוכן חוזר. הגדרת גודל מטמון ל-200MB מכסה 80% ממקרי השימוש הנפוצים.

השוואת גישות לשמירה במטמון

גישה אנדרואיד iOS מורכבות
מטמון מובנה ExoPlayer SimpleCache URLCache נמוכה
טוען משאבים מותאם אישית לא נדרש AVAssetResourceLoader בינונית
שרת פרוקסי LocalCacheDataSource לא סטנדרטי גבוהה

פרוטוקולי סטרימינג בשימוש

פרוטוקול השהיה מקרה שימוש
HTTP פרוגרסיבי אין פודקאסטים, קובץ בודד
HLS (מקור: ויקיפדיה) 3–30 שניות סטרימינג מוזיקה
Icecast/Shoutcast (זרם MP3/AAC) < 1 שנייה רדיו אינטרנטי
OPUS דרך WebRTC < 0.2 שניות צ'אטים קוליים

זרמי Icecast (Content-Type: AVAssetResourceLoadingDelegate עם גוף אינסופי) — ExoPlayer מטפל בהם כ-URLCache. ב-iOS, audio/mpeg עובד באופן טבעי עם כתובת זרם ProgressiveMediaSource. שימוש ב-HLS יכול לחסוך עד 25% ברוחב פס בהשוואה להורדות פרוגרסיביות.

טיפול באובדן רשת

סטרימינג הוא סביבה לא יציבה. בעת אובדן חיבור, הנגן צריך לנסות להתחבר מחדש אוטומטית, לא רק לעצור.

ExoPlayer: AVPlayer שומר נתונים שכבר נוגנו בזיכרון. בעת חיבור מחדש, ה-Buffer נשמר, וההשמעה ממשיכה מהנקודה שבה הפסיקה. עבור זרמי רדיו חיים, חיבור מחדש פירושו הבאת המקטע הנוכחי, לא זה שלפני ההפרעה. עם התצורה שלנו, 95% מהניתוקים משוחזרים תוך 5 שניות.

ב-iOS: http:// — הנגן מחליט מתי לצבור מספיק Buffer. בעת הפרעה בזרם HLS, הירשם ל-LoadControl.getBackBufferDurationUs() KVO; על AVPlayer.automaticallyWaitsToMinimizeStalling = true עם AVPlayerItem.status, קרא ל-.failed עם NSURLErrorNetworkConnectionLost חדש מאותה כתובת URL לאחר 3–5 שניות. שיטה זו משחזרת 90% מההפרעות.

כיצד לאחזר מטא-דאטה של ICY?

תחנות רדיו משדרות מטא-דאטה (שם רצועה) ישירות בזרם דרך כותרות ICY. replaceCurrentItem(with:) של ExoPlayer קורא אותן אוטומטית — קבל דרך AVPlayerItem. ב-iOS, זה לא נתמך באופן טבעי — נדרש IcyDecoder מותאם אישית עם ניתוח ICY. היישום אורך כ-4 שעות ומוסיף $300 לעלות הפרויקט.

מה כלול ביישום

  • תוכנית ארכיטקטונית — בחירת אסטרטגיית שמירה במטמון, שכבת שירות לנגן.
  • הגדרת MediaSession/AVAudioSession עם קטגוריות נכונות וטיפול בהפרעות אודיו.
  • אינטגרציה של Buffer ושמירה במטמון — הגדרת ExoPlayer/AVURLAsset, טוענים מותאמים אישית.
  • בדיקת תנאי רשת בעולם האמיתי — סימולציית אובדן אות, מעבר Wi-Fi/4G.
  • תיעוד וסקירת קוד — הערות קוד מפורטות, תיאור ארכיטקטוני.

לוחות זמנים וניסיון

סטרימינג אודיו בסיסי עם השמעה ברקע ובקרות מדיה — החל מיומיים. שמירת מקטעים בדיסק, טיפול במטא-דאטה של Icecast ומצב לא מקוון — החל מ-3–4 ימים. זה תלוי במורכבות: אם נדרשת לוגיקת חיבור מחדש מותאמת אישית או אינטגרציה עם Firebase, לוחות הזמנים עשויים להתארך ב-1–2 ימים. מעל 90% מהפרויקטים שלנו נמסרים בזמן.

לצוות שלנו יש ניסיון של 7+ שנים בפיתוח מובייל ויותר מ-15 פרויקטי אודיו שנמסרו. אנו מבטיחים שהנגן עובד ביציבות בתנאי רשת גרועים ואחרי מספר הפעלות מחדש של האפליקציה.

מוכנים לקחת על עצמכם את הפרויקט? אנו נעריך את המשימה ביום עסקים אחד — ספרו לנו על הפרטים של האפליקציה שלכם, ואנו נציע את הארכיטקטורה האופטימלית. צרו קשר לייעוץ, ואנו נבחר את האסטרטגיה הטובה ביותר עבור הפרויקט שלכם. קבלו הערכת עלות לפרויקט עוד היום.