AVPlayer est un framework de lecteur multimédia d'Apple, faisant partie d'AVFoundation, qui assure la lecture audio et vidéo sur iOS, macOS, tvOS et visionOS. AVPlayer prend en charge une large gamme de formats — des fichiers MP4 locaux aux flux HLS adaptatifs — via une API unifiée avec un décodage accéléré par matériel sur les puces Apple Silicon. Selon Apple WWDC (2024), AVPlayer est utilisé dans 90% des applications iOS travaillant avec du média, y compris Apple TV, Music et Photos.
Points clés
AVPlayer est le composant central du framework AVFoundation, responsable de la lecture multimédia sur toutes les plateformes Apple. Présenté dans iOS 4.0 (2010) en remplacement de l'obsolète MPMoviePlayerController, AVPlayer offre un contrôle de bas niveau sur la lecture avec un réglage fin des paramètres de décodage, une synchronisation audio-vidéo et une intégration avec les services système tels qu'AirPlay et Picture in Picture.
Contrairement aux lecteurs tiers, AVPlayer bénéficie de l'accélération matérielle sur les puces Apple Silicon. Le décodage vidéo est effectué via VideoToolbox à l'aide des moteurs média dédiés de la série M (Media Engine), permettant une lecture 8K HDR avec une consommation d'énergie minimale. Pour HEVC (H.265) et ProRes, le décodage s'effectue sur des blocs de puce spécialisés sans solliciter le CPU.
AVPlayer est étroitement intégré à l'écosystème Apple : prise en charge de Handoff pour transférer la lecture entre appareils, AirPlay 2 pour le streaming sur Apple TV, audio spatial avec suivi dynamique de la tête et synchronisation avec les éléments de contrôle système via MPNowPlayingInfoCenter. Ces intégrations font d'AVPlayer le standard de facto pour toutes les applications travaillant avec du média sur les plateformes Apple.
Le framework AVFoundation fournit une hiérarchie à trois niveaux pour la lecture : AVAsset (métadonnées et informations de contenu), AVPlayerItem (état et gestion d'une instance de contenu spécifique) et AVPlayer (contrôle de la lecture). Cette architecture sépare le chargement des métadonnées, la préparation de la lecture et le processus de lecture lui-même — ce qui est particulièrement important pour les flux HLS avec plusieurs alternatives de débit.
AVAsset représente un modèle de contenu multimédia — un fichier ou un flux. AVAsset n'est pas lisible en soi ; il contient des pistes (AVAssetTrack), des métadonnées (commonMetadata), des informations de durée et d'autres caractéristiques. Un AVPlayerItem est créé à partir d'AVAsset, qui peut ensuite être passé à AVPlayer pour la lecture.
AVPlayer offre un ensemble de capacités couvrant la plupart des scénarios de lecture — de la simple lecture de fichiers aux diffusions en direct complexes avec DRM. Explorons les principales fonctionnalités avec des exemples d'utilisation.
| Fonctionnalité | Description | Plateformes |
|---|---|---|
| Fichiers locaux | MP4, MOV, M4V, AVI, MKV (via des extensions) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming avec ABR adaptatif | Toutes les plateformes Apple |
| FairPlay DRM | Contenu HLS protégé avec licence de streaming | iOS, tvOS, macOS |
| Picture in Picture | Fenêtre vidéo flottante au-dessus des autres applications | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Streaming sans fil vers Apple TV et enceintes | Toutes les plateformes |
| Audio spatial | Dolby Atmos et suivi dynamique de la tête | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG avec prise en charge d'affichage | iOS 11+, macOS 10.13+ |
AVPlayer dispose d'une prise en charge native de HLS sans nécessiter de bibliothèques supplémentaires. Lors de la lecture d'un flux HLS, AVPlayer gère automatiquement la commutation adaptative du débit à l'aide d'un algorithme ABR intégré optimisé pour les plateformes Apple. L'algorithme prend en compte non seulement la bande passante réseau, mais aussi l'état thermique de l'appareil — en cas de surchauffe, AVPlayer peut réduire le débit pour diminuer la charge du CPU.
Pour les flux HLS avec FairPlay Streaming, AVPlayer gère automatiquement l'acquisition et le renouvellement des licences via le délégué AVContentKeySession. Le développeur doit implémenter le protocole AVContentKeySessionDelegate, qui est appelé par le lecteur lorsqu'une clé de déchiffrement doit être obtenue ou renouvelée. C'est le seul moyen de protéger le contenu HLS sur les plateformes Apple, car Widevine n'est pas pris en charge sur iOS.
PiP est un mode qui permet aux utilisateurs de continuer à regarder une vidéo dans une fenêtre flottante lors du changement d'application. Sur iPad et iPhone (iOS 14+), AVPlayer s'intègre à AVPictureInPictureController pour activer ce mode. Sur macOS 15+, PiP est également disponible mais activé via le menu système ou un bouton dans la fenêtre du lecteur.
L'intégration d'AVPlayer dans une application iOS peut se faire de deux manières : via l'AVPlayerViewController de haut niveau (pour les scénarios standard) ou directement via AVPlayer + AVPlayerLayer (pour une personnalisation complète de l'interface). Explorons les deux approches en Swift.
AVPlayerViewController est un composant d'interface prêt à l'emploi offrant des contrôles intégrés : lecture/pause, recherche, volume, AirPlay, PiP et mode plein écran. L'intégration minimale ne nécessite que quelques lignes de code : créer une instance AVPlayer, la passer à AVPlayerViewController et afficher le contrôleur à l'écran.
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()
}
Pour les applications avec une interface personnalisée, utilisez AVPlayerLayer — une couche Core Animation qui rend la vidéo dans n'importe quel UIView. Cette approche offre un contrôle total sur l'interface : vous pouvez ajouter des contrôles personnalisés, des animations et superposer des couches supplémentaires sur la vidéo.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Utilisation :
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Une gestion appropriée du cycle de vie du lecteur est essentielle pour la stabilité de l'application. AVPlayer doit être créé lors de l'apparition de l'écran et libéré lors de sa fermeture. Lorsque l'application passe en arrière-plan, il est recommandé de suspendre la lecture pour économiser les ressources et éviter les pénalités d'App Review pour une lecture en arrière-plan inutile.
AVPlayerLayer est une couche Core Animation héritant de CALayer qui rend la vidéo à l'écran. Contrairement à UIView, AVPlayerLayer fonctionne directement avec le GPU via Metal ou OpenGL, garantissant une latence minimale de sortie d'images. Comprendre AVPlayerLayer est essentiel pour implémenter des interfaces de lecture personnalisées.
La propriété videoGravity détermine comment la vidéo s'adapte aux limites de la couche. AVLayerVideoGravity.resizeAspect (maintien du rapport hauteur/largeur avec des barres noires) est la valeur par défaut pour AVPlayerViewController. resizeAspectFill (remplir tout l'écran avec recadrage) est utilisé pour le mode plein écran. resize (distorsion des proportions pour s'adapter à la taille de la couche) est rarement utilisé, principalement pour les applications analytiques.
AVPlayerLayer rend la vidéo en temps réel, mais toutes les opérations du lecteur (démarrage, pause, recherche) doivent être effectuées sur le thread principal. Les valeurs clés pour l'observation — timeControlStatus, rate, status et error — sont suivies via KVO (Key-Value Observing) ou l'API moderne async/await introduite dans iOS 16 via les méthodes AVPlayer avec prise en charge de 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 prend en charge les sous-titres intégrés aux formats VTT, CEA-608 et ITT (iTunes Timed Text). La sélection de la piste audio et des sous-titres se fait via AVMediaSelectionGroup et AVMediaSelectionOption. Les paramètres de sous-titres de l'utilisateur (police, taille, couleur) sont lus à partir des paramètres d'Accessibilité du système et appliqués automatiquement à AVPlayerLayer, sauf indication explicite dans le code.
Pour les applications de production, l'intégration de base d'AVPlayer nécessite souvent une configuration supplémentaire : mise en cache des segments HLS, intégration FairPlay DRM, intégration du système Now Playing et algorithmes personnalisés de sélection de débit.
AVAssetResourceLoader est le seul moyen d'intercepter le chargement des segments HLS et d'implémenter la mise en cache. Le délégué AVAssetResourceLoaderDelegate reçoit les demandes de chargement de clés et de segments, permettant de les stocker localement et de les retourner depuis le cache lors de demandes ultérieures. Ceci est particulièrement utile pour les applications fonctionnant dans des conditions réseau instables.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) est le standard d'Apple pour protéger le contenu HLS. Pour intégrer FPS, vous devez implémenter le protocole AVContentKeySessionDelegate, qui gère les demandes de clés de déchiffrement. Le processus comprend : l'obtention du SPC (Server Playback Context) depuis le lecteur, l'envoi à un serveur de licences, la réception du CKC (Content Key Context) et son retour à AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. Obtenir SPC depuis keyRequest
// 2. Envoyer SPC au serveur de licences
// 3. Obtenir CKC et le passer à keyRequest.processContentKeyResponse
}
}
Pour afficher les informations de lecture en cours sur l'écran de verrouillage, le Centre de contrôle et l'Apple Watch, utilisez MPNowPlayingInfoCenter de MediaPlayer.framework. AVPlayer ne met pas automatiquement à jour Now Playing — le développeur doit définir manuellement les métadonnées (titre, artiste, couverture, progression) lors du changement d'état de lecture. Un minuteur régulier ou observe(\.timeControlStatus) est utilisé pour les mises à jour de progression.
Remote Command Center est un autre service système qui permet de contrôler la lecture depuis l'écran verrouillé, les AirPods et CarPlay. MPRemoteCommandCenter enregistre des gestionnaires pour les commandes play, pause, nextTrack, previousTrack, changePlaybackPosition et skipForward/skipBackward. AVPlayer ne gère pas ces commandes automatiquement — le développeur doit les connecter aux appels player.play(), player.pause() et player.seek().
Foire aux questions
AVPlayer est un lecteur universel pour l'audio et la vidéo avec prise en charge du streaming, HLS, DRM et de la synchronisation avec les commandes système. AVAudioPlayer est un lecteur audio simplifié pour la lecture de fichiers audio locaux sans streaming ni accélération vidéo matérielle. Pour la vidéo et HLS, utilisez AVPlayer ; pour l'audio simple, utilisez AVAudioPlayer.
Non, AVPlayer ne prend pas en charge le chargement direct de contenu YouTube, car YouTube utilise son propre lecteur basé sur DASH et des formats propriétaires. Pour intégrer YouTube dans une application iOS, utilisez l'API YouTube IFrame Player via WKWebView ou la bibliothèque officielle youtube-ios-player-helper.
Pour l'audio en arrière-plan, ajoutez Audio, AirPlay and Picture in Picture aux modes d'arrière-plan de votre projet Xcode. Configurez AVAudioSession avec la catégorie .playback : try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer continuera la lecture en arrière-plan, et l'écran de verrouillage et le Centre de contrôle afficheront les commandes via MPNowPlayingInfoCenter.
Ces services utilisent une protection DRM et leurs propres solutions de lecteur. AVPlayer ne peut lire du contenu que via une URL directe de fichier multimédia ou une playlist HLS. Les vidéos de YouTube et des plateformes similaires sont encapsulées dans des lecteurs iframe ou JavaScript incompatibles avec AVPlayer. Utilisez leurs SDK officiels ou WebView pour l'affichage.
Pour le HLS à faible latence, configurez AVPlayerItem avec preferredForwardBufferDuration = 2.0 (secondes) et gérez automatiquement la pause en cas de retard par rapport à la limite en direct : utilisez player.currentItem?.configuredTimeOffsetFromLive et player.currentItem?.canPlayReverse. Apple recommande le LL-HLS avec une latence de 2 à 4 secondes lorsqu'il est correctement configuré côté serveur et client.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi