שילוב סטרימינג של Twitch עבור אפליקציות מובייל
סטרימינג במובייל הוא אזור סיכון מיוחד. חיבורי הרשת משתנים כל הזמן, כיוון המסך מתהפך, והפעלות שמע מתנגשות עם אפליקציות אחרות. ללא הגדרה נכונה של Amazon IVS Broadcast SDK, הסטרים או קופא אחרי 90 שניות או שורף תעבורה עודפת. קצב סיביות אדפטיבי, סיבוב וטיפול בהפרעות אינם אופציות—הם רכיבים חובה בכל אינטגרציה לייצור. ניסיון היישום שלנו מראה שכל אחד מהרכיבים הללו דורש תשומת לב אישית: מהגדרת קצב סיביות ועד ניהול מחזור חיי ההפעלה.
לפי תיעוד Amazon IVS Broadcast SDK, קצב סיביות אדפטיבי (IVSAutoQualityMode) מפחית את מספר הקפיאות ב-60% כאשר איכות הרשת מתדרדרת.
למה קצב סיביות אדפטיבי קריטי לסטרימים במובייל?
קצב סיביות קבוע הוא גורם נפוץ לחוויית שימוש ירודה. השוו: ללא התאמה, הצופה רואה קפיאה כל 10 שניות כאשר הרשת מתדרדרת; עם התאמה, התמונה מורידה איכות ל-480p אבל הסטרים לא נעצר. הבדיקות שלנו מראות שהפעלת IVSAutoQualityMode מפחיתה תלונות הקשורות לקפיאות פי 3.
| פרמטר | קצב סיביות קבוע | קצב סיביות אדפטיבי |
|---|---|---|
| התנהגות ב-LTE חלש | קפיאה אחרי 90 שניות | התדרדרות איכות חלקה |
| השהיה | 30+ שניות | 10–15 שניות |
| צריכת נתונים | עודפת | אופטימלית |
הבעיה השנייה היא סיבוב מסך. IVSBroadcastSession אינו עוקב אוטומטית אחר שינויי כיוון. אם לא תיירטו את let config = IVSBroadcastConfiguration() try config.video.setSize(CGSize(width: 1280, height: 720)) try config.video.setTargetFramerate(30) try config.video.setInitialBitrate(2_500_000) try config.video.setMinBitrate(300_000) try config.video.setMaxBitrate(4_000_000) config.video.usesBFrames = true ותקראו ל-func broadcastSession(_ session: IVSBroadcastSession, networkHealthChanged health: IVSBroadcastSessionHealth) { switch health { case .bad, .critical: // Показываем предупреждение пользователю, логируем в Crashlytics } } , סטרים לרוחב ישודר עם פריימים לגובה ופסים שחורים. באנדרואיד עם CameraX, אותה בעיה—צריך להירשם ל-OrientationEventListener ולהעביר את הזווית ל-imageCapture.targetRotation.
איך להימנע מהתנגשויות הפעלת שמע?
צינור השמע הוא נושא נפרד. ב-iOS, IVSMicrophoneInput מתנגש עם AVAudioSession אם האפליקציה משתמשת בהשמעת רקע. AVAudioSession.setCategory(.playAndRecord, options: .mixWithOthers) פותר את ההתנגשות, אבל יש להפעיל אותו לפני אתחול הפעלת השידור, אחרת תקבלו OSStatus -10851 בלוגים. תיעוד AVAudioSession מתאר את כל הקטגוריות.
איך אנחנו בונים את האינטגרציה
מחסנית ל-iOS: Swift 5.9+, AmazonIVSBroadcast 1.14+ (Swift IVS), AVFoundation, ReplayKit (ללכידת מסך). אנדרואיד: Kotlin, ivs-broadcast 1.14+ (Kotlin IVS), CameraX 1.3, MediaCodec.
שלבים:
-
הגדרת ערוץ IVS. צרו ערוץ דרך AWS Console או מודול Terraform, קבלו נקודת קצה להזנה ומפתח סטרים. פורמט נקודת הקצה:
rtmps://a1b2c3d4e5f6.global-contribute.live-video.net:443/app/. שמרו את המפתח ב-Keychain (iOS) או ב-EncryptedSharedPreferences (אנדרואיד)—לעולם לא בקונפיגורציית האפליקציה. -
הגדרת הפעלה. ב-iOS:
דוגמת הגדרה
let config = IVSBroadcastConfiguration()
try config.video.setSize(CGSize(width: 1280, height: 720))
try config.video.setTargetFramerate(30)
try config.video.setInitialBitrate(2_500_000)
try config.video.setMinBitrate(300_000)
try config.video.setMaxBitrate(4_000_000)
config.video.usesBFrames = trueusesBFrames = true מפחית קצב סיביות באותה איכות חזותית—הפעילו אותו אם היעד המינימלי הוא iOS 14+.
-
מצלמה ומיקרופון. במקום להשתמש ישירות ב-
AVCaptureSession, התחברו דרךIVSBroadcastSession.listAvailableDevices(). ה-SDK מנהל אתAVCaptureSessionבעצמו, כך שאין צורך ליצור הפעלה מתחרה. אם צריך להציג תצוגה מקדימה, השתמשו ב-IVSImagePreviewView, שה-SDK מספק דרךattachCamera(_:toSlotWithName:previewAspectMode:). -
טיפול באירועי רשת. יישמו
IVSBroadcastSessionDelegate:
func broadcastSession(_ session: IVSBroadcastSession, networkHealthChanged health: IVSBroadcastSessionHealth) {
switch health {
case .bad, .critical:
// Показываем предупреждение пользователю, логируем в Crashlytics
}
} - כיבוי וניקוי.
broadcastSession.stop()הוא אסינכרוני—אל תשחררו את ההפעלה מיד. חכו לקריאת ה-delegatebroadcastSession(_:transmissionStatisticsChanged:)עם קצב סיביות אפס, ואז הגדירוbroadcastSession = nil.
| שלב | משך |
|---|---|
| הגדרת ערוץ | 4 שעות |
| אינטגרציית SDK | 3 ימים |
| קצב סיביות אדפטיבי | 2 ימים |
| סיבוב והפרעות | יום אחד |
| בדיקות | 2 ימים |
כתבו לנו כדי לדון בפרויקט שלכם ולקבל הערכת עלות מדויקת.
מה כלול בעבודה
- הגדרת ערוץ IVS וקבלת נתוני הזנה.
- אינטגרציית SDK עם מצלמה ומיקרופון מקוריים.
- יישום קצב סיביות אדפטיבי, סיבוב, טיפול בהפרעות.
- כתיבת בדיקות (network link conditioner, testMode).
- הכנת תיעוד קונפיגורציה ותמיכה.
- אחריות לפעולה תקינה של הסטרים תחת חיבור יציב.
בדיקות לפני ייצור
אנחנו בודקים התנהגות עבור: אובדן חיבור פתאומי (מצב טיסה למשך 10 שניות במהלך הסטרים), מעבר בין Wi-Fi ל-LTE, שיחה נכנסת (הפרעת AVAudioSession). לבדיקות אוטומטיות, IVSBroadcastSession תומך ב-testMode, המדמה שידור ללא חיבור RTMPS אמיתי.
תרחיש עומס: התחילו את הסטרים, אחרי 5 דקות הפעילו network link conditioner עם פרופיל 100% Loss למשך 15 שניות, בדקו שההפעלה מתאוששת ללא קריסה ואין דליפות זיכרון ב-Xcode Instruments (allocations + leaks). חיסכון בתעבורה עם קצב סיביות אדפטיבי מגיע ל-40%.
לוחות זמנים והערכת עלות
אינטגרציה בסיסית (מצלמה אחת, איכות קבועה, iOS או אנדרואיד): 1–2 שבועות. יישום מלא עם קצב סיביות אדפטיבי, סיבוב, טיפול בהפרעות, תצוגה מקדימה ובדיקות—3–5 שבועות. אם נדרשת פלטפורמה חוצת-פלטפורמות (Flutter עם ערוצי פלטפורמה או React Native עם מודולים מקוריים), הוסיפו 1–2 שבועות לשכבת האינטגרציה. העלות מחושבת באופן אישי לאחר ניתוח דרישות. קבלו ייעוץ לתרחיש שלכם—כתבו לנו.







