הטמעת שידור RTMP ממכשיר נייד
בעת פיתוח אפליקציה ניידת עם תכונת שידור חי ל-YouTube, Twitch או Facebook Live, נתקלים במהרה במגבלה: לא iOS ולא Android מספקות API מובנה ל-RTMP. יש לשלב ספריות צד שלישי, מה שמח inneב קונפיגורציה של קידוד חומרה דרך VideoToolbox או MediaCodec, ניהול סשן לכידה, טיפול בניתוקי חיבור והתאמת קצב סיביות לרשת. הצוות שלנו ביצע עשרות אינטגרציות של שידור RTMP — מאפליקציות כושר ועד פלטפורמות למידה מקוונת. בקשה טיפוסית מלקוח: המשתמש צריך לשדר מסך או מצלמה בזמן אמת עם חביון מינימלי, בעוד שהשידור צריך לעבוד כראוי ברקע ולהתאושש לאחר אובדן רשת.
פרוטוקול RTMP פועל על TCP, מה שמבטיח אספקת נתונים אמינה, אך דורש הגדרות timeout ו-reconnection מתאימות. לחביון נמוך במיוחד (<500 אלפיות שנייה), משתמשים ב-WebRTC, אך פלטפורמות פופולריות לא מקבלות אותו ישירות — יש צורך ב-re-streamer בצד השרת. לכן RTMP נשאר הבחירה המעשית ביותר לשידור נייד.
למה RTMP נשאר התקן לשידור נייד
RTMP משתמש ב-TCP, מספק אספקת נתונים אמינה ועובד דרך רוב חומות האש הארגוניות (פורט 1935). החביון הוא 1-3 שניות, מקובל לשידור לפלטפורמות. WebRTC נותן חביון <500 אלפיות שנייה, אבל YouTube ו-Twitch לא מקבלות אותו ישירות — נדרש re-streamer בשרת. SRT פועל על UDP אבל גם דורש תוכנת שרת נוספת. השוואת פרוטוקולים:
| פרוטוקול | חביון | TCP/UDP | תמיכת פלטפורמות | מטרה |
|---|---|---|---|---|
| RTMP | 1-3 שניות | TCP | YouTube, Twitch, Facebook | שידור חי לפלטפורמות מרכזיות |
| WebRTC | <500 אלפיות שנייה | UDP (ו-TCP) | לא נתמך ישירות על ידי YouTube/Twitch | שיחות וידאו, חביון נמוך |
| SRT | 0.5-2 שניות | UDP | דורש re-streamer בשרת | שידור אמין ברשתות חלשות |
איך להימנע ממסך שחור ואובדן חיבור
שלוש בעיות טיפוסיות של שידור RTMP נייד והפתרונות שלהן:
עיכוב התחלה. השניות הראשונות אינן יציבות — יחידות SPS/PPS NAL אינן נשמרות במטמון בשרת עדיין. ב-iOS פתרון: הגדר kVTCompressionPropertyKey_AllowFrameReordering: false — פריימים מסוג B מושבתים, החביון יורד ב-50%.
אובדן חיבור. בהפרעת רשת, יש צורך ב-reconnection אוטומטי. ב-iOS, ל-HaishinKit יש מנגנון reconnect מובנה. ב-Android, טפל ב-onConnectionFailedRtmp עם קריאות חוזרות ל-startStream() תוך שימוש ב-exponential backoff (מרווח התחלתי של 2 שניות, הגדלה עד 30 שניות).
מסך שחור. מתרחש אם קוראים ל-startStream() לפני אתחול לכידה. סדר: attachCamera → startPreview → connect → publish. ב-iOS, הגדר גם את AVCaptureSession לפני ההתחלה.
מה לבדוק לפני השידור?
- הרשאות מצלמה ומיקרופון (iOS —
NSCameraUsageDescription,NSMicrophoneUsageDescription; Android —CAMERA,RECORD_AUDIO). - הגדרות קצב סיביות: ל-HD (1280x720) מומלץ 2,000,000 – 3,000,000 bps.
- אישור TLS עבור rtmps (Android —
RtmpsCamera2, iOS —rtmps://). - בדיקת שידור לפלטפורמות עם בדיקת חביון.
iOS: HaishinKit
האפשרות הטובה ביותר ב-Swift מקורי. אין תלות ב-FFmpeg, קידוד חומרה דרך VideoToolbox. HaishinKit מתחיל שידור פי 2 מהר יותר מספריות מבוססות FFmpeg.
הגדרה מינימלית:
import HaishinKit
let rtmpConnection = RTMPConnection()
let rtmpStream = RTMPStream(connection: rtmpConnection)
rtmpStream.videoSettings = VideoCodecSettings(
videoSize: CGSize(width: 1280, height: 720),
bitRate: 2_000_000,
profileLevel: kVTProfileLevel_H264_High_AutoLevel as String
)
rtmpStream.audioSettings = AudioCodecSettings(bitRate: 128_000)
// Привязываем камеру
let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
try rtmpStream.attachCamera(camera)
try rtmpStream.attachAudio(AVCaptureDevice.default(for: .audio))
// Превью
let hkView = MTHKView(frame: previewView.bounds)
hkView.videoGravity = .resizeAspectFill
rtmpStream.addOutput(hkView)
previewView.addSubview(hkView)
// Запуск
rtmpConnection.connect("rtmp://live.example.com/live")
rtmpStream.publish("stream_key")Reconnection בעת ניתוק: הירשם ל-import HaishinKit let rtmpConnection = RTMPConnection() let rtmpStream = RTMPStream(connection: rtmpConnection) rtmpStream.videoSettings = VideoCodecSettings( videoSize: CGSize(width: 1280, height: 720), bitRate: 2_000_000, profileLevel: kVTProfileLevel_H264_High_AutoLevel as String ) rtmpStream.audioSettings = AudioCodecSettings(bitRate: 128_000) // Привязываем камеру let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) try rtmpStream.attachCamera(camera) try rtmpStream.attachAudio(AVCaptureDevice.default(for: .audio)) // Превью let hkView = MTHKView(frame: previewView.bounds) hkView.videoGravity = .resizeAspectFill rtmpStream.addOutput(hkView) previewView.addSubview(hkView) // Запуск rtmpConnection.connect("rtmp://live.example.com/live") rtmpStream.publish("stream_key") , ב-RTMPConnection.Event.rtmpStatus — code == RTMPStatusCode.connectClosed וחזור על reconnectDelay(3). ל-HaishinKit יש מנגנון connect() מובנה.
ניטור: reconnect ו-rtmpStream.info.byteCount — עקוב אחר FPS בפועל. אם הוא יורד מתחת ל-20, זה סימן לחיבור חלש.
Android: rtmp-rtsp-stream-client-java
ספרייה מאת Pedro Vicente. תומכת ב-Camera1, Camera2, CameraX, לכידת מסך. קידוד חומרה דרך RTMPStream.currentFPS.
val rtmpCamera = RtmpCamera2(binding.surfaceView, object : ConnectCheckerRtmp {
override fun onConnectionSuccessRtmp() {
/* обновиÑÑ UI */
}
override fun onConnectionFailedRtmp(reason: String) {
rtmpCamera.stopStream()
retryConnection()
}
override fun onDisconnectRtmp() {
retryConnection()
}
override fun onAuthErrorRtmp() {
/* показаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ */
}
override fun onAuthSuccessRtmp() {}
override fun onNewBitrateRtmp(bitrate: Long) {
updateBitrateUI(bitrate)
}
})
// ÐодгоÑовка (ÑазÑеÑение, биÑÑейÑ, FPS, аÑдио)
rtmpCamera.prepareVideo(1280, 720, 30, 2_000_000) && rtmpCamera.prepareAudio(128_000, 44100, true)
rtmpCamera.startStream("rtmp://live.example.com/live/stream_key")"}MediaCodec מקבל val rtmpCamera = RtmpCamera2(binding.surfaceView, object : ConnectCheckerRtmp { override fun onConnectionSuccessRtmp() { /* обновить UI */ } override fun onConnectionFailedRtmp(reason: String) { rtmpCamera.stopStream() retryConnection() } override fun onDisconnectRtmp() { retryConnection() } override fun onAuthErrorRtmp() { /* показать ошибку */ } override fun onAuthSuccessRtmp() {} override fun onNewBitrateRtmp(bitrate: Long) { updateBitrateUI(bitrate) } }) // Подготовка (разрешение, битрейт, FPS, аудио) rtmpCamera.prepareVideo(1280, 720, 30, 2_000_000) && rtmpCamera.prepareAudio(128_000, 44100, true) rtmpCamera.startStream("rtmp://live.example.com/live/stream_key") או RtmpCamera2. עבור Jetpack Compose: SurfaceView.
התאמת קצב סיביות: TextureView — שנה קצב סיביות ללא הפעלה מחדש של השידור.
השוואת ספריות:
| פרמטר | iOS (HaishinKit) | Android (rtmp-rtsp-stream-client-java) |
|---|---|---|
| שפה | Swift | Kotlin/Java |
| קידוד | VideoToolbox | MediaCodec |
| TLS | rtmps | RtmpsCamera2 |
| התאמת קצב סיביות | הגדרות פרמטרים | setVideoBitrateOnFly |
| Reconnect | מובנה | טיפול ידני |
איך אנחנו עושים את זה: מחסנית וקונפיגורציה
אנחנו משתמשים בספריות המתוארות עם קונפיגורציה נוספת של התאמת קצב סיביות אדפטיבית. ב-iOS, אנו מנטרים עומס CPU ומפחיתים קצב סיביות ב-25% אם FPS יורד מתחת ל-20. ב-Android, אנו משתמשים ב-AndroidView { RtmpCamera2(context, ...) } להתאמה דינמית. חיסכון בתעבורה עד 40% ללא אובדן איכות. לאימות, אנו משתמשים במפתח שידור ב-URL או באימות RTMP. אנו תומכים ב-rtmps עבור YouTube Live.
המהנדסים שלנו מכוונים פרמטרי קידוד לתרחישים ספציפיים: לשידור מסך — קצב סיביות נמוך יותר, למצלמה — גבוה יותר. אנו מבטיחים פעולה יציבה במכשירים עם iOS 15+ ו-Android 10+. צור קשר כדי להעריך את הפרויקט שלך.
תהליך עבודה
- אנליטיקה — בחירת פרוטוקול (RTMP/WebRTC), שרת, פלטפורמה. הגדרת דרישות חביון ואיכות.
- עיצוב — ארכיטקטורת מודול שידור, טיפול במצב רקע, reconnection, ניטור.
- יישום — שילוב ספרייה, קונפיגורציית קידוד, בדיקות במכשירים אמיתיים.
- בדיקות — בדיקת חביון, איכות וידאו, התנהגות במהלך נפילות רשת, פרסום ל-TestFlight/Google Play.
- פריסה — הכנה לשחרור, תיעוד, תמיכה.
מה כלול
- אינטגרציית שידור RTMP ב-iOS ו/או Android
- קידוד חומרה והגדרת קצב סיביות אדפטיבי
- יישום reconnection וטיפול בשגיאות
- תמיכה ב-TLS (rtmps)
- תיעוד לקונפיגורציית שרת ופלטפורמת שידור
- סיוע בבדיקת App Store ו-Google Play (דרישות מצב רקע ופרטיות)
- אחריות תאימות לגרסאות מערכת הפעלה עדכניות
למה לבחור בנו
אנחנו בפיתוח נייד למעלה מ-5 שנים וביצענו יותר מ-50 פרויקטי וידאו. המפתחים שלנו מוסמכים ל-iOS ו-Android. אנו מבטיחים איכות קוד ועמידה בלוחות זמנים. ניסיון באינטגרציות שידור RTMP מאפשר לנו להימנע מטעויות טיפוסיות ולספק פרויקטים בזמן.
אם אתה צריך שידור RTMP באפליקציה הניידת שלך, צור קשר להערכת פרויקט. נחשב את העלות וציר הזמן באופן אישי. הזמן אינטגרציית שידור RTMP turnkey וקבל מודול מוכן תוך 2-3 ימים.







