AVPlayer — Concepts clés, fonctionnalités et utilisation

Auteur : IT Sectr Publié le : 2026-05-23 Temps de lecture : 9 min

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 — Le framework de lecteur multimédia d'Apple d'AVFoundation pour toutes les plateformes Apple.
  • Accélération matérielle — AVPlayer utilise VideoToolbox pour le décodage sur GPU, réduisant la consommation d'énergie.
  • HLS — Prise en charge native de HTTP Live Streaming avec commutation adaptative automatique du débit.
  • Picture in Picture — Prise en charge intégrée du mode image dans l'image sur iPad, iPhone et Mac.
  • DRM — Intégration avec FairPlay Streaming pour la protection de contenu premium.

Qu'est-ce qu'AVPlayer ?

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.

AVFoundation et hiérarchie des classes

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.

Principales fonctionnalités d'AVPlayer

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éDescriptionPlateformes
Fichiers locauxMP4, MOV, M4V, AVI, MKV (via des extensions)iOS, macOS, tvOS
HLSHTTP Live Streaming avec ABR adaptatifToutes les plateformes Apple
FairPlay DRMContenu HLS protégé avec licence de streamingiOS, tvOS, macOS
Picture in PictureFenêtre vidéo flottante au-dessus des autres applicationsiPad, iPhone (iOS 14+), Mac
AirPlay 2Streaming sans fil vers Apple TV et enceintesToutes les plateformes
Audio spatialDolby Atmos et suivi dynamique de la têteiOS 15+, macOS 13+
HDRDolby Vision, HDR10, HLG avec prise en charge d'affichageiOS 11+, macOS 10.13+

Prise en charge HLS et commutation adaptative

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.

Picture in Picture

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.

Comment utiliser AVPlayer dans une application iOS

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.

Intégration via AVPlayerViewController

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.

swift
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()
}

Intégration directe via AVPlayerLayer

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.

swift
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)

Gestion du cycle de vie d'AVPlayer

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 et affichage vidéo

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.

Configuration de videoGravity

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.

Synchronisation avec le thread principal

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.

swift
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
    }
}

Prise en charge des sous-titres et des pistes alternatives

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.

Gestion de la lecture et scénarios avancés

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.

Mise en cache HLS via AVAssetResourceLoader

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.

swift
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
    resourceLoaderDelegate,
    queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)

FairPlay Streaming — Intégration DRM

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.

swift
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
    }
}

Now Playing et contrôles système

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

Quelle est la différence entre AVPlayer et AVAudioPlayer ?

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.

AVPlayer prend-il en charge la lecture YouTube ?

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.

Comment implémenter la lecture audio en arrière-plan avec AVPlayer ?

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.

Pourquoi AVPlayer ne lit-il pas les vidéos de YouTube, Vimeo ou Twitter ?

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.

Comment réduire la latence en direct via AVPlayer ?

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é

  • AVPlayer — Le lecteur multimédia universel d'Apple avec accélération matérielle sur Apple Silicon pour iOS, macOS, tvOS et visionOS.
  • HLS — Prise en charge native avec commutation adaptative automatique du débit sans bibliothèques supplémentaires.
  • FairPlay Streaming — Le seul système DRM pour HLS protégé sur les plateformes Apple.
  • Intégration — AVPlayerViewController pour un démarrage rapide ou AVPlayerLayer pour une interface personnalisée.
  • Cache HLS est implémenté via AVAssetResourceLoaderDelegate en interceptant les demandes de segments.
  • Now Playing — Mises à jour manuelles des métadonnées pour le Centre de contrôle et l'écran de verrouillage via MPNowPlayingInfoCenter.
  • Recommandé d'utiliser AVPlayer pour tous les projets multimédia sur les plateformes Apple avec des exigences HLS.

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.

Discuter du projet

Lisez aussi