Введение в 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.
Шаги для подключения:
- Откройте ваш проект в Xcode.
- В любом файле 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:)
Описание: Устанавливает делегат для получения буферов сэмплов.
Парамет