AVPlayer ist ein Mediaplayer-Framework von Apple, Teil von AVFoundation, das Audio- und Videowiedergabe auf iOS, macOS, tvOS und visionOS ermöglicht. AVPlayer unterstützt eine breite Palette von Formaten — von lokalen MP4-Dateien bis zu adaptiven HLS-Streams — über eine einheitliche API mit hardwarebeschleunigter Dekodierung auf Apple Silicon-Chips. Laut Apple WWDC (2024) wird AVPlayer in 90% der iOS-Apps verwendet, die mit Medien arbeiten, einschließlich Apple TV, Music und Photos.
Wichtige Erkenntnisse
AVPlayer ist die zentrale Komponente des AVFoundation-Frameworks, verantwortlich für die Multimedia-Wiedergabe auf allen Apple-Plattformen. Eingeführt in iOS 4.0 (2010) als Ersatz für den veralteten MPMoviePlayerController, bietet AVPlayer eine Low-Level-Steuerung der Wiedergabe mit Feinabstimmung von Dekodierungsparametern, Audio-Video-Synchronisation und Integration mit Systemdiensten wie AirPlay und Picture in Picture.
Im Gegensatz zu Playern von Drittanbietern profitiert AVPlayer von der Hardwarebeschleunigung auf Apple Silicon-Chips. Die Videodekodierung erfolgt über VideoToolbox mit den dedizierten M-Serie Media Engines, was eine 8K-HDR-Wiedergabe mit minimalem Stromverbrauch ermöglicht. Für HEVC (H.265) und ProRes erfolgt die Dekodierung auf spezialisierten Chip-Blöcken ohne Belastung der CPU.
AVPlayer ist eng in das Apple-Ökosystem integriert: Handoff-Unterstützung zum Übertragen der Wiedergabe zwischen Geräten, AirPlay 2 zum Streamen auf Apple TV, räumliches Audio mit dynamischer Kopfverfolgung und Synchronisation mit Systemsteuerungselementen über MPNowPlayingInfoCenter. Diese Integrationen machen AVPlayer zum De-facto-Standard für alle Medien-anwendungen auf Apple-Plattformen.
Das AVFoundation-Framework bietet eine dreistufige Hierarchie für die Wiedergabe: AVAsset (Metadaten und Inhaltsinformationen), AVPlayerItem (Zustand und Verwaltung einer bestimmten Inhaltsinstanz) und AVPlayer (Wiedergabesteuerung). Diese Architektur trennt das Laden von Metadaten, die Wiedergabevorbereitung und den Wiedergabeprozess selbst — was besonders für HLS-Streams mit mehreren Bitraten-Optionen wichtig ist.
AVAsset repräsentiert ein Medieninhaltsmodell — eine Datei oder einen Stream. AVAsset ist selbst nicht abspielbar; es enthält Spuren (AVAssetTrack), Metadaten (commonMetadata), Dauerinformationen und andere Eigenschaften. Aus AVAsset wird ein AVPlayerItem erstellt, das dann an AVPlayer zur Wiedergabe übergeben werden kann.
AVPlayer bietet eine Reihe von Fähigkeiten, die die meisten Wiedergabeszenarien abdecken — von einfacher Dateiwiedergabe bis zu komplexen Live-Übertragungen mit DRM. Lassen Sie uns die wichtigsten Funktionen mit Anwendungsbeispielen erkunden.
| Funktion | Beschreibung | Plattformen |
|---|---|---|
| Lokale Dateien | MP4, MOV, M4V, AVI, MKV (über Erweiterungen) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming mit adaptivem ABR | Alle Apple-Plattformen |
| FairPlay DRM | Geschützte HLS-Inhalte mit Streaming-Lizenz | iOS, tvOS, macOS |
| Picture in Picture | Schwebendes Video-Fenster über anderen Apps | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Drahtloses Streaming auf Apple TV und Lautsprecher | Alle Plattformen |
| Räumliches Audio | Dolby Atmos und dynamische Kopfverfolgung | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG mit Display-Unterstützung | iOS 11+, macOS 10.13+ |
AVPlayer bietet native HLS-Unterstützung ohne zusätzliche Bibliotheken. Bei der Wiedergabe eines HLS-Streams verwaltet AVPlayer automatisch die adaptive Bitratenumschaltung mit einem integrierten, für Apple-Plattformen optimierten ABR-Algorithmus. Der Algorithmus berücksichtigt nicht nur die Netzwerkbandbreite, sondern auch den thermischen Zustand des Geräts — bei Überhitzung kann AVPlayer die Bitrate senken, um die CPU-Auslastung zu verringern.
Für HLS-Streams mit FairPlay Streaming verwaltet AVPlayer automatisch den Lizenzerwerb und die Verlängerung über den AVContentKeySession-Delegaten. Der Entwickler muss das AVContentKeySessionDelegate-Protokoll implementieren, das vom Player aufgerufen wird, wenn ein Entschlüsselungsschlüssel abgerufen oder erneuert werden muss. Dies ist die einzige Möglichkeit, HLS-Inhalte auf Apple-Plattformen zu schützen, da Widevine auf iOS nicht unterstützt wird.
PiP ist ein Modus, der es Benutzern ermöglicht, Videos beim Wechseln zwischen Apps in einem schwebenden Fenster weiter anzusehen. Auf iPad und iPhone (iOS 14+) integriert sich AVPlayer mit AVPictureInPictureController, um diesen Modus zu aktivieren. Auf macOS 15+ ist PiP ebenfalls verfügbar, wird aber über das Systemmenü oder eine Schaltfläche im Player-Fenster aktiviert.
Die Integration von AVPlayer in eine iOS-App kann auf zwei Arten erfolgen: über den hochwertigen AVPlayerViewController (für Standardszenarien) oder direkt über AVPlayer + AVPlayerLayer (für vollständige UI-Anpassung). Lassen Sie uns beide Ansätze in Swift erkunden.
AVPlayerViewController ist eine gebrauchsfertige UI-Komponente mit integrierten Steuerelementen: Play/Pause, Suche, Lautstärke, AirPlay, PiP und Vollbildmodus. Die minimale Integration erfordert nur wenige Codezeilen: Erstellen Sie eine AVPlayer-Instanz, übergeben Sie sie an AVPlayerViewController und zeigen Sie den Controller auf dem Bildschirm an.
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()
}
Für Apps mit benutzerdefinierter UI verwenden Sie AVPlayerLayer — eine Core Animation-Ebene, die Videos in jeder UIView rendert. Dieser Ansatz bietet vollständige Kontrolle über die Oberfläche: Sie können benutzerdefinierte Steuerelemente, Animationen und zusätzliche Ebenen über dem Video hinzufügen.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Verwendung:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Eine ordnungsgemäße Lebenszyklusverwaltung des Players ist für die Stabilität der App entscheidend. AVPlayer sollte beim Erscheinen des Bildschirms erstellt und beim Schließen freigegeben werden. Wenn die App in den Hintergrund geht, wird empfohlen, die Wiedergabe zu pausieren, um Ressourcen zu schonen und Strafen durch App Review für unnötige Hintergrundwiedergabe zu vermeiden.
AVPlayerLayer ist eine Core Animation-Ebene, die von CALayer erbt und Videos auf dem Bildschirm rendert. Im Gegensatz zu UIView arbeitet AVPlayerLayer direkt mit der GPU über Metal oder OpenGL und gewährleistet eine minimale Bildausgabeverzögerung. Das Verständnis von AVPlayerLayer ist für die Implementierung benutzerdefinierter Wiedergabeoberflächen unerlässlich.
Die Eigenschaft videoGravity bestimmt, wie das Video in die Layer-Grenzen passt. AVLayerVideoGravity.resizeAspect (Seitenverhältnis mit schwarzen Balken beibehalten) ist der Standard für AVPlayerViewController. resizeAspectFill (Füllen des gesamten Bildschirms mit Zuschneiden) wird für den Vollbildmodus verwendet. resize (Verzerren der Proportionen an die Layergröße) wird selten verwendet, hauptsächlich für Analyseanwendungen.
AVPlayerLayer rendert Videos in Echtzeit, aber alle Player-Operationen (Start, Pause, Suche) müssen im Hauptthread ausgeführt werden. Schlüsselwerte zur Beobachtung — timeControlStatus, rate, status und error — werden über KVO (Key-Value Observing) oder die moderne async/await-API verfolgt, die in iOS 16 durch AVPlayer-Methoden mit Swift Concurrency-Unterstützung eingeführt wurde.
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 unterstützt eingebettete Untertitel in den Formaten VTT, CEA-608 und ITT (iTunes Timed Text). Die Auswahl von Audiospur und Untertiteln erfolgt über AVMediaSelectionGroup und AVMediaSelectionOption. Die Untertiteleinstellungen des Benutzers (Schriftart, Größe, Farbe) werden aus den System-Barrierefreiheitseinstellungen gelesen und automatisch auf AVPlayerLayer angewendet, sofern nicht explizit im Code angegeben.
Für Produktionsanwendungen erfordert die grundlegende AVPlayer-Integration oft zusätzliche Konfiguration: HLS-Segment-Caching, FairPlay-DRM-Integration, Now Playing-Systemintegration und benutzerdefinierte Bitratenauswahl-Algorithmen.
AVAssetResourceLoader ist die einzige Möglichkeit, das Laden von HLS-Segmenten abzufangen und Caching zu implementieren. Der AVAssetResourceLoaderDelegate empfängt Ladeanfragen für Schlüssel und Segmente, ermöglicht deren lokale Speicherung und Rückgabe aus dem Cache bei nachfolgenden Anfragen. Dies ist besonders nützlich für Anwendungen, die unter instabilen Netzwerkbedingungen arbeiten.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) ist Apples Standard zum Schutz von HLS-Inhalten. Zur Integration von FPS müssen Sie das AVContentKeySessionDelegate-Protokoll implementieren, das Anfragen für Entschlüsselungsschlüssel bearbeitet. Der Prozess umfasst: Abrufen von SPC (Server Playback Context) vom Player, Senden an einen Lizenzserver, Empfangen von CKC (Content Key Context) und Zurückgeben an AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. SPC von keyRequest abrufen
// 2. SPC an Lizenzserver senden
// 3. CKC abrufen und an keyRequest.processContentKeyResponse übergeben
}
}
Um aktuelle Wiedergabeinformationen auf dem Sperrbildschirm, im Kontrollzentrum und auf der Apple Watch anzuzeigen, verwenden Sie MPNowPlayingInfoCenter aus MediaPlayer.framework. AVPlayer aktualisiert Now Playing nicht automatisch — der Entwickler muss Metadaten (Titel, Künstler, Cover, Fortschritt) manuell setzen, wenn sich der Wiedergabestatus ändert. Ein regelmäßiger Timer oder observe(\.timeControlStatus) wird für Fortschrittsaktualisierungen verwendet.
Remote Command Center ist ein weiterer Systemdienst, der die Steuerung der Wiedergabe vom Sperrbildschirm, von AirPods und CarPlay aus ermöglicht. MPRemoteCommandCenter registriert Handler für die Befehle play, pause, nextTrack, previousTrack, changePlaybackPosition und skipForward/skipBackward. AVPlayer verarbeitet diese Befehle nicht automatisch — der Entwickler muss sie mit den Aufrufen player.play(), player.pause() und player.seek() verbinden.
Häufig gestellte Fragen
AVPlayer ist ein universeller Player für Audio und Video mit Unterstützung für Streaming, HLS, DRM und Synchronisation mit Systemsteuerungen. AVAudioPlayer ist ein vereinfachter Audio-Player für die Wiedergabe lokaler Audiodateien ohne Streaming oder Hardware-Videobeschleunigung. Für Video und HLS verwenden Sie AVPlayer, für einfaches Audio verwenden Sie AVAudioPlayer.
Nein, AVPlayer unterstützt kein direktes Laden von YouTube-Inhalten, da YouTube seinen eigenen Player auf Basis von DASH und proprietären Formaten verwendet. Um YouTube in eine iOS-App zu integrieren, verwenden Sie die YouTube IFrame Player API über WKWebView oder die offizielle Bibliothek youtube-ios-player-helper.
Für Hintergrundaudio fügen Sie Audio, AirPlay and Picture in Picture zu den Hintergrundmodi Ihres Xcode-Projekts hinzu. Konfigurieren Sie AVAudioSession mit der Kategorie .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer wird die Wiedergabe im Hintergrund fortsetzen, und der Sperrbildschirm und das Kontrollzentrum zeigen Steuerelemente über MPNowPlayingInfoCenter an.
Diese Dienste verwenden DRM-Schutz und eigene Player-Lösungen. AVPlayer kann Inhalte nur über eine direkte Mediendatei-URL oder HLS-Playlist abspielen. Videos von YouTube und ähnlichen Plattformen sind in iframe- oder JavaScript-Player eingebettet, die mit AVPlayer nicht kompatibel sind. Verwenden Sie deren offizielle SDKs oder WebView zur Anzeige.
Für Low-Latency-HLS konfigurieren Sie AVPlayerItem mit preferredForwardBufferDuration = 2.0 (Sekunden) und verwalten Sie die Pause automatisch, wenn Sie hinter der Live-Grenze zurückfallen: verwenden Sie player.currentItem?.configuredTimeOffsetFromLive und player.currentItem?.canPlayReverse. Apple empfiehlt LL-HLS mit einer Latenz von 2-4 Sekunden bei korrekter Konfiguration auf Server- und Client-Seite.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch