Ми розробляємо відеодзвінки в мобільних додатках. Це не просто WebRTC-з'єднання: управління камерою та мікрофоном, lifecycle на рівні системи, обробка переривань (вхідний дзвінок, сповіщення, блокування екрану), коректна робота у фоні та на низькому рівні заряду батареї. Кожна з цих деталей — окрема задача з нетривіальними рішеннями на iOS та Android. Наш досвід у цій галузі перевищує 7 років, ми реалізували понад 30 проєктів з відеодзвінками для клієнтів з різних індустрій. Вартість розробки базового відеодзвінка стартує від $7,000, а повноцінне рішення з CallKit/ConnectionService та кастомним сигналінгом — від $15,000.
Який транспорт обрати для розробки відеодзвінків: WebRTC чи готовий SDK?
Чистий WebRTC — це RTCPeerConnection, RTCSessionDescription, ICE/STUN/TURN сервери, getUserMedia, сигналінг через WebSocket. Повна реалізація з нуля займає 3–6 тижнів тільки на транспортний шар, без UI. Це дозволяє зменшити розмір бінарника на 30% порівняно з використанням Agora SDK.
Більшість проєктів обирають SDK поверх WebRTC: Twilio Video, Daily.co, 100ms, Livekit або Agora. Вони беруть на себе ICE negotiation, codec negotiation (VP8/VP9/H.264/AV1), адаптивний бітрейт, і дають готові нативні обгортки для iOS та Android.
Якщо вимоги до кастомізації невисокі та важлива швидкість запуску — обираємо SDK. Якщо потрібен повний контроль над кодеком, шифруванням або мінімальною вагою бінарника — чистий WebRTC через GoogleWebRTC (iOS) або org.webrtc (Android).
Порівняння WebRTC та SDK
| Критерій | WebRTC | SDK (Twilio/Agora) |
|---|---|---|
| Час розробки | 3–6 тижнів | 1–2 тижні |
| Контроль | Повний | Обмежений |
| Вага бінарника | Мінімальна | Більше на 5–10 МБ |
| Підтримка кодеків | Будь-які | Обмежена SDK |
Крок 1: Як реалізувати відеодзвінок на iOS?
Відео з камери захоплюється через AVCaptureSession. Правильна ініціалізація:
let session = AVCaptureSession() session.sessionPreset = .hd1280x720 let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front) let input = try AVCaptureDeviceInput(device: camera!) let output = AVCaptureVideoDataOutput() output.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue")) AVCaptureVideoDataOutput з делегатом дає сирі CMSampleBuffer — їх передаємо в WebRTC через RTCVideoSource. Важно: AVCaptureSession.startRunning() викликається строго у фоновому потоці, не на головному — інакше UI заморозиться на 200–400 мс.
Перемикання фронтальної/основної камери — AVCaptureSession.beginConfiguration() + видалення старого input + додавання нового + commitConfiguration(). Без begin/commit навколо цих операцій — флікер на відео під час перемикання.
CallKit — обов'язковий компонент для iOS-додатків з відеодзвінками. Без нього вхідний дзвінок відображається як push-сповіщення, яке може бути пропущено. З CallKit — повноекранний системний екран дзвінка, інтеграція з Bluetooth/AirPods, правильна обробка переривання аудіо. Реалізуємо через CXProvider та CXCallController. VoIP push через PKPushRegistry — єдиний спосіб розбудити додаток для вхідного дзвінка.
Крок 2: Як реалізувати відеодзвінок на Android?
На Android Camera2 API (CameraManager.openCamera()) дає доступ до ImageReader з форматом YUV_420_888 — стандартний формат для WebRTC на Android. Для більшості задач вистачає рівня CameraDevice.StateCallback + CaptureRequest.Builder.
ConnectionService — Android-аналог CallKit. Реєструємо PhoneAccount, через TelecomManager керуємо станом дзвінка. Без цього на Android 10+ додаток не може працювати у foreground під час дзвінка без постійного сповіщення.
Для збереження з'єднання при згортанні — ForegroundService з типом mediaProjection або phoneCall. На Android 14 це вимагає явного вказання в маніфесті: android:foregroundServiceType="camera|microphone".
Крок 3: Управління камерою та мікрофоном
Mute мікрофона — не відключення пристрою, а заміна аудіо-треку на тишу. В WebRTC: RTCAudioTrack.isEnabled = false. Повне відключення мікрофона на рівні AVAudioSession — ламає ехоподавлення.
Flip камери під час дзвінка — через RTCCameraVideoCapturer.stopCapture() + зміна пристрою + startCapture(with:fps:). Без повної зупинки — крэш на деяких пристроях Huawei та Xiaomi через стан гонки в Camera2.
Поворот екрану — RTCVideoTrack сам по собі не враховує орієнтацію. Потрібно передавати RTCVideoRotation в RTCVideoFrame при захопленні з камери, інакше співрозмовник побачить повернуте на 90° відео на пристроях з portrait-lock.
Крок 4: Якість з'єднання та адаптація
Адаптивний бітрейт — базова функція WebRTC (алгоритм GCC). Але потрібно явно задати діапазон: RTCRtpEncodingParameters з minBitrateBps: 100_000 та maxBitrateBps: 1_500_000. Без обмеження зверху на Wi-Fi WebRTC спробує використовувати 4–8 Мбіт/с — це некомфортно для інших користувачів мережі.
Індикатор якості з'єднання через RTCPeerConnection.getStats() — парсимо RTCInboundRtpStreamStats для framesPerSecond та packetsLost. Втрати > 5% — показуємо попередження користувачу. Ці механізми забезпечують стабільність зв'язку навіть при нестабільному інтернеті.
Що входить в роботу з розробки відеодзвінків?
- Аудит вимог та вибір оптимального транспорту (WebRTC або SDK)
- Розробка сигналінгу (WebSocket або сторонній сервер)
- Інтеграція камери та мікрофона з AVCaptureSession/Camera2
- Підключення CallKit/ConnectionService для системних дзвінків
- Розробка UI: прев'ю локального відео, віддалене відео, кнопки керування
- Адаптивний бітрейт та контроль якості з'єднання
- Тестування на реальних пристроях (iOS/Android)
- Документація з інтеграції та передача вихідного коду
- Підтримка після релізу (2 тижні)
Процес: від ідеї до релізу
Крок 1: Аудит вимог → Крок 2: Вибір транспорту → Крок 3: Реалізація сигналінгу → Крок 4: Інтеграція камери/мікрофона → Крок 5: CallKit/ConnectionService → Крок 6: UI та кнопки керування → Крок 7: Тестування на реальних пристроях → Крок 8: Деплой у магазини.
Оцінимо ваш проєкт безкоштовно. Напишіть нам, і ми запропонуємо оптимальне рішення з урахуванням ваших термінів та бюджету. Базовий відеодзвінок 1-на-1 через SDK (Twilio/Agora/100ms) з управлінням камерою, mute та flip — 1–2 тижні. Чистий WebRTC з сигналінгом, CallKit, фоновий режим — 3–5 тижнів. Вартість розраховується після аналізу вимог.







