AVFoundation для Swift: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в AVFoundation

AVFoundation — это мощный фреймворк от Apple, предназначенный для работы с аудио и видео на платформах iOS, macOS, tvOS и watchOS. Он предоставляет разработчикам высокоуровневый API для захвата, обработки, воспроизведения и редактирования мультимедийного контента. В отличие от более низкоуровневых решений (например, Core Audio или Video Toolbox), AVFoundation абстрагирует сложные детали кодеков, контейнеров и синхронизации, позволяя сосредоточиться на логике приложения.

Зачем нужна AVFoundation? Она позволяет решать широкий спектр задач:

  • Воспроизведение: Проигрывание аудиофайлов (MP3, AAC, WAV) и видеофайлов (MP4, MOV, M4V) с поддержкой субтитров и глав.
  • Запись: Захват видео с камеры и аудио с микрофона в реальном времени.
  • Редактирование: Создание композиций из нескольких треков, наложение эффектов, обрезка, изменение скорости.
  • Обработка: Извлечение метаданных, работа с аудиосэмплами, применение фильтров.
  • Стриминг: Воспроизведение HLS (HTTP Live Streaming) контента.

AVFoundation является стандартом де-факто для разработки под Apple. Если вы пишете приложение, которое должно проигрывать музыку, записывать видео или редактировать подкасты — вы будете использовать именно этот фреймворк.

Установка (Подключение к проекту)

AVFoundation не устанавливается через pip или npm, так как это нативный фреймворк Apple. Он встроен в Xcode и SDK. Для его использования достаточно импортировать модуль в файлы Swift.

Шаги для подключения:

  1. Откройте ваш проект в Xcode.
  2. В любом файле Swift, где требуется работа с мультимедиа, добавьте строку импорта:
import AVFoundation

Никаких дополнительных действий не требуется. Фреймворк автоматически доступен для всех проектов iOS/macOS.

Настройка разрешений (iOS)

Для работы с камерой и микрофоном необходимо добавить строки в файл Info.plist:

  • NSCameraUsageDescription — описание, зачем приложению камера.
  • NSMicrophoneUsageDescription — описание, зачем приложению микрофон.

Без этих ключей приложение упадет с ошибкой при попытке доступа к устройствам.

Быстрый старт: Воспроизведение аудио

Самый простой пример — проигрывание локального аудиофайла. Создайте экземпляр AVAudioPlayer и вызовите метод play().

import AVFoundation
import UIKit

class ViewController: UIViewController {
    var audioPlayer: AVAudioPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 1. Находим путь к файлу в Bundle
        guard let path = Bundle.main.path(forResource: "sample", ofType: "mp3") else {
            print("Файл не найден")
            return
        }
        
        let url = URL(fileURLWithPath: path)
        
        do {
            // 2. Инициализируем плеер
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            // 3. Подготавливаем к воспроизведению (опционально, но рекомендуется)
            audioPlayer?.prepareToPlay()
            // 4. Запускаем
            audioPlayer?.play()
            print("Воспроизведение начато")
        } catch {
            print("Ошибка инициализации плеера: \(error.localizedDescription)")
        }
    }
}

Этот код создает плеер, загружает файл sample.mp3 из ресурсов приложения и начинает его проигрывание.

Основные классы и методы

Ниже приведены ключевые классы и методы AVFoundation, которые используются в 90% задач. Для каждого метода дано описание, параметры и рабочий пример.

1. AVAudioPlayer

Что делает: Воспроизводит аудиофайлы из памяти или файловой системы. Поддерживает паузу, остановку, регулировку громкости и позиции.

Метод: init(contentsOf:)

Описание: Инициализирует плеер с аудиофайлом по URL.

Параметры:

  • url: URL — URL локального файла.
  • fileTypeHint: String? — (опционально) подсказка типа файла, например "mp3".

Пример:

guard let url = Bundle.main.url(forResource: "music", withExtension: "m4a") else { return }
do {
    let player = try AVAudioPlayer(contentsOf: url)
    player.play()
} catch {
    print(error)
}

Метод: play()

Описание: Начинает или возобновляет воспроизведение.

Параметры: Нет.

Пример:

audioPlayer?.play()

Метод: pause()

Описание: Приостанавливает воспроизведение без сброса позиции.

Параметры: Нет.

Пример:

audioPlayer?.pause()

Метод: stop()

Описание: Останавливает воспроизведение и сбрасывает позицию на начало.

Параметры: Нет.

Пример:

audioPlayer?.stop()
audioPlayer?.currentTime = 0 // Сброс времени

Свойство: volume

Описание: Устанавливает громкость (0.0 — тишина, 1.0 — максимум).

Параметры: Float.

Пример:

audioPlayer?.volume = 0.5 // 50% громкости

2. AVCaptureSession

Что делает: Управляет потоком данных от устройств захвата (камера, микрофон) к выходам (файл, предварительный просмотр).

Метод: addInput(_:)

Описание: Добавляет источник данных (например, камеру).

Параметры:

  • input: AVCaptureInput — объект, представляющий устройство ввода.

Пример:

let session = AVCaptureSession()
guard let camera = AVCaptureDevice.default(for: .video) else { return }
do {
    let input = try AVCaptureDeviceInput(device: camera)
    if session.canAddInput(input) {
        session.addInput(input)
    }
} catch {
    print(error)
}

Метод: addOutput(_:)

Описание: Добавляет получатель данных (например, запись в файл).

Параметры:

  • output: AVCaptureOutput — объект, обрабатывающий выходные данные.

Пример:

let movieOutput = AVCaptureMovieFileOutput()
if session.canAddOutput(movieOutput) {
    session.addOutput(movieOutput)
}

Метод: startRunning()

Описание: Запускает поток данных от входа к выходу.

Параметры: Нет.

Пример:

session.startRunning()

Метод: stopRunning()

Описание: Останавливает поток данных.

Параметры: Нет.

Пример:

session.stopRunning()

3. AVPlayer

Что делает: Продвинутый плеер для аудио и видео, поддерживающий стриминг и управление очередью.

Метод: init(url:)

Описание: Создает плеер для воспроизведения контента по URL (локальный или удаленный).

Параметры:

  • url: URL — URL медиафайла.

Пример:

let url = URL(string: "https://example.com/video.mp4")!
let player = AVPlayer(url: url)
player.play()

Метод: play()

Описание: Начинает воспроизведение.

Параметры: Нет.

Пример:

player.play()

Метод: pause()

Описание: Приостанавливает воспроизведение.

Параметры: Нет.

Пример:

player.pause()

Свойство: rate

Описание: Управляет скоростью воспроизведения. 1.0 — нормальная, 2.0 — двойная, 0.5 — половинная.

Параметры: Float.

Пример:

player.rate = 2.0 // Ускоренное воспроизведение

4. AVMutableComposition

Что делает: Позволяет создавать и редактировать мультимедийные композиции из нескольких треков.

Метод: addMutableTrack(withMediaType:preferredTrackID:)

Описание: Добавляет новый трек в композицию.

Параметры:

  • mediaType: AVMediaType — тип медиа (.audio, .video).
  • preferredTrackID: CMPersistentTrackID — идентификатор трека (обычно kCMPersistentTrackID_Invalid).

Пример:

let composition = AVMutableComposition()
guard let videoTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid) else { return }
// Теперь в videoTrack можно добавлять сегменты из исходных файлов

Метод: insertTimeRange(_:of:at:)

Описание: Вставляет часть одного трека в другой в указанное время.

Параметры:

  • timeRange: CMTimeRange — диапазон времени для вставки.
  • assetTrack: AVAssetTrack — исходный трек.
  • startTime: CMTime — время вставки в целевом треке.

Пример:

let asset = AVAsset(url: videoURL)
let assetTrack = asset.tracks(withMediaType: .video).first!
let timeRange = CMTimeRange(start: .zero, duration: asset.duration)
try videoTrack.insertTimeRange(timeRange, of: assetTrack, at: .zero)

5. AVCaptureVideoDataOutput

Что делает: Предоставляет доступ к видеокадрам в реальном времени для обработки (например, распознавание лиц).

Метод: setSampleBufferDelegate(_:queue:)

Описание: Устанавливает делегат для получения буферов сэмплов.

Парамет

Рекомендаций