AVFoundation è il framework multimediale di Apple che fornisce un flusso di lavoro completo per lavorare con audio, video e immagini su iOS, macOS, tvOS e watchOS. Copre l'acquisizione da fotocamera e microfono, la riproduzione di file multimediali, l'editing di tracce audio, l'elaborazione del suono in tempo reale e lo streaming in rete. Secondo Apple AVFoundation Documentation (2026), il framework è utilizzato nel 90% delle applicazioni App Store che lavorano con contenuti multimediali.
Punti chiave
AVFoundation è il framework multimediale fondamentale di Apple, introdotto già in iOS 4 (2010) come sostituto del deprecato UIWebView per la riproduzione audio e video. Da allora, AVFoundation si è evoluto in un set completo di strumenti per lavorare con tutti i tipi di media: dalla semplice riproduzione di file MP3 all'acquisizione video professionale con microfono multicanale e alla trasformazione del suono tramite effetti in tempo reale.
L'architettura di AVFoundation è costruita attorno a diverse astrazioni di base: AVAsset (dati multimediali), AVPlayer (riproduzione), AVCaptureSession (acquisizione) e AVAudioEngine (elaborazione). Ogni componente opera in modo asincrono, il che è fondamentale per mantenere la fluidità dell'interfaccia utente durante il caricamento o l'elaborazione di file di grandi dimensioni. Secondo Apple (WWDC 2025), AVFoundation gestisce video fino a 8K su dispositivi con chip della serie M senza perdita di prestazioni.
AVFoundation fornisce acquisizione video dalla fotocamera con supporto per 4K ProRes, HDR e fino a 240 FPS in slow-motion, registrazione e missaggio audio da microfoni integrati ed esterni, riproduzione multimediale con supporto per HLS, MPEG-4, QuickTime, MP3, AAC e FLAC, esportazione e conversione di file tramite AVAssetExportSession, elaborazione audio in tempo reale attraverso AVAudioEngine con effetti di riverbero, equalizzatore e pitch-shifting, nonché streaming tramite AirPlay e protocolli di rete.
AVFoundation è costituito da diversi moduli, ciascuno responsabile di un'area specifica del lavoro multimediale. La scelta del componente dipende dall'attività: acquisizione, riproduzione, esportazione o elaborazione in tempo reale.
| Componente | Scopo | Classe chiave |
|---|---|---|
| Acquisizione | Lavoro con fotocamera e microfono | AVCaptureSession |
| Riproduzione | Lettore audio e video | AVPlayer / AVAudioPlayer |
| Editing | Composizione e montaggio | AVMutableComposition |
| Esportazione | Conversione in altri formati | AVAssetExportSession |
| Motore audio | Elaborazione del suono in tempo reale | AVAudioEngine |
| Metadati | Lettura di ID3, EXIF e XMP | AVMetadataItem |
AVCaptureSession è l'oggetto centrale per l'acquisizione video e audio. Gestisce i flussi di dati in arrivo dai dispositivi fisici (fotocamera, microfono), configura le loro impostazioni (risoluzione, FPS, formato) e li indirizza all'uscita: anteprima (AVCaptureVideoPreviewLayer), registrazione su file (AVCaptureMovieFileOutput) o elaborazione fotogramma per fotogramma (AVCaptureVideoDataOutput).
AVPlayer è un lettore universale di AVFoundation in grado di riprodurre contenuti multimediali sia localmente che in rete. AVPlayer supporta lo streaming HLS, MPEG-4, QuickTime Movie e la maggior parte dei formati audio. Il controllo della riproduzione avviene in modo asincrono tramite AVPlayerItem. AVPlayerViewController fornisce un'interfaccia utente pronta all'uso con controlli: play/pausa, scorrimento, AirPlay e PiP.
L'acquisizione video e audio è una delle funzionalità più richieste di AVFoundation. La configurazione di una sessione di acquisizione comprende diversi passaggi: creazione di AVCaptureSession, aggiunta di ingressi (fotocamera, microfono), configurazione delle uscite e avvio della sessione.
Esaminiamo la configurazione passo passo di AVCaptureSession per acquisire video dalla fotocamera posteriore dell'iPhone registrando contemporaneamente l'audio dal microfono. Il processo si compone di quattro passaggi in Swift.
import AVFoundation
// 1. Creare e configurare la sessione
let session = AVCaptureSession()
session.sessionPreset = .hd1920x1080
// 2. Aggiungere ingresso fotocamera
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. Aggiungere uscita per registrazione
let output = AVCaptureMovieFileOutput()
guard session.canAddOutput(output) else { return }
session.addOutput(output)
// 4. Avviare la sessione
session.startRunning()
Il codice Swift crea una AVCaptureSession con un preset Full HD, collega la fotocamera posteriore come sorgente video e aggiunge un'uscita per la registrazione su file. Dopo session.startRunning(), la fotocamera inizia a trasmettere fotogrammi all'anteprima e al file di uscita. La registrazione viene interrotta tramite output.stopRecording() con l'opzione di salvare nella galleria.
Per l'acquisizione solo audio (senza video), solo il microfono viene aggiunto a AVCaptureSession tramite AVCaptureDevice.default(.audio). L'uscita è AVAudioFileOutput o AVCaptureAudioDataOutput per l'elaborazione del suono in tempo reale. AVFoundation supporta l'acquisizione multicanale: fino a 8 canali audio su iPad Pro e fino a 2 su iPhone, consentendo la registrazione stereo da microfoni esterni tramite Lightning, USB-C o Bluetooth. La selezione della sorgente di ingresso avviene tramite AVAudioSession.sharedInstance().setPreferredInput, fondamentale per le applicazioni che lavorano con cuffie esterne e microfoni Bluetooth.
AVFoundation offre due modi principali per riprodurre media: AVPlayer per video e AVAudioPlayer per audio. Vediamo un esempio di riproduzione di un flusso HLS remoto utilizzando AVPlayer.
Il codice crea un AVPlayer, carica un flusso HLS da un URL e avvia la riproduzione a un volume ridotto. AVPlayerItem gestisce lo stato di caricamento e buffering, e l'osservazione KVO dello stato consente di gestire gli errori.
import AVFoundation
import AVKit
// 1. Creare AVPlayer con flusso HLS
let url = URL(
string: "https://example.com/stream.m3u8"
) !
let player = AVPlayer(url: url)
player.volume = 0.7
// 2. Riproduzione
player.play()
// 3. Mostrare il lettore
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true)
// 4. Monitorare lo stato
player.currentItem?.addObserver(
self,
forKeyPath: "status",
options: .new,
context: nil
)
Il codice crea un AVPlayer con un URL HLS, imposta il volume al 70% e avvia la riproduzione. AVPlayerViewController fornisce un'interfaccia integrata con controlli, AirPlay e modalità picture-in-picture. Lo stato del lettore viene monitorato tramite KVO per gestire i casi in cui il flusso HLS è temporaneamente non disponibile.
Per la riproduzione audio senza interfaccia video si utilizza AVAudioPlayer — un lettore leggero che non richiede AVPlayerItem. AVAudioPlayer supporta i formati audio MP3, AAC, ALAC, FLAC, WAV e AIFF, fornisce i metodi play(), pause() e stop(), oltre al delegato AVAudioPlayerDelegate per monitorare il completamento della riproduzione e gli errori di decodifica. AVAudioPlayer è ideale per la riproduzione musicale in background, podcast ed effetti sonori nei giochi su iOS e macOS.
Vediamo altri due scenari tipici di lavoro con AVFoundation: elaborazione audio tramite AVAudioEngine ed esportazione video in un altro formato.
AVAudioEngine consente di elaborare l'audio in tempo reale collegando nodi in un grafo di elaborazione: nodo di ingresso (microfono) → effetti → nodo di uscita (altoparlante). Nell'esempio seguente viene aggiunto riverbero alla voce.
let engine = AVAudioEngine()
let reverb = AVAudioUnitReverb()
// Configurare riverbero
reverb.loadFactoryPreset(.largeHall)
reverb.wetDryMix = 40
// Connessione: microfono -> riverbero -> altoparlante
engine.attach(reverb)
engine.connect(
engine.inputNode,
to: reverb,
format: nil
)
engine.connect(
reverb,
to: engine.mainMixerNode,
format: nil
)
try? engine.start()
AVAudioEngine crea un grafo di tre nodi: ingresso (microfono), effetto (riverbero con preset di grande sala) e uscita (altoparlante). Dopo engine.start(), l'audio dal microfono viene elaborato dall'effetto in tempo reale e inviato alle cuffie o all'altoparlante del dispositivo. La latenza di elaborazione è inferiore a 10 ms su tutti i dispositivi Apple moderni.
Una capacità aggiuntiva di AVAudioEngine è l'analisi del suono tramite AVAudioUnitEQ e AVAudioUnitMixer. Lo sviluppatore può aggiungere un equalizzatore, compressore e limitatore a qualsiasi flusso audio. Per applicazioni musicali, AVFoundation fornisce AVAudioSequencer per la riproduzione di file MIDI e AVSpeechSynthesizer per la sintesi vocale. Tutti i componenti lavorano in un unico grafo audio, fornendo una latenza tra acquisizione ed elaborazione inferiore a 5 ms sui dispositivi Apple.
Quando si lavora con AVFoundation, è importante considerare le autorizzazioni di sistema: per accedere alla fotocamera è necessario NSCameraUsageDescription in Info.plist, e per il microfono NSMicrophoneUsageDescription. AVFoundation mostra automaticamente la finestra di richiesta autorizzazione al primo tentativo di accesso a un dispositivo. Il rifiuto dell'utente viene gestito tramite AVCaptureDevice.authorizationStatus(), consentendo di mostrare un messaggio appropriato sull'indisponibilità della fotocamera con suggerimento di andare nelle Impostazioni.
AVFoundation supporta la riproduzione audio in background tramite la modalità Audio Background Mode nelle Capabilities del progetto. Per attivarla, basta aggiungere la voce audio in UIBackgroundModes Info.plist e configurare AVAudioSession con la categoria .playback. Il video non viene riprodotto in background per impostazione predefinita, ma è possibile utilizzare AVPlayer con la modalità picture-in-picture per continuare la riproduzione video in un'app minimizzata su iPad. L'icona della modalità PiP viene configurata tramite AVPictureInPictureController insieme al delegato del protocollo.
Domande frequenti
iOS 4+ per riproduzione e acquisizione di base. iOS 8+ per AVAudioEngine. iOS 17+ per AVAssetWriter in modalità HDR. La versione corrente del framework è supportata su tutti i dispositivi iPhone, iPad e Mac.
Sì, AVPlayer supporta HLS (HTTP Live Streaming) — il protocollo di streaming principale di Apple. Per inviare media al server, utilizzare AVAssetWriter con un protocollo personalizzato su URLSession.
AVFoundation è un framework di basso livello per lavorare con i media. AVKit è un livello sopra AVFoundation che fornisce componenti dell'interfaccia utente pronti all'uso: AVPlayerViewController, AVPictureInPictureController e AVPipView.
Sì, da iOS 11 AVFoundation supporta FLAC (Free Lossless Audio Codec) per la riproduzione. ALAC (Apple Lossless) è supportato da iOS 4. Entrambi i codec funzionano tramite AVAudioPlayer e AVPlayer.
Tramite RPScreenRecorder di ReplayKit, che utilizza AVFoundation internamente. Da iOS 9, la registrazione dello schermo è disponibile tramite RPScreenRecorder.shared().startRecording() con microfono opzionale.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche