וידאו חי יציב מהנייד באמצעות פרוטוקול SRT
המכשיר הנייד שלכם משדר וידאו חי מהשטח, אך רשת ה-LTE אינה יציבה—אובדן מנות מגיע ל-20%. שידורי RTMP נשברים, והצופים רואים מסך שחור. אנו פותרים זאת עם פרוטוקול SRT. בניגוד ל-RTMP, SRT עובד על UDP עם תיקון שגיאות מובנה (ARQ/FEC), סובל עד 30% אובדן מנות, ומשקם את השידור אוטומטית ללא צורך בהפעלה מחדש. למעשה, SRT אמין פי 5 מ-RTMP בתנאי אובדן מנות דומים. לשידור נייד על LTE לא יציב או Wi-Fi ציבורי, זהו משנה משחק. לצוות שלנו ניסיון של למעלה מ-5 שנים בפיתוח מובייל, והוא סיפק למעלה מ-20 פרויקטי שידור וידאו. אנו מבטיחים חיבורי SRT יציבים בתנאי רשת מאתגרים עם מפתחים מוסמכים. פרויקט טיפוסי הכולל אינטגרציה ל-iOS וגם ל-Android מתחיל ב-$1000, עם חיסכון בעלויות שרת בהשוואה ל-RTMP. צרו קשר לייעוץ על הפרויקט שלכם. האינטגרציה מתחילה מ-$500 להגדרה בסיסית בפלטפורמה אחת.
מדוע SRT עדיף על RTMP במובייל
ב-5% אובדן מנות בלבד, RTMP מתחיל לבאפר ולהישבר; SRT עם באפר latency=500ms נשאר יציב ב-20-25% אובדן. SRT מספק עד פי 10 זמן השהיה נמוך יותר (200–2000 אלפיות שנייה לעומת 5–10 שניות) ומשתמש בבאפרים נגד קפיצות (jitter) וב-FEC לשמירה על איכות. לשידור בסגנון כתב מאירועים, הפקת וידאו מרחוק ושידורי שטח, SRT הפך לסטנדרט המקצועי—תמיכה מובנית ב-OBS, vMix ו-Blackmagic. זמן ההשהיה ניתן לכוונון באמצעות פרמטר latency: מינימום 200 אלפיות שנייה לרשתות טובות, 500-2000 אלפיות שנייה לרשתות ניידות עם קפיצות. באפר גדול יותר = עמידות גבוהה יותר, אך עיכוב גבוה יותר. חיסכון בתשתית: SRT אינו דורש שרתים יקרים או מאיצי TCP—הוא עובד על UDP, ומפחית עלויות תפעול.
הבטחת חיבור יציב תחת אות חלש
SRT תומך בחיבור מחדש אוטומטי בתוך connectionTimeout. בעוד שכוונון פרמטרים בסיסי עוזר, אנו הולכים רחוק יותר: אנו עוקבים אחר latency וכשהוא עולה על 5%, אנו מפחיתים אוטומטית את pktSndLoss ומגדילים את videoBitrate. זה דורש חיבור מחדש אך מונע קריסה מוחלטת של השידור.
iOS: HaishinKit עם SRT
HaishinKit תומך ב-SRT מאז גרסה 2.x דרך latency:
import HaishinKit
let srtConnection = SRTConnection()
let srtStream = SRTStream(connection: srtConnection)
srtStream.videoSettings = VideoCodecSettings(
videoSize: CGSize(width: 1920, height: 1080),
bitRate: 5_000_000,
profileLevel: kVTProfileLevel_H264_High_AutoLevel as String
)
srtStream.audioSettings = AudioCodecSettings(bitRate: 192_000)
try srtStream.attachCamera(AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back))
try srtStream.attachAudio(AVCaptureDevice.default(for: .audio))
// Caller mode: мы инициируем соединение
srtConnection.connect("srt://media-server.example.com:9998?latency=500&streamid=live/stream1")
srtStream.publish()
ה-SRTConnection מזהה את השידור בשרת (MediaMTX, SRT Live Server משתמשים בו לניתוב). import HaishinKit let srtConnection = SRTConnection() let srtStream = SRTStream(connection: srtConnection) srtStream.videoSettings = VideoCodecSettings( videoSize: CGSize(width: 1920, height: 1080), bitRate: 5_000_000, profileLevel: kVTProfileLevel_H264_High_AutoLevel as String ) srtStream.audioSettings = AudioCodecSettings(bitRate: 192_000) try srtStream.attachCamera(AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)) try srtStream.attachAudio(AVCaptureDevice.default(for: .audio)) // Caller mode: мы инициируем соединение srtConnection.connect("srt://media-server.example.com:9998?latency=500&streamid=live/stream1") srtStream.publish() הוא באלפיות שנייה. חיבור מחדש בעת ניתוק: SRT מתחבר מחדש אוטומטית בתוך streamid. HaishinKit חושף latency עם סיבה—טפלו בו ב-delegate שלכם.
Android: rtmp-rtsp-stream-client-java עם SRT
ספריית rtmp-rtsp-stream-client-java תומכת ב-SRT דרך connectionTimeout:
val srtCamera = SrtCamera2(binding.surfaceView, connectChecker)
srtCamera.prepareVideo(
width = 1920,
height = 1080,
fps = 30,
bitrate = 5_000_000,
rotation = 0,
profile = CodecUtil.H264_BASELINE
)
srtCamera.prepareAudio(bitrate = 192_000, sampleRate = 44100, isStereo = true)
srtCamera.startStream("srt://media-server.example.com:9998?streamid=live/stream1&latency=500")מתחת למכסה המנוע: libsrt מקורי (C++) מהודר עבור ABI של Android (arm64-v8a, armeabi-v7a, x86_64).
חלופה: FFmpegKit עם libsrt
בנו את FFmpegKit עם libsrt והשתמשו בו ישירות:
-f avfoundation -i 0:0 -c:v h264_videotoolbox -b:v 5M -f mpegts "srt://server:9998?latency=500&streamid=live/test" יתרון: תמיכה ב-H.265 (SRTConnection.Event.connect), שליטה רבה יותר. חסרון: FFmpegKit אינו מנהל את המצלמה ישירות—יש צורך בלכידה נפרדת דרך SrtCamera2 + pipe.
מצב Listener לעומת Caller
SRT תומך בשני מצבים:
- Caller — המכשיר הנייד יוזם את החיבור לשרת. הנפוץ ביותר.
- Listener — המכשיר מאזין לחיבורים נכנסים. שימושי ל-p2p ללא שרת או כשהשרת מאחורי NAT.
- Rendezvous — שני הצדדים יוזמים בו-זמנית. ל-p2p דרך NAT ללא ממסר.
לשידור נייד, אנו משתמשים ב-Caller. Listener במובייל נדיר (מכשיר IoT ללא IP ציבורי).
הצפנה
ל-SRT יש הצפנת AES-128/256 מובנית דרך val srtCamera = SrtCamera2(binding.surfaceView, connectChecker) srtCamera.prepareVideo( width = 1920, height = 1080, fps = 30, bitrate = 5_000_000, rotation = 0, profile = CodecUtil.H264_BASELINE ) srtCamera.prepareAudio(bitrate = 192_000, sampleRate = 44100, isStereo = true) srtCamera.startStream("srt://media-server.example.com:9998?streamid=live/stream1&latency=500") ו--f avfoundation -i 0:0 -c:v h264_videotoolbox -b:v 5M -f mpegts "srt://server:9998?latency=500&streamid=live/test" בכתובת ה-URL. זהו מבדל מ-RTMP—ההצפנה היא ברמת הפרוטוקול, לא מעטפת TLS.
srt://server:9998?passphrase=MySuperSecret&pbkeylen=32 ניטור איכות
ממשק ה-API של SRT מספק סטטיסטיקות דרך hevc_videotoolbox: AVCaptureVideoDataOutput, passphrase, pbkeylen, srt://server:9998?passphrase=MySuperSecret&pbkeylen=32 , srt_bistats(). HaishinKit חושף חלק מהסטטיסטיקות ב-pktSndLoss. אנו מציגים קצב סיביות, RTT ואובדן מנות בממשק המשתמש—משתמשים מקצועיים מעריכים זאת. כאשר pktRcvLoss עולה על 5%, אנו מפחיתים אוטומטית את pktRetrans ומגדילים את mbpsSendRate (דורש חיבור מחדש).
השוואת SRT לעומת RTMP
| פרמטר | SRT | RTMP |
|---|---|---|
| פרוטוקול | UDP עם ARQ+FEC | TCP |
| זמן השהיה | 200–2000 אלפיות שנייה (ניתן לכוונון) | 5–10 שניות |
| סבילות לאובדן מנות | עד 30% | עד 5% |
| הצפנה | AES-128/256 מובנית | דרך TLS |
| תמיכה במובייל | HaishinKit, FFmpegKit | RTMP SDK |
תאימות שרתים
| שרת | תמיכה ב-SRT |
|---|---|
| MediaMTX | מובנית, ללא הגדרות נוספות |
| Nginx + nginx-srt-module | כן |
| Ant Media Server | כן |
| Wowza Streaming Engine | כן (4.8+) |
| OBS Studio | כמקלט דרך msRTT |
| FFmpeg | אפשרות SRTStream.info בעת הידור |
ארכיטקטורת הפתרון
האינטגרציה של שידור SRT כוללת הגדרת pktSndLoss, videoBitrate, latency ומצב חיבור. ל-iOS אנו משתמשים ב-HaishinKit, ל-Android - rtmp-rtsp-stream-client-java או FFmpegKit. סטטיסטיקות חיבור נאספות דרך API ומוצגות בממשק המשתמש לבקרת איכות. כאשר הרשת מתדרדרת, קצב הסיביות מונמך אוטומטית והבאפר מוגדל.
מה כלול בעבודה
- ניתוח דרישות ובחירת ספרייה.
- אינטגרציה של שידור SRT ב-iOS ו/או Android.
- הגדרת פרמטרים של
srt://listen,libsrt,latency. - יישום ניטור איכות (RTT, אובדן, קצב סיביות).
- תיעוד והדרכה לצוות שלכם.
- תמיכה לאחר ההשקה.
לוח זמנים: אינטגרציה בפלטפורמה אחת — 2–4 ימי עסקים. עלות מתחילה מ-$500 לפלטפורמה. להערכת הפרויקט שלכם, צרו קשר — נגיב תוך יום עסקים אחד. השלמנו בהצלחה למעלה מ-20 פרויקטים עם מדדי ביצועים מובטחים.







