Какой у вас опыт работы с фреймворком AVFoundation?

«Какой у вас опыт работы с фреймворком AVFoundation?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Есть опыт работы с AVFoundation для захвата, воспроизведения, обработки и экспорта аудио/видео контента.

Ключевые области применения:

  • Запись медиа: Настройка AVCaptureSession, работа с устройствами (AVCaptureDevice), обработка входных данных (AVCaptureInput) и вывод (AVCaptureOutput, AVCaptureMovieFileOutput).
  • Воспроизведение: Использование AVPlayer, AVPlayerLayer для видео и AVAudioPlayer для аудио.
  • Обработка и композиция: Монтаж дорожек (AVMutableComposition), добавление эффектов (AVVideoComposition), работа с метаданными (AVAsset).
  • Экспорт: Конвертация и сжатие через AVAssetExportSession.
  • Анализ и синтез аудио: Использование AVAudioEngine для создания цепочек обработки в реальном времени.

Пример настройки сессии для записи видео:

import AVFoundation

class CameraManager: NSObject {
    private let captureSession = AVCaptureSession()
    private let videoOutput = AVCaptureMovieFileOutput()

    func setup() throws {
        captureSession.beginConfiguration()

        // 1. Находим и добавляем видеовход
        guard let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back),
              let videoInput = try? AVCaptureDeviceInput(device: videoDevice),
              captureSession.canAddInput(videoInput) else {
            throw SetupError.cameraUnavailable
        }
        captureSession.addInput(videoInput)

        // 2. Находим и добавляем аудиовход
        guard let audioDevice = AVCaptureDevice.default(for: .audio),
              let audioInput = try? AVCaptureDeviceInput(device: audioDevice),
              captureSession.canAddInput(audioInput) else {
            throw SetupError.microphoneUnavailable
        }
        captureSession.addInput(audioInput)

        // 3. Добавляем выход для записи в файл
        guard captureSession.canAddOutput(videoOutput) else {
            throw SetupError.cannotAddOutput
        }
        captureSession.addOutput(videoOutput)

        // 4. Устанавливаем качество записи
        if captureSession.canSetSessionPreset(.hd1920x1080) {
            captureSession.sessionPreset = .hd1920x1080
        }

        captureSession.commitConfiguration()
    }

    func startRecording(to fileURL: URL) {
        guard !videoOutput.isRecording else { return }
        videoOutput.startRecording(to: fileURL, recordingDelegate: self)
    }
}

// Расширение для обработки событий записи
extension CameraManager: AVCaptureFileOutputRecordingDelegate {
    func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
        // Обработка завершения записи
    }
}

Важно: Работа с AVFoundation требует управления состоянием сессии, обработки разрешений (Privacy - Camera/Microphone Usage Description) и учета фонового режима приложения.