AVFoundation — to multimedialny framework Apple, który zapewnia pełny cykl pracy z audio, wideo i obrazami na iOS, macOS, tvOS i watchOS. Obejmuje przechwytywanie z kamery i mikrofonu, odtwarzanie plików multimedialnych, edycję ścieżek audio, przetwarzanie dźwięku w czasie rzeczywistym i strumieniowanie przez sieć. Według Apple AVFoundation Documentation (2026), framework jest używany w 90% aplikacji App Store pracujących z treściami multimedialnymi.
Najważniejsze
AVFoundation — to fundamentalny multimedialny framework Apple, wprowadzony już w iOS 4 (2010) jako zamiennik przestarzałego UIWebView do odtwarzania audio i wideo. Od tego czasu AVFoundation ewoluował w pełnoprawny zestaw narzędzi do pracy z dowolnymi typami multimediów: od prostego odtwarzania pliku MP3 po profesjonalne przechwytywanie wideo z wielokanałowego mikrofonu i transformację dźwięku przez efekty czasu rzeczywistego.
Architektura AVFoundation zbudowana jest wokół kilku podstawowych abstrakcji: AVAsset (dane multimedialne), AVPlayer (odtwarzanie), AVCaptureSession (przechwytywanie) i AVAudioEngine (przetwarzanie). Każdy komponent działa asynchronicznie, co jest krytyczne dla zachowania płynności UI podczas ładowania lub przetwarzania dużych plików. Według Apple (WWDC 2025), AVFoundation przetwarza do 8K wideo na urządzeniach z serią chipów M bez utraty wydajności.
AVFoundation zapewnia przechwytywanie wideo z kamery z obsługą 4K ProRes, HDR i do 240 FPS w zwolnionym tempie, nagrywanie i miksowanie audio z wbudowanego i zewnętrznego mikrofonów, odtwarzanie multimediów z obsługą HLS, MPEG-4, QuickTime, MP3, AAC i FLAC, eksport i konwersję plików przez AVAssetExportSession, przetwarzanie dźwięku w czasie rzeczywistym przez AVAudioEngine z efektami pogłosu, korektora i zmiany wysokości dźwięku, a także strumieniowanie przez AirPlay i protokoły sieciowe.
AVFoundation składa się z kilku modułów, z których każdy odpowiada za konkretny obszar pracy z multimediami. Wybór komponentu zależy od zadania: przechwytywanie, odtwarzanie, eksport lub przetwarzanie w czasie rzeczywistym.
| Komponent | Przeznaczenie | Kluczowa klasa |
|---|---|---|
| Przechwytywanie | Praca z kamerą i mikrofonem | AVCaptureSession |
| Odtwarzanie | Odtwarzacz audio i wideo | AVPlayer / AVAudioPlayer |
| Edycja | Kompozycja i montaż | AVMutableComposition |
| Eksport | Konwersja do innych formatów | AVAssetExportSession |
| Silnik audio | Przetwarzanie dźwięku w czasie rzeczywistym | AVAudioEngine |
| Metadane | Odczyt ID3, EXIF i XMP | AVMetadataItem |
AVCaptureSession — centralny obiekt do przechwytywania wideo i audio. Zarządza przychodzącymi strumieniami danych z fizycznych urządzeń (kamera, mikrofon), konfiguruje ich ustawienia (rozdzielczość, FPS, format) i kieruje na wyjście: podgląd (AVCaptureVideoPreviewLayer), zapis do pliku (AVCaptureMovieFileOutput) lub przetwarzanie klatka po klatce (AVCaptureVideoDataOutput).
AVPlayer — uniwersalny odtwarzacz AVFoundation, zdolny do odtwarzania treści multimedialnych zarówno lokalnie, jak i z sieci. AVPlayer obsługuje strumieniowanie HLS, MPEG-4, QuickTime Movie i większość formatów audio. Sterowanie odtwarzaniem odbywa się asynchronicznie przez AVPlayerItem. AVPlayerViewController zapewnia gotowy interfejs użytkownika z elementami sterowania: play/pause, przewijanie, AirPlay i PiP.
Przechwytywanie wideo i audio — jedna z najczęściej używanych możliwości AVFoundation. Konfiguracja sesji przechwytywania obejmuje kilka kroków: utworzenie AVCaptureSession, dodanie wejść (kamera, mikrofon), ustawienie wyjść i uruchomienie sesji.
Rozważmy konfigurację krok po kroku AVCaptureSession do przechwytywania wideo z tylnej kamery iPhone i jednoczesnego nagrywania dźwięku z mikrofonu. Proces składa się z czterech kroków w Swift.
import AVFoundation
// 1. Tworzenie i konfiguracja sesji
let session = AVCaptureSession()
session.sessionPreset = .hd1920x1080
// 2. Dodawanie wejścia kamery
guard let camera = AVCaptureDevice.default(
for: .video
) else { return }
let cameraInput = try? AVCaptureDeviceInput(device: camera)
guard let input = cameraInput,
session.canAddInput(input)
else { return }
session.addInput(input)
// 3. Dodawanie wyjścia do nagrywania
let output = AVCaptureMovieFileOutput()
guard session.canAddOutput(output) else { return }
session.addOutput(output)
// 4. Uruchomienie sesji
session.startRunning()
Kod Swift tworzy AVCaptureSession z presetem Full HD, podłącza tylną kamerę jako źródło wideo i dodaje wyjście do zapisu w pliku. Po uruchomieniu session.startRunning() kamera zaczyna przesyłać klatki na podgląd i do pliku wyjściowego. Zatrzymanie nagrywania wykonuje się przez output.stopRecording() z możliwością zapisu do galerii.
Do przechwytywania tylko audio (bez wideo) w AVCaptureSession dodaje się tylko mikrofon przez AVCaptureDevice.default(.audio). Wyjściem jest AVAudioFileOutput lub AVCaptureAudioDataOutput do przetwarzania dźwięku w czasie rzeczywistym. AVFoundation obsługuje przechwytywanie wielokanałowe: do 8 kanałów audio na iPad Pro i do 2 na iPhone, co pozwala nagrywać dźwięk stereo z zewnętrznych mikrofonów przez złącze Lightning, USB-C lub Bluetooth. Wybór źródła sygnału wejściowego wykonuje się przez AVAudioSession.sharedInstance().setPreferredInput, co jest kluczowe dla aplikacji pracujących z zewnętrznymi słuchawkami i mikrofonami Bluetooth.
AVFoundation zapewnia dwa główne sposoby odtwarzania multimediów: AVPlayer dla wideo i AVAudioPlayer dla audio. Rozważmy przykład odtwarzania zdalnego strumienia HLS przez AVPlayer.
Kod tworzy AVPlayer, ładuje strumień HLS po URL i uruchamia odtwarzanie z obniżonym poziomem głośności. AVPlayerItem zarządza stanem ładowania i buforowania, a obserwacja KVO statusu pozwala obsługiwać błędy.
import AVFoundation
import AVKit
// 1. Tworzenie AVPlayer z strumieniem HLS
let url = URL(
string: "https://example.com/stream.m3u8"
) !
let player = AVPlayer(url: url)
player.volume = 0.7
// 2. Odtwarzanie
player.play()
// 3. Wyświetlanie odtwarzacza
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true)
// 4. Monitorowanie statusu
player.currentItem?.addObserver(
self,
forKeyPath: "status",
options: .new,
context: nil
)
Kod tworzy AVPlayer z URL HLS, ustawia głośność na 70% i uruchamia odtwarzanie. AVPlayerViewController zapewnia wbudowany interfejs z elementami sterowania, AirPlay i trybem obraz w obrazie. Status odtwarzacza jest śledzony przez KVO w celu obsługi przypadków, gdy strumień HLS jest tymczasowo niedostępny.
Do odtwarzania audio bez interfejsu wideo używa się AVAudioPlayer — lekkiego odtwarzacza, który nie wymaga AVPlayerItem. AVAudioPlayer obsługuje formaty audio MP3, AAC, ALAC, FLAC, WAV i AIFF, udostępnia metody play(), pause() i stop(), a także delegata AVAudioPlayerDelegate do śledzenia zakończenia odtwarzania i błędów dekodowania. AVAudioPlayer jest idealny do odtwarzania muzyki w tle, podcastów i efektów dźwiękowych w grach na iOS i macOS.
Rozważmy jeszcze dwa charakterystyczne scenariusze pracy z AVFoundation: przetwarzanie audio przez AVAudioEngine i eksport wideo do innego formatu.
AVAudioEngine umożliwia przetwarzanie audio w czasie rzeczywistym, łącząc węzły (nodes) w graf przetwarzania: węzeł wejściowy (mikrofon) → efekty → węzeł wyjściowy (głośnik). W poniższym przykładzie dodawany jest pogłos do głosu.
let engine = AVAudioEngine()
let reverb = AVAudioUnitReverb()
// Konfiguracja pogłosu
reverb.loadFactoryPreset(.largeHall)
reverb.wetDryMix = 40
// Podłączenie: mikrofon -> pogłos -> głośnik
engine.attach(reverb)
engine.connect(
engine.inputNode,
to: reverb,
format: nil
)
engine.connect(
reverb,
to: engine.mainMixerNode,
format: nil
)
try? engine.start()
AVAudioEngine tworzy graf z trzech węzłów: wejście (mikrofon), efekt (pogłos z presetem dużej sali) i wyjście (głośnik). Po engine.start() dźwięk z mikrofonu jest przetwarzany przez efekt w czasie rzeczywistym i wyprowadzany na słuchawki lub głośnik urządzenia. Opóźnienie przetwarzania wynosi mniej niż 10 ms na wszystkich nowoczesnych urządzeniach Apple.
Dodatkowa możliwość AVAudioEngine — analiza dźwięku przez AVAudioUnitEQ i AVAudioUnitMixer. Deweloper może dodać korektor, kompresor i limiter do dowolnego strumienia audio. Dla aplikacji muzycznych AVFoundation udostępnia AVAudioSequencer do odtwarzania plików MIDI i AVSpeechSynthesizer do syntezy mowy. Wszystkie komponenty działają w jednym grafie audio, co daje opóźnienie między przechwytywaniem a przetwarzaniem poniżej 5 ms na urządzeniach Apple.
Podczas pracy z AVFoundation ważne jest uwzględnienie uprawnień systemowych: do dostępu do kamery wymagane jest NSCameraUsageDescription w Info.plist, do mikrofonu — NSMicrophoneUsageDescription. AVFoundation automatycznie wyświetla systemowe okno dialogowe prośby o pozwolenie przy pierwszej próbie dostępu do urządzenia. Odmowa użytkownika jest obsługiwana przez AVCaptureDevice.authorizationStatus(), co pozwala poprawnie wyświetlić komunikat o niedostępności kamery z propozycją przejścia do ustawień.
AVFoundation obsługuje odtwarzanie audio w tle przez Audio Background Mode w Capabilities projektu. Do aktywacji wystarczy dodać wpis audio w UIBackgroundModes Info.plist i skonfigurować AVAudioSession z kategorią .playback. Wideo w tle nie jest odtwarzane domyślnie, ale można użyć AVPlayer z trybem pictureInPicture do kontynuowania wyświetlania wideo w zminimalizowanej aplikacji na iPad. Ikona trybu PiP jest konfigurowana przez AVPictureInPictureController wraz z delegatem protokołu.
Często zadawane pytania
iOS 4+ do podstawowego odtwarzania i przechwytywania. iOS 8+ dla AVAudioEngine. iOS 17+ dla AVAssetWriter w trybie HDR. Aktualna wersja frameworka jest obsługiwana na wszystkich urządzeniach iPhone, iPad i Mac.
Tak, AVPlayer obsługuje HLS (HTTP Live Streaming) — główny protokół Apple do strumieniowania. Do wysyłania multimediów na serwer użyj AVAssetWriter z własnym protokołem na bazie URLSession.
AVFoundation — to niskopoziomowy framework do pracy z multimediami. AVKit — nakładka na AVFoundation, udostępniająca gotowe komponenty UI: AVPlayerViewController, AVPictureInPictureController i AVPipView.
Tak, od iOS 11 AVFoundation obsługuje FLAC (Free Lossless Audio Codec) do odtwarzania. ALAC (Apple Lossless) jest obsługiwany od iOS 4. Oba kodeki działają przez AVAudioPlayer i AVPlayer.
Przez RPScreenRecorder z ReplayKit, który wewnętrznie używa AVFoundation. Od iOS 9 nagrywanie ekranu jest dostępne przez RPScreenRecorder.shared().startRecording() z opcjonalnym mikrofonem.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również