AVPlayer è un framework lettore multimediale di Apple, parte di AVFoundation, che fornisce riproduzione audio e video su iOS, macOS, tvOS e visionOS. AVPlayer supporta un'ampia gamma di formati — dai file MP4 locali ai flussi HLS adattivi — attraverso un'API unificata con decodifica accelerata via hardware sui chip Apple Silicon. Secondo Apple WWDC (2024), AVPlayer è utilizzato nel 90% delle applicazioni iOS che lavorano con contenuti multimediali, inclusi Apple TV, Music e Photos.
Punti chiave
AVPlayer è il componente centrale del framework AVFoundation, responsabile della riproduzione multimediale su tutte le piattaforme Apple. Introdotto in iOS 4.0 (2010) come sostituto del deprecato MPMoviePlayerController, AVPlayer fornisce un controllo di basso livello sulla riproduzione con regolazione fine dei parametri di decodifica, sincronizzazione audio-video e integrazione con servizi di sistema come AirPlay e Picture in Picture.
A differenza dei lettori di terze parti, AVPlayer beneficia dell'accelerazione hardware sui chip Apple Silicon. La decodifica video viene eseguita tramite VideoToolbox utilizzando i motori multimediali dedicati della serie M (Media Engine), consentendo la riproduzione 8K HDR con consumo energetico minimo. Per HEVC (H.265) e ProRes, la decodifica avviene su blocchi specializzati del chip senza appesantire la CPU.
AVPlayer è strettamente integrato con l'ecosistema Apple: supporto Handoff per trasferire la riproduzione tra dispositivi, AirPlay 2 per lo streaming su Apple TV, audio spaziale con tracciamento dinamico della testa e sincronizzazione con elementi di controllo del sistema tramite MPNowPlayingInfoCenter. Queste integrazioni rendono AVPlayer lo standard de facto per tutte le applicazioni che lavorano con contenuti multimediali sulle piattaforme Apple.
Il framework AVFoundation fornisce una gerarchia a tre livelli per la riproduzione: AVAsset (metadati e informazioni sul contenuto), AVPlayerItem (stato e gestione di una specifica istanza di contenuto) e AVPlayer (controllo della riproduzione). Questa architettura separa il caricamento dei metadati, la preparazione della riproduzione e il processo di riproduzione stesso — il che è particolarmente importante per i flussi HLS con molteplici alternative di bitrate.
AVAsset rappresenta un modello di contenuto multimediale — un file o un flusso. AVAsset non è riproducibile da solo; contiene tracce (AVAssetTrack), metadati (commonMetadata), informazioni sulla durata e altre caratteristiche. Un AVPlayerItem viene creato da AVAsset, che può poi essere passato ad AVPlayer per la riproduzione.
AVPlayer fornisce un insieme di capacità che coprono la maggior parte degli scenari di riproduzione — dalla semplice riproduzione di file alle complesse trasmissioni live con DRM. Esploriamo le caratteristiche principali con esempi di utilizzo.
| Caratteristica | Descrizione | Piattaforme |
|---|---|---|
| File locali | MP4, MOV, M4V, AVI, MKV (tramite estensioni) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming con ABR adattivo | Tutte le piattaforme Apple |
| FairPlay DRM | Contenuti HLS protetti con licenza di streaming | iOS, tvOS, macOS |
| Picture in Picture | Finestra video fluttuante sopra altre app | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Streaming wireless su Apple TV e altoparlanti | Tutte le piattaforme |
| Audio spaziale | Dolby Atmos e tracciamento dinamico della testa | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG con supporto display | iOS 11+, macOS 10.13+ |
AVPlayer ha supporto nativo HLS senza necessità di librerie aggiuntive. Durante la riproduzione di un flusso HLS, AVPlayer gestisce automaticamente la commutazione adattiva del bitrate utilizzando un algoritmo ABR integrato ottimizzato per le piattaforme Apple. L'algoritmo considera non solo la larghezza di banda della rete, ma anche lo stato termico del dispositivo — in caso di surriscaldamento, AVPlayer può ridurre il bitrate per diminuire il carico della CPU.
Per i flussi HLS con FairPlay Streaming, AVPlayer gestisce automaticamente l'acquisizione e il rinnovo delle licenze tramite il delegato AVContentKeySession. Lo sviluppatore deve implementare il protocollo AVContentKeySessionDelegate, che viene chiamato dal lettore quando è necessario ottenere o rinnovare una chiave di decifratura. Questo è l'unico modo per proteggere i contenuti HLS sulle piattaforme Apple, poiché Widevine non è supportato su iOS.
PiP è una modalità che consente agli utenti di continuare a guardare video in una finestra fluttuante durante il passaggio tra app. Su iPad e iPhone (iOS 14+), AVPlayer si integra con AVPictureInPictureController per abilitare questa modalità. Su macOS 15+, PiP è anche disponibile ma viene attivato tramite il menu di sistema o un pulsante nella finestra del lettore.
L'integrazione di AVPlayer in un'app iOS può essere effettuata in due modi: tramite l'AVPlayerViewController di alto livello (per scenari standard) o direttamente tramite AVPlayer + AVPlayerLayer (per la personalizzazione completa dell'interfaccia). Esploriamo entrambi gli approcci in Swift.
AVPlayerViewController è un componente dell'interfaccia pronto all'uso che fornisce controlli integrati: riproduzione/pausa, ricerca, volume, AirPlay, PiP e modalità schermo intero. L'integrazione minima richiede solo poche righe di codice: creare un'istanza di AVPlayer, passarla ad AVPlayerViewController e visualizzare il controller sullo schermo.
import AVKit
let url = URL(string: "https://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
let controller = AVPlayerViewController()
controller.player = player
controller.allowsPictureInPicturePlayback = true
present(controller, animated: true) {
player.play()
}
Per app con interfaccia personalizzata, utilizzare AVPlayerLayer — un livello Core Animation che renderizza video all'interno di qualsiasi UIView. Questo approccio offre il controllo completo sull'interfaccia: è possibile aggiungere controlli personalizzati, animazioni e sovrapporre livelli aggiuntivi sopra il video.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Utilizzo:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
La corretta gestione del ciclo di vita del lettore è fondamentale per la stabilità dell'app. AVPlayer dovrebbe essere creato quando lo schermo appare e rilasciato quando viene chiuso. Quando l'app va in background, si consiglia di mettere in pausa la riproduzione per conservare le risorse ed evitare sanzioni da App Review per riproduzione in background non necessaria.
AVPlayerLayer è un livello Core Animation che eredita da CALayer e renderizza video sullo schermo. A differenza di UIView, AVPlayerLayer lavora direttamente con la GPU tramite Metal o OpenGL, garantendo una latenza minima di output dei fotogrammi. Comprendere AVPlayerLayer è essenziale per implementare interfacce di riproduzione personalizzate.
La proprietà videoGravity determina come il video si adatta ai limiti del livello. AVLayerVideoGravity.resizeAspect (mantenimento delle proporzioni con barre nere) è il valore predefinito per AVPlayerViewController. resizeAspectFill (riempimento dell'intero schermo con ritaglio) viene utilizzato per la modalità schermo intero. resize (distorsione delle proporzioni per adattarsi alla dimensione del livello) viene usato raramente, principalmente per applicazioni analitiche.
AVPlayerLayer renderizza video in tempo reale, ma tutte le operazioni del lettore (avvio, pausa, ricerca) devono essere eseguite sul thread principale. I valori chiave per l'osservazione — timeControlStatus, rate, status ed error — vengono tracciati tramite KVO (Key-Value Observing) o la moderna API async/await introdotta in iOS 16 attraverso metodi AVPlayer con supporto Swift Concurrency.
let player = AVPlayer(url: url)
let statusObservation = player.observe(
\.status,
options: [.new, .initial]
) { player, _ in
switch player.status {
case .readyToPlay:
player.play()
case .failed:
handleError(player.error)
default:
break
}
}
AVPlayer supporta sottotitoli incorporati nei formati VTT, CEA-608 e ITT (iTunes Timed Text). La selezione della traccia audio e dei sottotitoli avviene tramite AVMediaSelectionGroup e AVMediaSelectionOption. Le impostazioni dei sottotitoli dell'utente (carattere, dimensione, colore) vengono lette dalle impostazioni di Accessibilità del sistema e automaticamente applicate ad AVPlayerLayer, salvo diversa indicazione esplicita nel codice.
Per le applicazioni di produzione, l'integrazione di base di AVPlayer richiede spesso configurazione aggiuntiva: caching dei segmenti HLS, integrazione FairPlay DRM, integrazione con il sistema Now Playing e algoritmi personalizzati di selezione del bitrate.
AVAssetResourceLoader è l'unico modo per intercettare il caricamento dei segmenti HLS e implementare il caching. Il delegato AVAssetResourceLoaderDelegate riceve richieste di caricamento per chiavi e segmenti, consentendo di memorizzarli localmente e restituirli dalla cache nelle richieste successive. Ciò è particolarmente utile per applicazioni che operano in condizioni di rete instabili.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) è lo standard Apple per proteggere i contenuti HLS. Per integrare FPS, è necessario implementare il protocollo AVContentKeySessionDelegate, che gestisce le richieste di chiavi di decifratura. Il processo include: ottenere SPC (Server Playback Context) dal lettore, inviarlo a un server di licenze, ricevere CKC (Content Key Context) e restituirlo ad AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. Ottenere SPC da keyRequest
// 2. Inviare SPC al server di licenze
// 3. Ottenere CKC e passarlo a keyRequest.processContentKeyResponse
}
}
Per visualizzare le informazioni di riproduzione correnti sulla schermata di blocco, nel Centro di Controllo e su Apple Watch, utilizzare MPNowPlayingInfoCenter di MediaPlayer.framework. AVPlayer non aggiorna automaticamente Now Playing — lo sviluppatore deve impostare manualmente i metadati (titolo, artista, copertina, progresso) quando lo stato di riproduzione cambia. Un timer regolare o observe(\.timeControlStatus) viene utilizzato per gli aggiornamenti del progresso.
Remote Command Center è un altro servizio di sistema che consente di controllare la riproduzione dalla schermata bloccata, da AirPods e CarPlay. MPRemoteCommandCenter registra gestori per i comandi play, pause, nextTrack, previousTrack, changePlaybackPosition e skipForward/skipBackward. AVPlayer non gestisce automaticamente questi comandi — lo sviluppatore deve collegarli alle chiamate player.play(), player.pause() e player.seek().
Domande frequenti
AVPlayer è un lettore universale per audio e video con supporto per streaming, HLS, DRM e sincronizzazione con i controlli di sistema. AVAudioPlayer è un lettore audio semplificato per la riproduzione di file audio locali senza supporto per streaming o accelerazione video hardware. Per video e HLS, utilizzare AVPlayer; per audio semplice, utilizzare AVAudioPlayer.
No, AVPlayer non supporta il caricamento diretto di contenuti YouTube, poiché YouTube utilizza un proprio lettore basato su DASH e formati proprietari. Per integrare YouTube in un'app iOS, utilizzare l'API YouTube IFrame Player tramite WKWebView o la libreria ufficiale youtube-ios-player-helper.
Per l'audio in background, aggiungere Audio, AirPlay and Picture in Picture alle Modalità di background del progetto Xcode. Configurare AVAudioSession con la categoria .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer continuerà la riproduzione in background e la schermata di blocco e il Centro di Controllo mostreranno i controlli tramite MPNowPlayingInfoCenter.
Questi servizi utilizzano protezione DRM e proprie soluzioni di lettore. AVPlayer può riprodurre contenuti solo tramite URL diretto di file multimediale o playlist HLS. I video di YouTube e piattaforme simili sono racchiusi in lettori iframe o JavaScript incompatibili con AVPlayer. Utilizzare i loro SDK ufficiali o WebView per la visualizzazione.
Per HLS a bassa latenza, configurare AVPlayerItem con preferredForwardBufferDuration = 2.0 (secondi) e gestire automaticamente la pausa quando si rimane indietro rispetto al limite live: utilizzare player.currentItem?.configuredTimeOffsetFromLive e player.currentItem?.canPlayReverse. Apple raccomanda LL-HLS con latenza di 2-4 secondi quando configurato correttamente sia sul server che sul client.
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