AVPlayerViewController ist ein integrierter Videoplayer-Controller im Apple-Ökosystem, der für die Wiedergabe von Medieninhalten auf iOS und tvOS entwickelt wurde. Er bietet eine Vollbild-Oberfläche mit Bedienelementen, Untertitelunterstützung und AirPlay, ohne dass eine benutzerdefinierte Benutzeroberfläche geschrieben werden muss. Laut der Apple Developer Dokumentation, 2026, lässt sich AVPlayerViewController mit nur wenigen Codezeilen integrieren und unterstützt HLS, MP4 und die meisten Medienformate.
Die wichtigsten Punkte
AVPlayerViewController ist eine Komponente des AVKit-Frameworks, die eine fertige Oberfläche zum Abspielen von Videos in Apple-Anwendungen bereitstellt. Er erspart dem Entwickler die Notwendigkeit, einen eigenen Player von Grund auf neu zu erstellen, und bietet Standardsteuerelemente: Play/Pause, Scrubbing, Lautstärkeregelung und Vollbildmodus.
Im Gegensatz zu AVPlayerLayer auf niedriger Ebene, das eine manuelle UI-Erstellung erfordert, verwaltet AVPlayerViewController den gesamten Player-Lebenszyklus. Der Controller verarbeitet automatisch die Bildschirmdrehung, passt sich an den Safe Area auf iPhones mit Notch an und unterstützt Multitasking auf dem iPad.
Laut Apple Dokumentation (2026) ist AVPlayerViewController mit AVPlayer und AVQueuePlayer kompatibel und ermöglicht die Wiedergabe von Einzeldateien und Playlists. URLs aus dem lokalen Speicher, HLS-Netzwerkstreams und verschlüsselte FairPlay-Inhalte werden unterstützt.
Die Komponente erschien in iOS 8 zusammen mit AVKit als Ersatz für den veralteten MPMoviePlayerController. In iOS 11 wurde die Unterstützung für Picture in Picture und die Anzeige von Untertiteln hinzugefügt. In iOS 14 erhielt der Controller eine anpassbare Transportleiste über AVPlayerViewControllerDelegate. Ab iOS 16 wurde die Unterstützung für den dynamischen Austausch von Mediendateien ohne Neuerstellung des Players eingeführt.
Der moderne AVPlayerViewController ist für ProMotion-Displays optimiert — die Videobildrate wird automatisch mit der Bildwiederholfrequenz des Bildschirms synchronisiert. Auf tvOS passt sich die Komponente an die Fokus-Schnittstelle der Siri Remote an, auf macOS an den Fenstermodus des QuickTime Players.
Im Kern des Controllers liegt die Verbindung von AVPlayer und AVPlayerItem. AVPlayer ist das Wiedergabeobjekt, das die Zeitachse, Geschwindigkeit und den Zustand verwaltet. AVPlayerItem ist ein Wrapper um eine bestimmte Mediendatei, der Metadaten, Spuren und Ladeinformationen enthält.
Bei der Initialisierung erhält AVPlayerViewController eine Referenz auf AVPlayer und erstellt automatisch eine AVPlayerLayer zur Anzeige des Videos. Der Controller abonniert KVO-Benachrichtigungen von AVPlayer über Statusänderungen wie readyToPlay, Ladefehler und Wiedergabeende.
Die Steuerelemente (Transportleiste) werden durch Antippen angezeigt. Ab iOS 15+ unterstützen sie die Anpassung über AVPlayerViewControllerCustomizationDelegate, wodurch Standardschaltflächen ausgeblendet oder ersetzt werden können.
Nach dem Erstellen des Controllers und Zuweisen von AVPlayer wird die Methode viewDidLoad aufgerufen, die die Vorbereitung des Videostreams startet. Wenn AVPlayerItem in den Status AVPlayerItemStatusReadyToPlay übergeht, ist der Player bereit, Bilder anzuzeigen. Wenn die Methode play() aufgerufen wird, beginnt die Dekodierung des Videostreams über Video Toolbox.
Beim Verlassen des Bildschirms pausiert der Controller automatisch die Wiedergabe und gibt die Dekoder-Ressourcen frei. Unter iOS 13+ müssen Hintergrundmodi und die Audiosession konfiguriert werden, um die Wiedergabe beim Minimieren der App aufrechtzuerhalten. Laut WWDC 2024 wird die Verwendung von AVPlayerPlaybackCoordinator zur Synchronisierung mit dem iOS-Mediencenter empfohlen.
Die Komponente bietet eine umfangreiche Reihe von Funktionen aus dem Stand, was sie für die meisten Projekte attraktiv macht. Nachfolgend sind die wichtigsten Fähigkeiten aufgeführt, die keinen zusätzlichen Code erfordern.
Die Transportleiste ist der untere Teil der Benutzeroberfläche, der die Hauptsteuertasten enthält. Standardmäßig wird die Leiste nach 3 Sekunden Inaktivität des Benutzers ausgeblendet und durch Antippen wieder angezeigt. Ab iOS 16+ kann der Delegat verwendet werden, um die Sichtbarkeit einzelner Elemente zu steuern.
Im Debug-Modus kann die Transportleiste mit der Eigenschaft AVPlayerViewController.requiresLinearPlayback erzwungen werden, was auch verhindert, dass das Video pausiert wird. Dies ist nützlich für Werbeunterbrechungen und Bildungsinhalte.
Die grundlegende Integration des Controllers erfordert nicht mehr als 10 Codezeilen. Erstellen Sie zunächst eine AVPlayer-Instanz mit der URL der Mediendatei, übergeben Sie sie an AVPlayerViewController und zeigen Sie den Controller auf dem Bildschirm an.
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()
}
Nach dem Aufruf von present wird der Controller im Vollbild angezeigt. Das Video beginnt mit dem Laden aus dem Netzwerk, und sobald der Puffer den readyToPlay-Schwellenwert erreicht, beginnt die Wiedergabe automatisch nach dem Aufruf von play().
let asset = AVAsset(url: videoURL)
let item = AVPlayerItem(asset: asset)
let metadata = AVMutableMetadataItem()
metadata.key = AVMetadataKey.commonKeyTitle
metadata.value = "Mein Video"
item.addMetadata(metadata)
let player = AVPlayer(playerItem: item)
let playerVC = AVPlayerViewController()
playerVC.player = player
Die Verwendung von AVPlayerItem gibt Ihnen die Kontrolle über Metadaten, Zeitcodes, die Auswahl von Audiospuren und Untertiteln. Über AVPlayerItem können Sie auch den Ladefortschritt, das Puffern und Netzwerkfehler über KVO auf der Status-Eigenschaft überwachen.
Ab iOS 11 können Entwickler die Transportleiste über das Protokoll AVPlayerViewControllerDelegate anpassen. Die Methode playerViewController(_:willBeginFullScreenPresentationWithAnimationCoordinator:) wird vor dem Eintritt in den Vollbildmodus aufgerufen und ermöglicht die Vorbereitung der Benutzeroberfläche.
Zum Ausblenden einzelner Schaltflächen verwenden Sie die Eigenschaft AVPlayerViewController.showsPlaybackControls. Wenn sie auf false gesetzt wird, verschwindet die Transportleiste vollständig und nur der Videostream bleibt übrig. Nützlich für benutzerdefinierte Overlay-Elemente.
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
) {
// Overlay-Schaltfläche hinzufügen
}
func playerViewController(
_ playerViewController: AVPlayerViewController,
didUpdate legibleMediaSelection: AVMediaSelectionGroup
) {
print("Neue Untertitelsprache ausgewählt")
}
}
Der Delegat ermöglicht das Abfangen von Untertiteländerungsereignissen, dem Ein- und Austritt aus dem Vollbildmodus sowie dem Starten und Beenden von Picture in Picture. Auf der WWDC 2024 empfahl Apple, den Delegaten für Analysen zu verwenden — protokollieren Sie jeden Übergang innerhalb von 100 ms.
AVPlayerViewController zeigt automatisch alle verfügbaren Untertitel und Audiospuren an, wenn sie in die Mediendatei eingebettet oder im HLS-Manifest angegeben sind. Benutzer können über das Menü wechseln, das durch Antippen des Untertitelsymbols in der Transportleiste angezeigt wird.
Für HLS-Streams enthält das M3U8-Manifest eine Liste verfügbarer Sprachvarianten. AVPlayer lädt die entsprechenden WebVTT-Untertitelsegmente und übergibt sie zur Darstellung an AVPlayerLayer. Ab iOS 16+ wird die Untertitelgestaltung über AVTextStyleRule unterstützt.
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)
}
}
}
Die Methode selectAudioTrack sucht unter den Audioptionen der audible-Gruppe nach der Variante, deren extendedLanguageTag mit dem gewünschten Sprachcode übereinstimmt. Dies ermöglicht die Implementierung der Funktion „Originalton“ in Apps mit mehrsprachigen Inhalten.
Der Picture in Picture (PiP)-Modus ermöglicht die Anzeige von Videos in einem schwebenden Fenster über anderen Apps. Auf dem iPad ist diese Funktion seit iOS 9 verfügbar, auf dem iPhone seit iOS 14. AVPlayerViewController fügt automatisch eine PiP-Schaltfläche zur Transportleiste hinzu, wenn UIBackgroundModes abonniert sind.
Um PiP zu aktivieren, fügen Sie den Schlüssel UIBackgroundModes mit den Werten audio und airplay zur Info.plist hinzu. Daraufhin erscheint eine PiP-Schaltfläche im Controller, die das Video bei Antippen in ein schwebendes Fenster von 192x108 Punkten einklappt.
PiP-Ereignisse werden über den Delegaten behandelt: playerViewController(_:willStartPictureInPictureFromFullScreen:) und playerViewController(_:didStopPictureInPicture:). Laut Apple HIG sollte die Mindestgröße des PiP-Fensters mindestens 120x68 Punkte betragen, um die Lesbarkeit des Inhalts zu gewährleisten.
Häufig gestellte Fragen
Nein, für YouTube-Videos ist die Verwendung einer Web-View WKWebView oder der YouTube iOS Helper-Bibliothek erforderlich, da YouTube ein eigenes DRM-System verwendet. AVPlayerViewController ist für direkte Medienstreams über URL ausgelegt.
Setzen Sie die Eigenschaft showsPlaybackControls auf false. Danach bleibt der Bildschirm leer — nur der Videostream. Um benutzerdefinierte Schaltflächen zurückzubringen, fügen Sie ein Overlay über addSubview auf dem Controller hinzu.
Ja, der Controller unterstützt HLS Live vollständig. Die Transportleiste zeigt einen Live-Indikator anstelle eines Fortschrittsbalkens. Die Latenz hängt von der HLS-Konfiguration ab — mindestens 6 Sekunden bei Low-Latency-Einstellungen.
Abonnieren Sie KVO auf der Eigenschaft AVPlayerItem.status. Bei einem Fehler ändert sich der Status auf .failed. Holen Sie Details über die error-Eigenschaft von AVPlayerItem ein und zeigen Sie dem Benutzer einen Alarm mit einer Erklärung — häufig handelt es sich um ein Netzwerkproblem oder eine ungültige URL.
Ja, verwenden Sie AVAsset mit einem benutzerdefinierten AVAssetResourceLoader, um Daten aus dem RAM zu speisen. Implementieren Sie AVAssetResourceLoaderDelegate und geben Sie Bytes aus einem Puffer zurück, anstatt von der Festplatte zu lesen.
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