При попытке реализовать одновременную запись с фронтальной и задней камеры разработчики сталкиваются с рядом неочевидных проблем: AVCaptureMultiCamSession молча возвращает ошибку, если превышен лимит hardwareCost, а на Android перечень логических мультикамер ограничен производителем. Без грамотной архитектуры мультикамерная сессия либо не запустится, либо приведёт к падению производительности. В проекте для логистической компании мы столкнулись с необходимостью записи одновременно с водителем (фронтальная камера) и дорогой (задняя). Пришлось учесть аппаратные ограничения и обеспечить graceful degradation для старых устройств.
Почему мультикамерная съемка сложнее, чем кажется?
На iOS AVCaptureMultiCamSession доступен только на устройствах с A12 и новее — это первое, что проверяем через isMultiCamSupported. На старых устройствах делаем graceful degradation: только одна камера или последовательная запись. На Android мультикамерность через Camera2 API требует проверки CameraCharacteristics.LOGICAL_MULTI_CAMERA_SENSOR_TYPE и списка физических камер через getPhysicalCameraIds(). Одновременный захват с двух физических камер доступен с Android 9 (API 28), но реальная поддержка сильно варьируется. Например, Samsung и Pixel работают стабильно, а некоторые MediaTek-устройства имеют ограничения.
Сравнение iOS и Android
| Критерий | iOS (AVCaptureMultiCamSession) | Android (Camera2) |
|---|---|---|
| Минимальная версия | A12+ (iPhone XS) | API 28 (Android 9) |
| Пиковая нагрузка (1080p/30fps) | hardwareCost 0.9–1.0 | зависит от SoC |
| Системная обратная связь | systemPressureStateNotification | CaptureResult.STATISTICS_SCENE_FLICKER |
| PiP в реальном времени | через AVCaptureVideoDataOutput | через ImageReader + OpenGL |
| Требуется ли проверка? | isMultiCamSupported |
LOGICAL_MULTI_CAMERA + getPhysicalCameraIds() |
Как решить проблему перегрева при мультикамерной съемке?
AVCaptureMultiCamSession потребляет значительно больше энергии, чем одиночная сессия. На iPhone 12 mini hardwareCost при двух потоках в 1080/30fps может достигать 1.0 — превышение приведёт к тому, что startRunning() молча вернёт ошибку. Решение: уменьшаем разрешение одной из камер до 720p или снижаем frameRate до 24fps. Подписываемся на systemPressureStateNotification, при уровне .critical снижаем frameRate до 15fps, при .shutdown останавливаем запись. Такой подход эффективнее, чем попытка эмулировать мультикамеру через отдельные сессии — нагрузка на процессор снижается, а стабильность растёт.
Пиковый сценарий: Picture-in-Picture при записи — разработка мультикамерной съемки
Два видеопотока записываются в отдельные файлы. Для финального PiP-видео используем AVMutableComposition: основной поток на весь экран, второй — масштабируем через AVMutableVideoCompositionLayerInstruction.setTransform() в угол. AVVideoCompositionInstruction с двумя layerInstructions собирает итоговый файл.
Как реализовать мультикамерную съемку на iOS?
let session = AVCaptureMultiCamSession() // Задняя камера let backInput = try AVCaptureDeviceInput(device: backCamera) let backOutput = AVCaptureMovieFileOutput() let backConnection = AVCaptureMultiCamSession.Connection( inputPort: backInput.ports[0], output: backOutput) // Фронтальная камера let frontInput = try AVCaptureDeviceInput(device: frontCamera) let frontOutput = AVCaptureMovieFileOutput() session.addInputWithNoConnections(backInput) session.addOutput(backOutput) session.addInputWithNoConnections(frontInput) session.addOutput(frontOutput) session.addConnection(backConnection) Важно: hardwareCost и systemPressureCost сессии могут превысить допустимый предел. Уменьшаем разрешение одной из камер до 720p, если hardwareCost > 1.0. Иначе startRunning() завершится с ошибкой без явного сообщения.
Что делать, если устройство не поддерживает мультикамеру?
Если проверка isMultiCamSupported возвращает false, используем альтернативную архитектуру: запись поочерёдно с одной камеры, а затем монтаж. На iOS можно применить AVCaptureSession без мультикамерного режима, на Android — стандартную сессию с одной камерой. Это снижает нагрузку и гарантирует стабильность на старых устройствах. Такой подход мы применяли в проектах для логистических компаний, где требовалась запись одновременно с водителем и дорогой — в итоге получили стабильную работу на 90% устройств.
Реализация на Android (Kotlin)
val cameraManager = getSystemService(CameraManager::class.java) val multiCameraId = cameraManager.cameraIdList.firstOrNull { id -> val chars = cameraManager.getCameraCharacteristics(id) chars.get(REQUEST_AVAILABLE_CAPABILITIES) ?.contains(REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) == true } Открываем CameraDevice, создаём CaptureSession с поверхностями обеих камер. Для CameraX — CameraSelector с физическим ID через CameraSelector.Builder().addCameraFilter().
Сравнение устройств по совместимости
| Модель | iOS | Android | Комментарий |
|---|---|---|---|
| iPhone 12 Pro | AVCaptureMultiCamSession | — | Стабильно работает |
| Samsung Galaxy S21 | — | Logical multi-camera | Рекомендуется |
| Xiaomi Mi 11 | — | Logical multi-camera | Возможны ограничения |
| Google Pixel 5 | — | Logical multi-camera | Хорошая поддержка |
Flutter: когда нужна кросс-платформа
Прямой мультикамерный захват через пакет camera не поддерживается. Решение — MethodChannel + нативная реализация на Swift/Kotlin, которую передаём во Flutter через Texture виджет. Такой подход требует больше времени на разработку, но даёт полный контроль над ресурсами.
Процесс работы
- Аналитика: определяем целевые устройства и требования к качеству видео.
- Проектирование: выбираем стек (нативный/кросс-платформа) и архитектуру (раздельные потоки или PiP).
- Реализация: пишем код с учётом аппаратных ограничений и graceful degradation.
- Тестирование: проверяем на реальных устройствах (минимум 5 моделей) в разных условиях освещения и температуры.
- Деплой: настраиваем provisioning profiles, загружаем в App Store Connect и Google Play Console.
Сроки и что входит
Срок реализации базовой версии (iOS + Android) — от 3 до 5 дней. PiP-композиция финального видео добавляет ещё 1–2 дня. В стоимость входит:
- Исходный код с комментариями
- Документация по интеграции
- Настройка Code Signing и provisioning profiles
- Проверка на 5 реальных устройствах
- Консультация после запуска
Более 5 лет опыта в мобильной разработке и 50+ реализованных проектов с мультикамерной съемкой гарантируют стабильную работу приложения. Получите консультацию по вашему проекту — свяжитесь с нами для технической оценки. Apple Developer Documentation: AVCaptureMultiCamSession







