Как устроена работа с камерой в iOS: краткий разбор
Разберем ключевые компоненты AVFoundation для работы с камерой: от подключения устройств до преобразования сырых данных в готовое изображение. Поймем разницу между AVCapturePhoto, CGImage и SwiftUI Image.
Основные компоненты:
🔹 Input: устройство, которое может передавать видео, фото или аудио. Например задняя камера, фронтальная камера или встроенный микрофон.
🔹 Output: фактический вывод устройства. Это может быть фото или видео сохраненные на диске. Либо обработанный вами объект. Например: обнаруженные лица, отсканированные штрихкоды или примененные фильтры.
🔹 Preview: вывод изображения с камеры.
🔹 Stream: непрерывный поток кадров. Обычно вы снимаете один кадр как фотографию или серию кадров как видео. Хотя современные камеры часто объединяют кадры из-за слабого освещения, уменьшения шума и т. д. Поток также доступен для предварительного просмотра.
🔹 Session: объект, предоставляющий интерфейс для добавления/удаления входов и выходов, а также настройки конфигурации сеанса. Позволяет начинать и завершать сеанс.
Важные нюансы:
🔹 Захват фото: асинхронный: метод capturePhoto не возвращает фото сразу - камере нужно время на фокусировку, экспозицию и, возможно, вспышку.
🔹 Разное качество: фото захватываются в максимальном разрешении, а превью - в низком для плавности.
Типичный поток данных:
Камера -> AVCapturePhoto -> Декодирование -> CGImage -> Image (SwiftUI) -> отображение на экране
Либо сохранение в Фото -> PHAsset (ссылка на медиатеке).
Ключевые различия форматов:
🔹 AVCapturePhoto: сырые данные с камеры (ещё не отображенные).
🔹 PHAsset: ссылка на фото/видео в медиатеке (не содержит пиксели).
🔹 CGImage: растровое изображение (можно рисовать).
🔹 Image (SwiftUI): view для отображения.
Тестирование:
🔹 На iOS-симуляторе камера не работает, поэтому лучше тестировать на реальном устройстве.
🔹 На macOS можно тестировать через встроенную камеру Mac.
Вывод:
AVFoundation - мощный, но сложный фреймворк. Главное - понять роль каждого компонента и их взаимодействие.