שילוב VK Live באפליקציית מובייל נראה פשוט עד שנתקלים בהיעדר SDK רשמי. הכל מסתכם בפרוטוקול RTMP, מפתחות סשן והצפנה בזמן אמת. פתרנו את זה עבור iOS ו-Android, והנה מה שגילינו.
אילו אתגרים טכניים מתעוררים בשילוב VK Live?
איך להשיג מפתח RTMP ללא אינטראקציה של משתמש? — שילוב שידור חי
הבעיה הנפוצה ביותר היא השגת מפתח RTMP דרך VK API ללא קלט ידני. שיטת video.startStreaming דורשת הרשאה דרך VK Connect עם ה-scope video. אם הטוקן פג או חסר את ה-scope הנדרש, הוא מחזיר error_code: 15 (גישה נדחתה), והשידור לא יתחיל. אנחנו מאחסנים את הטוקן ב-Keychain (iOS) או ב-EncryptedSharedPreferences (Android) ומחדשים אותו לפני הפקיעה ולא לאחר שגיאה. זה מעלה את אחוזי ההצלחה של שידור ראשון ל-95% וחוסך עד 30 שניות לכל סשן. צרו קשר לייעוץ על הגדרת תהליך OAuth2 — זה יחסוך ימי פיתוח.
למה הצפנת H.264 דורשת כיוונון מדויק?
ההצפנה במובייל היא נקודת התורפה. ב-iOS, אנחנו משתמשים ב-VideoToolbox דרך AVAssetWriter + AVAssetWriterInput עם הפרמטרים הבאים:
let rtmpConnection = RTMPConnection()
let rtmpStream = RTMPStream(connection: rtmpConnection)
rtmpStream.videoSettings = VideoCodecSettings(
videoSize: CGSize(width: 1280, height: 720),
bitRate: 2_500_000,
profileLevel: kVTProfileLevel_H264_High_AutoLevel as String
)
rtmpStream.audioSettings = AudioCodecSettings(bitRate: 128_000)
rtmpConnection.connect("rtmp://vp.vkforms.ru/live")
rtmpStream.publish(streamKey)ללא AVVideoCodecKey: AVVideoCodecType.h264 מפורש, המקודד ממקם keyframes בדלילות מדי — שרת ה-RTMP של VK מאגר זמן רב יותר, מה שגורם לצופים להבחין בקופצניות במעברי סצנה. ב-Android, אנחנו משתמשים ב-AVVideoWidthKey: 1280 עם AVVideoHeightKey: 720 ו-AVVideoCompressionPropertiesKey. VBR בחיבורים לא יציבים גורם לקפיצות בקצב הסיביות שאובדן מנות בכניסת VK הופך לאפקטים של 2-3 שניות. לכן אנחנו קובעים CBR ומגבילים את ה-GOP ל-60 פריימים.
איך אנחנו מיישמים שידור RTMP
השוואת גישות: HaishinKit לעומת RTMP מותאם אישית
| פרמטר | HaishinKit (iOS) | RTMP מותאם אישית (Android) |
|---|---|---|
| זמן פיתוח | 1–2 ימים | 3–5 ימים |
| גמישות | בינונית | גבוהה — שליטה מלאה על באפרים |
| תלויות | ספרייה חיצונית | רק APIs סטנדרטיים |
| תמיכה | פעילה, עדכונים | פנימית |
| ביצועים | טובים, 60 fps | מצוינים עם thread pool מותאם |
HaishinKit מקצר את זמן היישום פי 2-3 בהשוואה לפתרון מותאם אישית, אך מציע פחות גמישות לכיוונון עדין של הבאפרינג.
ב-iOS, אנחנו משתמשים ב-HaishinKit (Swift, מתוחזק באופן פעיל). ב-Android, אנחנו מעדיפים AVVideoAverageBitRateKey: 2_500_000 מקורי עם לקוח RTMP מותאם אישית על פני AVVideoMaxKeyFrameIntervalKey: 60, תוך הימנעות מתלויות כבדות. תכנית iOS עם HaishinKit:
let rtmpConnection = RTMPConnection()
let rtmpStream = RTMPStream(connection: rtmpConnection)
rtmpStream.videoSettings = VideoCodecSettings(
videoSize: CGSize(width: 1280, height: 720),
bitRate: 2_500_000,
profileLevel: kVTProfileLevel_H264_High_AutoLevel as String
)
rtmpStream.audioSettings = AudioCodecSettings(bitRate: 128_000)
rtmpConnection.connect("rtmp://vp.vkforms.ru/live")
rtmpStream.publish(streamKey)ניטור איכות — אנחנו נרשמים ל-AVVideoMaxKeyFrameIntervalKey, עוקבים אחר MediaCodec (מפתח לא חוקי) ו-MediaFormat.MIMETYPE_VIDEO_AVC (ניתוק חיבור). ב-BITRATE_MODE_CBR, אנחנו מתעדים ל-Firebase Crashlytics עם הפרמטרים: קצב סיביות בזמן ניתוק, סוג חיבור (Wi-Fi/סלולרי), גרסת מערכת הפעלה.
חיבור מחדש מיושם עם backoff אקספוננציאלי: 2 שניות → 4 שניות → 8 שניות → 16 שניות → 30 שניות (מקסימום). ניסיונות חוזרים אינסופיים ללא הפסקה יחסמו את החשבון בצד של VK עקב הצפה.
השוואת הגדרות הצפנה ל-iOS ו-Android
| פרמטר | iOS (VideoToolbox) | Android (MediaCodec) |
|---|---|---|
| קודק | H.264/H.265 | H.264/H.265 |
| קצב סיביות | 2.5–4 Mbps | 2.5–4 Mbps |
| GOP | 60 פריימים | 60 פריימים |
| מצב קצב סיביות | CBR | CBR |
| פרופיל | High | High |
הרשאה והשגת מפתח השידור
דרך VK SDK (iOS: MediaCodec, Android: java.net.Socket) או תהליך OAuth2 ישיר:
- פתחו WebView או SFSafariViewController בכתובת
let rtmpConnection = RTMPConnection() let rtmpStream = RTMPStream(connection: rtmpConnection) rtmpStream.videoSettings = VideoCodecSettings( videoSize: CGSize(width: 1280, height: 720), bitRate: 2_500_000, profileLevel: kVTProfileLevel_H264_High_AutoLevel as String ) rtmpStream.audioSettings = AudioCodecSettings(bitRate: 128_000) rtmpConnection.connect("rtmp://vp.vkforms.ru/live") rtmpStream.publish(streamKey) - יירטו את ההפניה ל-
RTMPConnection.Event.rtmpStatus - קראו ל-
NetStream.Publish.BadNameעם הטוקן שהושג - חלצו את
NetStream.Failedו-NetStream.Failedמהתשובה
המפתח קשור לסשן — הוא עובד לשידור אחד בלבד. שמירתו בין סשנים אסורה.
רשימת בדיקה לאימות השילוב
- [ ] טוקן הרשאה הושג עם scope של וידאו
- [ ] מפתח RTMP תקף לשידור הנוכחי
- [ ] פרמטרי הצפנה הוגדרו (CBR, GOP 60)
- [ ] טיפול בשגיאות עם backoff אקספוננציאלי
- [ ] תיעוד ל-Crashlytics
- [ ] עמידה בהנחיות בדיקת App Store ובמדיניות המפתחים של Google Play
מה כלול בעבודה
- שילוב מלא של שידור RTMP ב-iOS או Android (לבחירתכם)
- הרשאת OAuth2 דרך VK עם ניהול טוקנים
- הגדרת הצפנת H.264/H.265: קצב סיביות, GOP, פרופיל
- טיפול בשגיאות רשת וחיבור מחדש אוטומטי
- ניטור דרך Firebase Crashlytics עם לוגים מותאמים
- תיעוד לשימוש ותמיכה
- סיוע בפרסום ב-App Store / Google Play (בדיקת עמידה במדיניות)
לוחות זמנים ועלות
שילוב בפלטפורמה אחת (iOS או Android): 2–3 שבועות כולל תהליך OAuth, לכידת וידאו וטיפול בסיסי בשגיאות. הוספת קצב סיביות אדפטיבי וחיבור מחדש אוטומטי לוקחת שבוע נוסף. העלות מחושבת באופן אישי לאחר ניתוח דרישות. צרו קשר להערכת הפרויקט שלכם ובחירת הסטack האופטימלי. בקשו ייעוץ — נעזור עם הפרטים.
אנחנו מספקים אחריות על יציבות השידור כאשר ההגדרות המומלצות נשמרות. ניסיון עם למעלה מ-15 פרויקטים — אנחנו בטוחים באיכות.







