AVPlayer is een mediaspelerframework van Apple, onderdeel van AVFoundation, dat audio- en videoweergave op iOS, macOS, tvOS en visionOS mogelijk maakt. AVPlayer ondersteunt een breed scala aan formaten — van lokale MP4-bestanden tot adaptieve HLS-streams — via een uniforme API met hardwareversnelde decodering op Apple Silicon-chips. Volgens Apple WWDC (2024) wordt AVPlayer gebruikt in 90% van de iOS-apps die met media werken, waaronder Apple TV, Music en Photos.
Belangrijkste punten
AVPlayer — is de centrale component van het AVFoundation-framework, verantwoordelijk voor het afspelen van multimedia-inhoud op alle Apple-platforms. Geïntroduceerd in iOS 4.0 (2010) als vervanging voor de verouderde MPMoviePlayerController, biedt AVPlayer low-level controle over het afspelen met de mogelijkheid tot fijnafstemming van decoderingsparameters, audio- en videosynchronisatie en integratie met systeemdiensten zoals AirPlay en Picture in Picture.
In tegenstelling tot spelers van derden profiteert AVPlayer van hardwareversnelling op Apple Silicon-chips. Videodecodering verloopt via VideoToolbox met behulp van speciale media-engines van de M-serie (Media Engine), wat 8K HDR-weergave met minimaal energieverbruik mogelijk maakt. Voor HEVC (H.265) en ProRes vindt decodering plaats op gespecialiseerde chipblokken, zonder de CPU te belasten.
AVPlayer is nauw geïntegreerd met het Apple-ecosysteem: ondersteuning voor Handoff voor het overdragen van afspelen tussen apparaten, AirPlay 2 voor streaming naar Apple TV, ruimtelijke audio met dynamische hoofdvolging en synchronisatie met systeembedieningselementen via MPNowPlayingInfoCenter. Deze integraties maken AVPlayer de de facto standaard voor alle apps die met media werken op Apple-platforms.
Het AVFoundation-framework biedt een drielaagse hiërarchie voor afspelen: AVAsset (metadata en informatie over inhoud), AVPlayerItem (status en beheer van een specifieke inhoudsinstantie) en AVPlayer (afspeelbeheer). Deze architectuur maakt het mogelijk het laden van metadata, de voorbereiding op afspelen en het afspeelproces zelf te scheiden, wat vooral belangrijk is voor HLS-streams met meerdere bitsnelheidvarianten.
AVAsset vertegenwoordigt een model van media-inhoud — een bestand of stream. AVAsset is op zichzelf niet afspeelbaar; het bevat tracks (AVAssetTrack), metadata (commonMetadata), duurinformatie en andere kenmerken. Uit AVAsset wordt AVPlayerItem gemaakt, dat vervolgens aan AVPlayer kan worden doorgegeven voor afspelen.
AVPlayer biedt een reeks mogelijkheden die de meeste afspeelscenario's dekken — van eenvoudig bestand afspelen tot complexe live-uitzendingen met DRM. Laten we de belangrijkste functies met toepassingsvoorbeelden bekijken.
| Mogelijkheid | Beschrijving | Platforms |
|---|---|---|
| Lokale bestanden | MP4, MOV, M4V, AVI, MKV (via extensies) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming met adaptieve ABR | Alle Apple-platforms |
| FairPlay DRM | Beveiligde HLS-inhoud met streaminglicentie | iOS, tvOS, macOS |
| Picture in Picture | Zwevend videovenster boven andere apps | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Draadloze overdracht naar Apple TV en luidsprekers | Alle platforms |
| Ruimtelijke audio | Dolby Atmos en dynamische volging | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG met displayondersteuning | iOS 11+, macOS 10.13+ |
AVPlayer heeft native ondersteuning voor HLS zonder dat extra bibliotheken hoeven te worden geïnstalleerd. Bij het afspelen van een HLS-stream beheert AVPlayer automatisch de adaptieve bitsnelheidsschakeling met behulp van het ingebouwde ABR-algoritme dat is geoptimaliseerd voor Apple-platforms. Het algoritme houdt niet alleen rekening met de netwerkbandbreedte, maar ook met de thermische toestand van het apparaat — bij oververhitting kan AVPlayer de bitsnelheid verlagen om de processorbelasting te verminderen.
Voor HLS-streams met FairPlay Streaming verwerkt AVPlayer automatisch het verkrijgen en vernieuwen van licenties via de AVContentKeySession-delegate. De ontwikkelaar moet het protocol AVContentKeySessionDelegate implementeren, dat door de speler wordt aangeroepen wanneer een decoderingssleutel moet worden verkregen of vernieuwd. Dit is de enige manier om HLS-inhoud op Apple-platforms te beveiligen, aangezien Widevine niet wordt ondersteund op iOS.
PiP — een modus waarmee de gebruiker video kan blijven bekijken in een zwevend venster terwijl hij tussen apps schakelt. Op iPad en iPhone (iOS 14+) integreert AVPlayer met AVPictureInPictureController om deze modus in te schakelen. Op macOS 15+ is PiP ook beschikbaar, maar wordt geactiveerd via het systeemmenu of een knop in het spelervenster.
Integratie van AVPlayer in een iOS-app kan op twee manieren worden gedaan: via de hoogwaardige AVPlayerViewController (voor typische scenario's) of rechtstreeks via AVPlayer + AVPlayerLayer (voor volledige aanpassing van de interface). Laten we beide benaderingen in Swift bekijken.
AVPlayerViewController — een kant-en-klare UI-component met ingebouwde bedieningselementen: play/pause, terugspoelen, volume, AirPlay, PiP en volledig scherm. Minimale integratie vereist slechts een paar regels code: een AVPlayer-instantie maken, deze doorgeven aan AVPlayerViewController en de controller op het scherm weergeven.
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()
}
Gebruik voor apps met een aangepaste interface AVPlayerLayer — een Core Animation-laag die video binnen elke UIView rendert. Deze benadering geeft volledige controle over de interface: u kunt eigen bedieningselementen, animaties en extra lagen over de video toevoegen.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Gebruik:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Correct beheer van de levenscyclus van de speler is cruciaal voor de stabiliteit van de app. AVPlayer moet worden aangemaakt wanneer het scherm verschijnt en worden vrijgegeven wanneer het wordt gesloten. Wanneer de app naar de achtergrond gaat, wordt aanbevolen het afspelen te onderbreken om resources te sparen en boetes van App Review voor afspelen op de achtergrond zonder duidelijke noodzaak te voorkomen.
AVPlayerLayer — is een Core Animation-laag, overgenomen van CALayer, die videoweergave op het scherm verzorgt. In tegenstelling tot UIView werkt AVPlayerLayer rechtstreeks met de GPU via Metal of OpenGL, wat minimale framevertraging garandeert. Inzicht in de werking van AVPlayerLayer is noodzakelijk voor het implementeren van aangepaste afspeelinterfaces.
De eigenschap videoGravity bepaalt hoe video binnen de laaggrenzen past. AVLayerVideoGravity.resizeAspect (beeldverhouding behouden met zwarte balken) — de standaardwaarde voor AVPlayerViewController. resizeAspectFill (het hele scherm vullen met bijsnijden) wordt gebruikt voor de volledig scherm-modus. resize (beeldverhouding vervormen naar laaggrootte) wordt zelden toegepast, voornamelijk voor analytische apps.
AVPlayerLayer rendert video in realtime, maar alle bewerkingen op de speler (start, pause, seek) moeten op de hoofdthread worden uitgevoerd. De belangrijkste waarden om te observeren — timeControlStatus, rate, status en error — worden gevolgd via KVO (Key-Value Observing) of de moderne async/await API, geïntroduceerd in iOS 16 via AVPlayer-methoden met ondersteuning voor 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 ondersteunt ingebouwde ondertiteling in de formaten VTT, CEA-608 en ITT (iTunes Timed Text). Het selecteren van audiotracks en ondertiteling gebeurt via AVMediaSelectionGroup en AVMediaSelectionOption. Gebruikersinstellingen voor ondertiteling (lettertype, grootte, kleur) worden gelezen uit de systeeminstellingen voor toegankelijkheid en automatisch toegepast op AVPlayerLayer, tenzij expliciet anders aangegeven in de code.
Voor productie-apps vereist de basisintegratie van AVPlayer vaak aanvullende configuratie: cachen van HLS-segmenten, werken met FairPlay DRM, integratie met het „Now Playing"-systeem en implementatie van aangepaste bitsnelheidsselectiealgoritmen.
AVAssetResourceLoader — is de enige manier om het laden van HLS-segmenten te onderscheppen en caching te implementeren. De AVAssetResourceLoaderDelegate-delegate ontvangt verzoeken voor het laden van sleutels en segmenten, waardoor ze lokaal kunnen worden opgeslagen en bij herhaalde verzoeken uit de cache kunnen worden teruggegeven. Dit is vooral nuttig voor apps die in onstabiele netwerkomstandigheden werken.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) — de Apple-standaard voor het beveiligen van HLS-inhoud. Voor FPS-integratie moet het protocol AVContentKeySessionDelegate worden geïmplementeerd, dat verzoeken voor het verkrijgen van decoderingssleutels verwerkt. Het proces omvat: het verkrijgen van SPC (Server Playback Context) van de speler, verzenden naar de licentieserver, ontvangen van CKC (Content Key Context) en teruggeven aan AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. SPC ophalen uit keyRequest
// 2. SPC naar licentieserver sturen
// 3. CKC ophalen en doorgeven aan keyRequest.processContentKeyResponse
}
}
Voor het weergeven van informatie over het huidige afspelen op het vergrendelscherm, het Bedieningspaneel en Apple Watch wordt MPNowPlayingInfoCenter uit MediaPlayer.framework gebruikt. AVPlayer werkt Now Playing niet automatisch bij — de ontwikkelaar moet handmatig metadata (titel, artiest, omslag, voortgang) instellen wanneer de afspeelstatus verandert. Voor het bijwerken van de voortgang wordt een reguliere timer of observe(\.timeControlStatus) gebruikt.
Remote Command Center — een andere systeemdienst waarmee het afspelen kan worden bediend vanaf het vergrendelscherm, AirPods en CarPlay. MPRemoteCommandCenter registreert handlers voor de commando's play, pause, nextTrack, previousTrack, changePlaybackPosition en skipForward/skipBackward. AVPlayer verwerkt deze commando's niet automatisch — de ontwikkelaar moet ze koppelen aan de aanroepen player.play(), player.pause() en player.seek().
Veelgestelde vragen
AVPlayer — een universele speler voor audio en video met ondersteuning voor streaming, HLS, DRM en synchronisatie met systeembedieningselementen. AVAudioPlayer — een vereenvoudigde audiospeler voor het afspelen van lokale audiobestanden zonder ondersteuning voor streaming en hardwareversnelde video. Gebruik AVPlayer voor video en HLS, AVAudioPlayer voor eenvoudige audio.
Nee, AVPlayer ondersteunt het direct laden van YouTube-inhoud niet, omdat YouTube zijn eigen speler op basis van DASH en propriëtaire formaten gebruikt. Gebruik voor YouTube-integratie in een iOS-app de YouTube IFrame Player API via WKWebView of de officiële bibliotheek youtube-ios-player-helper.
Voeg voor achtergrondaudio Audio, AirPlay and Picture in Picture toe aan de Background Modes van uw Xcode-project. Configureer AVAudioSession met de categorie .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer blijft afspelen op de achtergrond en het vergrendelscherm en Bedieningspaneel tonen bedieningselementen via MPNowPlayingInfoCenter.
Deze diensten gebruiken DRM-bescherming en eigen speleroplossingen. AVPlayer kan alleen inhoud afspelen via een directe link naar een mediabestand of HLS-afspeellijst. Video's van YouTube en vergelijkbare platforms zijn ingepakt in een iframe of JavaScript-speler die niet compatibel is met AVPlayer. Gebruik hun officiële SDK's of WebView voor weergave.
Configureer voor Low-Latency HLS de AVPlayerItem met preferredForwardBufferDuration = 2.0 (seconden) en beheer automatisch de pauze bij achterblijven op de live-grens: gebruik player.currentItem?.configuredTimeOffsetFromLive en player.currentItem?.canPlayReverse. Apple beveelt LL-HLS aan met een vertraging van 2-4 seconden bij correcte configuratie op server en client.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook