AVPlayerViewController est un contrôleur de lecteur vidéo intégré dans l'écosystème Apple, conçu pour la lecture de contenu multimédia sur iOS et tvOS. Il fournit une interface plein écran avec des contrôles, la prise en charge des sous-titres et AirPlay sans avoir à écrire une interface utilisateur personnalisée. Selon la Documentation Apple Developer, 2026, AVPlayerViewController s'intègre en quelques lignes de code et prend en charge HLS, MP4 et la plupart des formats multimédia.
Points essentiels
AVPlayerViewController est un composant du framework AVKit qui fournit une interface prête à l'emploi pour lire des vidéos dans les applications Apple. Il évite au développeur d'avoir à créer un lecteur personnalisé de zéro, en offrant des contrôles standard : lecture/pause, avance rapide, réglage du volume et mode plein écran.
Contrairement à AVPlayerLayer de bas niveau, qui nécessite une construction manuelle de l'interface utilisateur, AVPlayerViewController gère entièrement le cycle de vie du lecteur. Le contrôleur gère automatiquement la rotation de l'écran, s'adapte à la zone sécurisée sur les iPhone avec encoche et prend en charge le multitâche sur iPad.
Selon la Documentation Apple (2026), AVPlayerViewController est compatible avec AVPlayer et AVQueuePlayer, permettant de lire à la fois des fichiers individuels et des listes de lecture. Les URL de stockage local, les flux réseau HLS et le contenu FairPlay crypté sont pris en charge.
Le composant est apparu dans iOS 8 avec AVKit en remplacement de l'obsolète MPMoviePlayerController. Dans iOS 11, la prise en charge de Picture in Picture et de l'affichage des sous-titres a été ajoutée. Dans iOS 14, le contrôleur a reçu une barre de transport personnalisable via AVPlayerViewControllerDelegate. À partir d'iOS 16, la prise en charge du remplacement dynamique des fichiers multimédia sans recréation du lecteur a été introduite.
L'AVPlayerViewController moderne est optimisé pour les écrans ProMotion — la fréquence d'images vidéo se synchronise automatiquement avec la fréquence de rafraîchissement de l'écran. Sur tvOS, le composant s'adapte à l'interface de focus de la Siri Remote, et sur macOS, au mode fenêtré du QuickTime Player.
Au cœur du contrôleur se trouve l'association de AVPlayer et AVPlayerItem. AVPlayer est l'objet de lecture qui gère la chronologie, la vitesse et l'état. AVPlayerItem est un wrapper autour d'un fichier multimédia spécifique, contenant des métadonnées, des pistes et des informations de chargement.
Lors de l'initialisation, AVPlayerViewController reçoit une référence à AVPlayer et crée automatiquement un AVPlayerLayer pour afficher la vidéo. Le contrôleur s'abonne aux notifications KVO d'AVPlayer concernant les changements d'état tels que readyToPlay, les erreurs de chargement et la fin de la lecture.
Les contrôles (barre de transport) s'affichent en touchant l'écran. Sous iOS 15+, ils prennent en charge la personnalisation via AVPlayerViewControllerCustomizationDelegate, permettant de masquer ou remplacer les boutons standard.
Après avoir créé le contrôleur et assigné AVPlayer, la méthode viewDidLoad est appelée, qui commence à préparer le flux vidéo. Lorsque AVPlayerItem passe à l'état AVPlayerItemStatusReadyToPlay, le lecteur est prêt à afficher les images. Lorsque la méthode play() est appelée, le décodage du flux vidéo commence via Video Toolbox.
En quittant l'écran, le contrôleur met automatiquement la lecture en pause et libère les ressources du décodeur. Sous iOS 13+, pour maintenir la lecture lorsque l'application est réduite, les modes d'arrière-plan et la session audio doivent être configurés. Selon la WWDC 2024, il est recommandé d'utiliser AVPlayerPlaybackCoordinator pour la synchronisation avec le centre multimédia iOS.
Le composant fournit un ensemble riche de fonctionnalités prêtes à l'emploi, ce qui le rend attrayant pour la plupart des projets. Voici les capacités clés qui ne nécessitent pas de code supplémentaire.
La barre de transport est la partie inférieure de l'interface contenant les principaux boutons de contrôle. Par défaut, la barre se masque après 3 secondes d'inactivité de l'utilisateur et apparaît au toucher. Sous iOS 16+, le délégué peut être utilisé pour contrôler la visibilité des éléments individuels.
En mode débogage, la barre de transport peut être forcée à s'afficher en utilisant la propriété AVPlayerViewController.requiresLinearPlayback, qui empêche également la mise en pause de la vidéo. Utile pour les pauses publicitaires et le contenu éducatif.
L'intégration de base du contrôleur ne prend pas plus de 10 lignes de code. Créez d'abord une instance d'AVPlayer avec l'URL du fichier multimédia, puis passez-la à AVPlayerViewController et affichez le contrôleur à l'écran.
import AVKit
let player = AVPlayer(url: URL(string: "https://example.com/video.mp4")!)
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true) {
player.play()
}
Après avoir appelé present, le contrôleur s'affiche en plein écran. La vidéo commence à se charger depuis le réseau, et une fois que le tampon atteint le seuil readyToPlay, la lecture commence automatiquement après l'appel de play().
let asset = AVAsset(url: videoURL)
let item = AVPlayerItem(asset: asset)
let metadata = AVMutableMetadataItem()
metadata.key = AVMetadataKey.commonKeyTitle
metadata.value = "Ma Vidéo"
item.addMetadata(metadata)
let player = AVPlayer(playerItem: item)
let playerVC = AVPlayerViewController()
playerVC.player = player
L'utilisation d'AVPlayerItem vous donne le contrôle sur les métadonnées, les codes temporels, la sélection des pistes audio et les sous-titres. Via AVPlayerItem, vous pouvez également surveiller la progression du chargement, la mise en mémoire tampon et les erreurs réseau à l'aide de KVO sur la propriété status.
À partir d'iOS 11, les développeurs peuvent personnaliser la barre de transport via le protocole AVPlayerViewControllerDelegate. La méthode playerViewController(_:willBeginFullScreenPresentationWithAnimationCoordinator:) est appelée avant d'entrer en mode plein écran et permet de préparer l'interface utilisateur.
Pour masquer des boutons individuels, utilisez la propriété AVPlayerViewController.showsPlaybackControls. Si elle est définie sur false, la barre de transport disparaît complètement, ne laissant que le flux vidéo. Utile pour les éléments de superposition personnalisés.
class CustomPlayerViewController: UIViewController {
private let playerVC = AVPlayerViewController()
override func viewDidLoad() {
super.viewDidLoad()
playerVC.delegate = self
playerVC.showsPlaybackControls = true
playerVC.entersFullScreenWhenPlaybackBegins = true
}
}
extension CustomPlayerViewController: AVPlayerViewControllerDelegate {
func playerViewController(
_ playerViewController: AVPlayerViewController,
willBeginFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator
) {
// Ajouter un bouton de superposition
}
func playerViewController(
_ playerViewController: AVPlayerViewController,
didUpdate legibleMediaSelection: AVMediaSelectionGroup
) {
print("Nouvelle langue de sous-titres sélectionnée")
}
}
Le délégué permet d'intercepter les événements de changement de sous-titres, l'entrée et la sortie du mode plein écran, ainsi que le début et la fin de Picture in Picture. À la WWDC 2024, Apple a recommandé d'utiliser le délégué pour les analyses — enregistrer chaque transition en moins de 100 ms.
AVPlayerViewController affiche automatiquement tous les sous-titres et pistes audio disponibles s'ils sont intégrés dans le fichier multimédia ou spécifiés dans le manifeste HLS. Les utilisateurs peuvent les changer via le menu qui apparaît en touchant l'icône des sous-titres dans la barre de transport.
Pour les flux HLS, le manifeste M3U8 contient une liste des variantes linguistiques disponibles. AVPlayer charge les segments de sous-titres WebVTT correspondants et les transmet à AVPlayerLayer pour le rendu. iOS 16+ a introduit la prise en charge du style des sous-titres via AVTextStyleRule.
func selectAudioTrack(languageCode: String) {
guard let group = player.currentItem?
.asset.mediaSelectionGroup(forMediaCharacteristic: AVMediaCharacteristic.audible)
else { return }
for option in group.options {
if option.extendedLanguageTag?.hasPrefix(languageCode) == true {
player.currentItem?.select(option, in: group)
}
}
}
La méthode selectAudioTrack recherche parmi les options audio du groupe audible la variante dont extendedLanguageTag correspond au code de langue souhaité. Cela permet d'implémenter la fonction « Audio original » dans les applications avec du contenu multilingue.
Le mode Picture in Picture (PiP) permet d'afficher la vidéo dans une fenêtre flottante au-dessus des autres applications. Sur iPad, cette fonctionnalité est disponible depuis iOS 9, sur iPhone depuis iOS 14. AVPlayerViewController ajoute automatiquement un bouton PiP à la barre de transport lors de l'abonnement à UIBackgroundModes.
Pour activer le PiP, ajoutez la clé UIBackgroundModes avec les valeurs audio et airplay à Info.plist. Ensuite, un bouton PiP apparaît dans le contrôleur qui, lorsqu'on le touche, réduit la vidéo dans une fenêtre flottante de 192x108 points.
Les événements PiP sont gérés via le délégué : playerViewController(_:willStartPictureInPictureFromFullScreen:) et playerViewController(_:didStopPictureInPicture:). Selon Apple HIG, la taille minimale de la fenêtre PiP doit être d'au moins 120x68 points pour maintenir la lisibilité du contenu.
Foire aux questions
Non, les vidéos YouTube nécessitent l'utilisation d'une vue web WKWebView ou de la bibliothèque YouTube iOS Helper, car YouTube utilise son propre système de DRM. AVPlayerViewController est conçu pour les flux multimédia directs via URL.
Définissez la propriété showsPlaybackControls sur false. Ensuite, l'écran reste vide — seul le flux vidéo. Pour retrouver des boutons personnalisés, ajoutez une superposition via addSubview au-dessus du contrôleur.
Oui, le contrôleur prend entièrement en charge HLS Live. La barre de transport affiche un indicateur En direct au lieu d'un curseur de progression. La latence dépend de la configuration HLS — minimum 6 secondes avec les paramètres de faible latence.
Abonnez-vous au KVO sur la propriété AVPlayerItem.status. En cas d'erreur, le statut passe à .failed. Obtenez les détails via la propriété error d'AVPlayerItem et affichez une alerte à l'utilisateur expliquant le problème — souvent un problème réseau ou une URL invalide.
Oui, utilisez AVAsset avec un AVAssetResourceLoader personnalisé pour fournir des données depuis la RAM. Implémentez AVAssetResourceLoaderDelegate et retournez des octets depuis un tampon au lieu de lire depuis le disque.
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