Ми займаємось розробкою мобільного застосунку для вебінарів під iOS та Android, які конкурують з Zoom та Webex у нішевих сценаріях — онлайн-курси, корпоративні тренінги, вебінари з аудиторією до 500 осіб. На відміну від готових рішень, наш застосунок дає повний контроль над інтерфейсом, монетизацією та збором даних. Основні вимоги: стабільне відео при нестабільній мережі, демонстрація екрану, чат з реакціями, гнучкі ролі учасників (організатор, спікер, слухач), запис сесій та відтворення. І все це із затримкою менше 500 мс. Наша компанія має 7 років досвіду (з 2017 року) та реалізувала 20+ подібних проектів, накопичивши досвід роботи з WebRTC, Livekit, Agora та власною збіркою SFU. Типова помилка — спроба адаптувати Jitsi Meet під кастомний UX, що призводить до конфліктів версій та сповільнення розробки. Ми уникаємо цього, обираючи SFU під конкретне завдання. Вартість розробки MVP становить від $15,000, а при використанні нашого self-hosted рішення економія до $2,000 на місяць порівняно з хмарними сервісами при 50+ користувачах. Надаємо гарантію на код 6 місяців та сертифікати фахівців.
Який SDK обрати для вебінарного застосунку?
Писати відеоконференцію з нуля на WebRTC — реально, але це 3-6 місяців тільки на медіа-движок. Для більшості продуктів правильний вибір — спеціалізований SDK, який закриває SFU, кодеки, адаптивний бітрейт та перевантаження мережі.
Livekit SDK — open source, self-hosted SFU, MIT ліцензія. iOS/Android/Flutter SDK. Стандарт для нових проектів, де важливий контроль над даними. Room, LocalParticipant, RemoteParticipant — проста object model.
Agora SDK — потужний, але хмарний з посекундною тарифікацією. Хороший, коли важлива глобальна CDN та мінімум DevOps. Однак при 100 учасниках вартість може бути в 2-3 рази вищою, ніж self-hosted Livekit.
Daily.co, 100ms, Whereby — хмарні альтернативи з різними pricing-моделями. Twilio Video — зрілий API, але Twilio заморозила розвиток Video у 2023.
Для self-hosted: Livekit + Janus + MediaSoup — три найактивніше підтримуваних SFU. Джерело: WebRTC та офіційна документація Livekit.
Чому ми обираємо Livekit для self-hosted?
Livekit дає повний контроль над даними — SFU, записи, стрімінг — все на ваших серверах. Економія порівняно з Agora: при 50 учасниках і 20 годинах вебінарів на місяць self-hosted обходиться в 2-3 рази дешевше. Крім того, Livekit Open Source (MIT) дозволяє модифікувати код під специфічні завдання.
Реалізація адаптивного відео під мобільні мережі
Головна проблема мобільних вебінарів — перехід між Wi-Fi та LTE посеред виступу. SFU з simulcast вирішує це: спікер надсилає 3 якості відео (720p/360p/180p), сервер обирає для кожного слухача оптимальну, виходячи з його пропускної здатності.
Livekit: simulcast вмикається флагом VideoPublishOptions(simulcast: true). iOS: LKLocalVideoTrack з CameraSource. Android: LocalVideoTrack + Camera2Source. Автоматичне зниження роздільної здатності при втраті пакетів — вбудовано в SFU.
Dynacast (Livekit) — автоматично паузує відео-треки спікерів, яких не бачить жоден із слухачів. Економить bandwidth на стороні сервера при >50 учасниках.
Аудіо: opus кодек, 48 кГц, AEC + NS + AGC вбудовані в WebRTC. Спікерфон vs earpiece: AVAudioSession.overrideOutputAudioPort(.speaker) / AudioManager.setSpeakerphoneOn(true). Автоматично при >2 учасниках — вмикаємо speakerphone, для 1-on-1 — earpiece.
Демонстрація екрану
iOS (ReplayKit). RPScreenRecorder.shared().startCapture(handler:) — працює з iOS 11, в iOS 12+ доступний з Control Center. Захоплення екрану повертає CMSampleBuffer — передаємо в WebRTC RTCVideoCapturer через кастомний RTCVideoCapturerDelegate. Обмеження: в RPBroadcastSampleHandler (Extension) не можна напряму викликати код основного застосунку — використовуємо App Group + CFMessagePort або Darwin notifications для передачі стану.
iOS 15+ RPSystemBroadcastPickerView — нативна кнопка запуску трансляції без коду.
Android (MediaProjection API). MediaProjectionManager.createScreenCaptureIntent() → користувач підтверджує → VirtualDisplay → захоплення кадрів через ImageReader → VideoEncoder → WebRTC VideoSource. Вимагає Foreground Service з типом mediaProjection (Android 10+). В маніфесті: <service android:foregroundServiceType="mediaProjection"/>.
Flutter: flutter_screen_capture (нативні біндинги до обох API) або нативний plugin з platform channels.
Чат, реакції, Q&A
Чат у реальному часі: WebSocket або Livekit DataChannel (LocalParticipant.publishData). DataChannel працює через те саме RTC-з'єднання — не потрібен окремий WebSocket сервер.
Реакції (👏🔥❤️): миттєва анімація у всіх учасників. Відправляємо через DataChannel, рендеримо з particle animation поверх відео-гриду. iOS: UIViewPropertyAnimator + CAEmitterLayer. Android/Compose: AnimatedVisibility + LaunchedEffect.
Q&A: черга запитань з upvote. Зберігання на сервері (Livekit RPC або окремий REST). Організатор бачить пріоритизований список.
Ролі та права доступу
Організатор, співорганізатор, спікер, слухач. Різниця в правах: слухач не публікує відео/аудіо (економія bandwidth), може тільки підняти руку → організатор дає слово.
Livekit: ParticipantPermission — canPublish, canPublishData, canSubscribe. Встановлюється сервером при створенні token або змінюється через RoomServiceClient.updateParticipant.
«Підняти руку»: DataChannel повідомлення {type: "raise_hand", participantId: "..."} → у організатора з'являється індикатор біля учасника.
Запис вебінару
Livekit Egress: cloud recording в S3/R2. EgressServiceClient.startRoomCompositeEgress() — записує composite view (відео всіх учасників у сітці) або track-by-track (окремі треки для монтажу). Формат: MP4 з H.264 + AAC.
Доступ до запису: presigned S3 URL з TTL 24 год. В застосунку — плеєр (AVPlayer / ExoPlayer) з позиціонуванням і швидкістю відтворення.
Що входить в роботу
- Технічне завдання та архітектурна документація
- Налаштування SFU (Livekit/Janus) та DevOps (K8s/Docker)
- Розробка iOS (Swift/SwiftUI) та Android (Kotlin/Compose) застосунків
- Інтеграція push-сповіщень (APNs/FCM), deep linking (Universal Links/App Links)
- Налаштування User Auth (OAuth 2.0, Firebase Auth)
- Підтримка App Store та Google Play: provisioning profiles, code signing, дотримання гайдлайнів (Section 4.2/5.1)
- Навантажувальне тестування з 50+ учасниками
- Передача вихідних кодів та доступів
Порівняння SFU для вебінарів
| SFU | Модель | Self-hosted | Краще використовувати коли |
|---|---|---|---|
| Livekit | Open source (MIT) | Так | Потрібен повний контроль, економія при >50 учасниках |
| Agora | Cloud, per-minute | Ні | Потрібна глобальна CDN, немає DevOps |
| Janus | Open source (GPL) | Так | Кастомні сценарії, SIP-інтеграція |
| MediaSoup | Open source (MIT) | Так | Чистий WebRTC, немає вбудованих SFU функцій |
Етапи та строки
- Вибір SFU та налаштування сервера — 1 тиждень.
- Відео/аудіо-кімната, ролі — 2-3 тижні.
- Чат, реакції, Q&A — 1 тиждень.
- Screen share iOS + Android — 1 тиждень.
- Запис та playback — 1 тиждень.
- Тестування навантаження (50+ учасників) — 1 тиждень.
Разом: MVP-вебінарний застосунок — 6-8 тижнів. З реєстрацією подій, email-розсилками, аналітикою присутності — 10-12 тижнів.
Отримайте консультацію з архітектури вашого вебінарного застосунку — ми допоможемо обрати оптимальний стек та вкластися в бюджет. Зв'яжіться з нами для обговорення деталей — ми відповімо на всі питання та запропонуємо оптимальне рішення.







