AVFoundation — är ett multimediakramverk från Apple som ger en fullständig cykel för arbete med ljud, video och bilder på iOS, macOS, tvOS och watchOS. Det omfattar inspelning från kamera och mikrofon, uppspelning av mediafiler, redigering av ljudspår, ljudbearbetning i realtid och streaming över nätverk. Enligt Apple AVFoundation Documentation (2026) används ramverket i 90% av App Store-applikationer som arbetar med mediainnehåll.
Huvudpunkter
AVFoundation — är ett grundläggande multimediakramverk från Apple, introducerat redan i iOS 4 (2010) som ersättning för den föråldrade UIWebView för ljud- och videouppspelning. Sedan dess har AVFoundation utvecklats till en komplett uppsättning verktyg för att arbeta med alla typer av media: från enkel uppspelning av en MP3-fil till professionell videofångst med flerkanalsmikrofon och ljudtransformering via effekter i realtid.
Arkitekturen i AVFoundation är byggd kring flera grundläggande abstraktioner: AVAsset (mediadata), AVPlayer (uppspelning), AVCaptureSession (fångst) och AVAudioEngine (bearbetning). Varje komponent arbetar asynkront, vilket är avgörande för att bibehålla UI:s jämnhet vid laddning eller bearbetning av stora filer. Enligt Apple (WWDC 2025) bearbetar AVFoundation video upp till 8K på enheter med M-seriens chips utan prestandaförlust.
AVFoundation erbjuder videofångst från kamera med stöd för 4K ProRes, HDR och upp till 240 FPS i slowmotion, inspelning och mixning av ljud från inbyggd och extern mikrofon, mediauppspelning med stöd för HLS, MPEG-4, QuickTime, MP3, AAC och FLAC, export och konvertering av filer via AVAssetExportSession, ljudbearbetning i realtid via AVAudioEngine med effekter som reverberation, equalizer och pitch-shifting, samt streaming via AirPlay och nätverksprotokoll.
AVFoundation består av flera moduler, var och en ansvarig för ett specifikt område av mediaarbete. Valet av komponent beror på uppgiften: fångst, uppspelning, export eller bearbetning i realtid.
| Komponent | Syfte | Nyckelklass |
|---|---|---|
| Fångst | Arbete med kamera och mikrofon | AVCaptureSession |
| Uppspelning | Ljud- och videospelare | AVPlayer / AVAudioPlayer |
| Redigering | Komposition och montage | AVMutableComposition |
| Export | Konvertering till andra format | AVAssetExportSession |
| Ljudmotor | Ljudbearbetning i realtid | AVAudioEngine |
| Metadata | Läsning av ID3, EXIF och XMP | AVMetadataItem |
AVCaptureSession — det centrala objektet för att fånga video och ljud. Det hanterar inkommande dataströmmar från fysiska enheter (kamera, mikrofon), konfigurerar deras inställningar (upplösning, FPS, format) och dirigerar dem till utgång: förhandsvisning (AVCaptureVideoPreviewLayer), inspelning till fil (AVCaptureMovieFileOutput) eller bild-för-bild-bearbetning (AVCaptureVideoDataOutput).
AVPlayer — en universell AVFoundation-spelare som kan spela upp mediainnehåll både lokalt och över nätverk. AVPlayer stöder HLS-streaming, MPEG-4, QuickTime Movie och de flesta ljudformat. Uppspelningskontrollen sker asynkront via AVPlayerItem. AVPlayerViewController ger ett färdigt användargränssnitt med kontrollknappar: play/pause, skrubba, AirPlay och PiP.
Video- och ljudfångst — en av de mest efterfrågade funktionerna i AVFoundation. Konfiguration av en fångstsession omfattar flera steg: skapa AVCaptureSession, lägga till ingångar (kamera, mikrofon), ställa in utgångar och starta sessionen.
Låt oss undersöka steg-för-steg-konfigurationen av AVCaptureSession för att fånga video från iPhones bakre kamera och samtidigt spela in ljud från mikrofonen. Processen består av fyra steg i Swift.
import AVFoundation
// 1. Skapa och konfigurera session
let session = AVCaptureSession()
session.sessionPreset = .hd1920x1080
// 2. Lägga till kameraingång
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. Lägga till utgång för inspelning
let output = AVCaptureMovieFileOutput()
guard session.canAddOutput(output) else { return }
session.addOutput(output)
// 4. Starta session
session.startRunning()
Swift-koden skapar en AVCaptureSession med Full HD-förinställning, ansluter bakre kameran som videokälla och lägger till en utgång för inspelning till fil. Efter att session.startRunning() startats börjar kameran skicka bildrutor till förhandsvisningen och utdatafilen. Inspelningen stoppas via output.stopRecording() med möjlighet att spara i galleriet.
För att fånga endast ljud (utan video) läggs endast mikrofonen till i AVCaptureSession via AVCaptureDevice.default(.audio). Utgången är AVAudioFileOutput eller AVCaptureAudioDataOutput för ljudbearbetning i realtid. AVFoundation stöder flerkanalsfångst: upp till 8 ljudkanaler på iPad Pro och upp till 2 på iPhone, vilket möjliggör stereoljudsinspelning från externa mikrofoner via Lightning-, USB-C- eller Bluetooth-kontakt. Valet av insignalkälla görs via AVAudioSession.sharedInstance().setPreferredInput, vilket är avgörande för applikationer som arbetar med externa headsets och Bluetooth-mikrofoner.
AVFoundation erbjuder två huvudsakliga sätt att spela upp media: AVPlayer för video och AVAudioPlayer för ljud. Låt oss titta på ett exempel på uppspelning av en extern HLS-ström via AVPlayer.
Koden skapar en AVPlayer, laddar HLS-strömmen från en URL och startar uppspelning med sänkt volymnivå. AVPlayerItem hanterar laddnings- och buffertillstånd, och KVO-observation av statusen möjliggör felhantering.
import AVFoundation
import AVKit
// 1. Skapa AVPlayer med HLS-ström
let url = URL(
string: "https://example.com/stream.m3u8"
) !
let player = AVPlayer(url: url)
player.volume = 0.7
// 2. Uppspelning
player.play()
// 3. Visa spelaren
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true)
// 4. Övervaka status
player.currentItem?.addObserver(
self,
forKeyPath: "status",
options: .new,
context: nil
)
Koden skapar en AVPlayer med HLS-URL, ställer in volymen på 70% och startar uppspelning. AVPlayerViewController ger ett inbyggt användargränssnitt med kontrollknappar, AirPlay och bild-i-bild-läge. Spelarens status övervakas via KVO för att hantera fall när HLS-strömmen är tillfälligt otillgänglig.
För ljuduppspelning utan videogränssnitt används AVAudioPlayer — en lätt spelare som inte kräver AVPlayerItem. AVAudioPlayer stöder ljudformaten MP3, AAC, ALAC, FLAC, WAV och AIFF, tillhandahåller metoderna play(), pause() och stop(), samt AVAudioPlayerDelegate för att övervaka slutet av uppspelning och avkodningsfel. AVAudioPlayer är idealisk för bakgrundsmusik, podcaster och ljudeffekter i spel på iOS och macOS.
Låt oss titta på ytterligare två karaktäristiska scenarier för arbete med AVFoundation: ljudbearbetning via AVAudioEngine och videexport till ett annat format.
AVAudioEngine möjliggör ljudbearbetning i realtid genom att koppla samman noder (nodes) i en bearbetningsgraf: ingångsnod (mikrofon) → effekter → utgångsnod (högtalare). I exemplet nedan läggs reverberation till rösten.
let engine = AVAudioEngine()
let reverb = AVAudioUnitReverb()
// Konfigurera reverberation
reverb.loadFactoryPreset(.largeHall)
reverb.wetDryMix = 40
// Anslutning: mikrofon -> reverberation -> högtalare
engine.attach(reverb)
engine.connect(
engine.inputNode,
to: reverb,
format: nil
)
engine.connect(
reverb,
to: engine.mainMixerNode,
format: nil
)
try? engine.start()
AVAudioEngine skapar en graf med tre noder: ingång (mikrofon), effekt (reverberation med förinställning för stor sal) och utgång (högtalare). Efter engine.start() bearbetas ljudet från mikrofonen i realtid av effekten och skickas till hörlurarna eller enhetens högtalare. Bearbetningsfördröjningen är mindre än 10 ms på alla moderna Apple-enheter.
En ytterligare funktion hos AVAudioEngine — ljudanalys via AVAudioUnitEQ och AVAudioUnitMixer. Utvecklaren kan lägga till en equalizer, kompressor och limiter till vilken ljudström som helst. För musikapplikationer tillhandahåller AVFoundation AVAudioSequencer för uppspelning av MIDI-filer och AVSpeechSynthesizer för talsyntes. Alla komponenter arbetar i en enda ljudgraf, vilket ger en fördröjning mellan fångst och bearbetning på mindre än 5 ms på Apple-enheter.
Vid arbete med AVFoundation är det viktigt att ta hänsyn till systembehörigheter: för kameratillgång krävs NSCameraUsageDescription i Info.plist, för mikrofon — NSMicrophoneUsageDescription. AVFoundation visar automatiskt systemdialogrutan för behörighetsbegäran vid första försöket att komma åt enheten. Användarens avslag hanteras via AVCaptureDevice.authorizationStatus(), vilket gör det möjligt att korrekt visa ett meddelande om att kameran inte är tillgänglig med ett förslag att gå till inställningarna.
AVFoundation stöder ljuduppspelning i bakgrunden via Audio Background Mode i projektets Capabilities. För aktivering räcker det att lägga till en audiopost i UIBackgroundModes Info.plist och konfigurera AVAudioSession med kategorin .playback. Video spelas inte upp i bakgrunden som standard, men du kan använda AVPlayer med bild-i-bild-läge för att fortsätta visa video i den minimerade appen på iPad. Ikonen för PiP-läget konfigureras via AVPictureInPictureController tillsammans med protokolldelegerade.
Vanliga frågor
iOS 4+ för grundläggande uppspelning och fångst. iOS 8+ för AVAudioEngine. iOS 17+ för AVAssetWriter i HDR-läge. Den aktuella versionen av ramverket stöds på alla iPhone-, iPad- och Mac-enheter.
Ja, AVPlayer stöder HLS (HTTP Live Streaming) — Apples huvudprotokoll för streaming. För att skicka media till servern, använd AVAssetWriter med ett anpassat protokoll ovanpå URLSession.
AVFoundation — är ett lågnivåramverk för att arbeta med media. AVKit — ett lager ovanpå AVFoundation som tillhandahåller färdiga UI-komponenter: AVPlayerViewController, AVPictureInPictureController och AVPipView.
Ja, från iOS 11 stöder AVFoundation FLAC (Free Lossless Audio Codec) för uppspelning. ALAC (Apple Lossless) stöds från iOS 4. Båda codecarna fungerar via AVAudioPlayer och AVPlayer.
Via RPScreenRecorder från ReplayKit, som internt använder AVFoundation. Från iOS 9 är skärminspelning tillgänglig via RPScreenRecorder.shared().startRecording() med valfri mikrofon.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också