AVPlayerViewController — ένας ενσωματωμένος ελεγκτής συσκευής αναπαραγωγής βίντεο στο οικοσύστημα Apple, σχεδιασμένος για αναπαραγωγή πολυμέσων σε iOS και tvOS. Παρέχει μια διεπαφή πλήρους οθόνης με στοιχεία ελέγχου, υποστήριξη υποτίτλων και AirPlay χωρίς την ανάγκη σύνταξης προσαρμοσμένου UI. Σύμφωνα με την Apple Developer Documentation, 2026, το AVPlayerViewController ενσωματώνεται με λίγες γραμμές κώδικα και υποστηρίζει HLS, MP4 και τις περισσότερες μορφές πολυμέσων.
Κύρια σημεία
AVPlayerViewController — είναι ένα στοιχείο του πλαισίου AVKit που παρέχει μια έτοιμη διεπαφή για αναπαραγωγή βίντεο σε εφαρμογές Apple. Απαλλάσσει τον προγραμματιστή από την ανάγκη δημιουργίας προσαρμοσμένης συσκευής αναπαραγωγής από το μηδέν, προσφέροντας τυπικά στοιχεία ελέγχου: play/pause, μεταγύριση, ρύθμιση έντασης και λειτουργία πλήρους οθόνης.
Σε αντίθεση με το χαμηλού επιπέδου AVPlayerLayer, το οποίο απαιτεί χειροκίνητη δημιουργία UI, το AVPlayerViewController διαχειρίζεται πλήρως τον κύκλο ζωής της συσκευής αναπαραγωγής. Ο ελεγκτής χειρίζεται αυτόματα την περιστροφή οθόνης, προσαρμόζεται στην Safe Area σε iPhone με εγκοπή και υποστηρίζει πολλαπλές εργασίες στο iPad.
Σύμφωνα με την Apple Documentation (2026), το AVPlayerViewController είναι συμβατό με AVPlayer και AVQueuePlayer, επιτρέποντας την αναπαραγωγή τόσο μεμονωμένων αρχείων όσο και λιστών αναπαραγωγής. Υποστηρίζονται URL από τοπικό αποθηκευτικό χώρο, δικτυακές ροές HLS και κρυπτογραφημένο περιεχόμενο FairPlay.
Το στοιχείο εμφανίστηκε στο iOS 8 μαζί με το AVKit ως αντικατάσταση του παρωχημένου MPMoviePlayerController. Στο iOS 11 προστέθηκε υποστήριξη για Picture in Picture και εμφάνιση υποτίτλων. Στο iOS 14 ο ελεγκτής απέκτησε προσαρμόσιμο πίνακα μεταφοράς μέσω του εκπροσώπου AVPlayerViewControllerDelegate. Από το iOS 16, προστέθηκε υποστήριξη για δυναμική αντικατάσταση αρχείου πολυμέσων χωρίς εκ νέου δημιουργία της συσκευής αναπαραγωγής.
Το σύγχρονο AVPlayerViewController είναι βελτιστοποιημένο για οθόνες ProMotion — ο ρυθμός καρέ βίντεο συγχρονίζεται αυτόματα με τον ρυθμό ανανέωσης οθόνης. Στο tvOS το στοιχείο προσαρμόζεται στη διεπαφή εστίασης του Siri Remote, ενώ στο macOS — στη λειτουργία παραθύρου του QuickTime Player.
Στην καρδιά του ελεγκτή βρίσκεται ο συνδυασμός AVPlayer και AVPlayerItem. Το AVPlayer είναι ένα αντικείμενο αναπαραγωγής που διαχειρίζεται τη γραμμή χρόνου, την ταχύτητα και την κατάσταση. Το AVPlayerItem είναι ένα περιτύλιγμα γύρω από ένα συγκεκριμένο αρχείο πολυμέσων, που περιέχει μεταδεδομένα, κομμάτια και πληροφορίες φόρτωσης.
Κατά την αρχικοποίηση, το AVPlayerViewController λαμβάνει μια αναφορά στο AVPlayer και δημιουργεί αυτόματα ένα AVPlayerLayer για την εμφάνιση βίντεο. Ο ελεγκτής εγγράφεται σε ειδοποιήσεις KVO του AVPlayer σχετικά με την αλλαγή κατάστασης readyToPlay, σφάλματα φόρτωσης και λήξη αναπαραγωγής.
Τα στοιχεία ελέγχου (πίνακας μεταφοράς) εμφανίζονται με το πάτημα στην οθόνη. Στο iOS 15+ υποστηρίζουν προσαρμογή μέσω του AVPlayerViewControllerCustomizationDelegate, επιτρέποντας την απόκρυψη ή αντικατάσταση των τυπικών κουμπιών.
Μετά τη δημιουργία του ελεγκτή και την ανάθεση του AVPlayer, καλείται η μέθοδος viewDidLoad, η οποία ξεκινά την προετοιμασία της ροής βίντεο. Όταν το AVPlayerItem μεταβαίνει στην κατάσταση AVPlayerItemStatusReadyToPlay, η συσκευή αναπαραγωγής είναι έτοιμη για εμφάνιση καρέ. Κατά την κλήση της μεθόδου play() ξεκινά η αποκωδικοποίηση της ροής βίντεο μέσω του Video Toolbox.
Κατά την αποχώρηση από την οθόνη, ο ελεγκτής διακόπτει αυτόματα την αναπαραγωγή και απελευθερώνει τους πόρους του αποκωδικοποιητή. Στο iOS 13+ για τη διατήρηση της αναπαραγωγής κατά την ελαχιστοποίηση της εφαρμογής απαιτείται ρύθμιση των Background Modes και Audio Session. Σύμφωνα με το WWDC 2024, συνιστάται η χρήση του AVPlayerPlaybackCoordinator για συγχρονισμό με το κέντρο πολυμέσων του iOS.
Το στοιχείο παρέχει ένα πλούσιο σύνολο λειτουργιών από προεπιλογή, καθιστώντας το ελκυστικό για τα περισσότερα έργα. Παρακάτω παρατίθενται οι βασικές δυνατότητες που δεν απαιτούν πρόσθετο κώδικα.
Ο πίνακας μεταφοράς είναι το κάτω μέρος της διεπαφής που περιέχει τα βασικά κουμπιά ελέγχου. Από προεπιλογή, ο πίνακας κρύβεται μετά από 3 δευτερόλεπτα αδράνειας του χρήστη και εμφανίζεται με το πάτημα. Στο iOS 16+ μέσω του εκπροσώπου μπορείτε να διαχειριστείτε την ορατότητα μεμονωμένων στοιχείων.
Σε λειτουργία εντοπισμού σφαλμάτων, ο πίνακας μεταφοράς μπορεί να εμφανίζεται υποχρεωτικά μέσω της ιδιότητας AVPlayerViewController.requiresLinearPlayback, η οποία επίσης μπλοκάρει τη δυνατότητα παύσης του βίντεο. Αυτό είναι χρήσιμο για διαφημιστικά ένθετα και εκπαιδευτικό περιεχόμενο.
Η βασική ενσωμάτωση του ελεγκτή απαιτεί όχι περισσότερες από 10 γραμμές κώδικα. Πρώτα, πρέπει να δημιουργήσετε μια παρουσία του AVPlayer με το URL του αρχείου πολυμέσων, στη συνέχεια να το μεταφέρετε στο AVPlayerViewController και να εμφανίσετε τον ελεγκτή στην οθόνη.
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()
}
Μετά την κλήση του present, ο ελεγκτής εμφανίζεται σε πλήρη οθόνη. Το βίντεο ξεκινά τη φόρτωση από το δίκτυο και μόλις ο buffer φτάσει το όριο readyToPlay, ξεκινά αυτόματα η αναπαραγωγή μετά την κλήση του play().
let asset = AVAsset(url: videoURL)
let item = AVPlayerItem(asset: asset)
let metadata = AVMutableMetadataItem()
metadata.key = AVMetadataKey.commonKeyTitle
metadata.value = "Το βίντεό μου"
item.addMetadata(metadata)
let player = AVPlayer(playerItem: item)
let playerVC = AVPlayerViewController()
playerVC.player = player
Η χρήση του AVPlayerItem δίνει έλεγχο στα μεταδεδομένα, χρονικούς κωδικούς, επιλογή ηχητικών κομματιών και υποτίτλων. Μέσω του AVPlayerItem μπορείτε επίσης να παρακολουθείτε την πρόοδο φόρτωσης, τη ρυθμιστική προσωρινή αποθήκευση και σφάλματα δικτύου χρησιμοποιώντας KVO στην ιδιότητα status.
Από το iOS 11, ο προγραμματιστής μπορεί να προσαρμόσει τον πίνακα μεταφοράς μέσω του πρωτοκόλλου AVPlayerViewControllerDelegate. Η μέθοδος playerViewController(_:willBeginFullScreenPresentationWithAnimationCoordinator:) καλείται πριν από την είσοδο σε λειτουργία πλήρους οθόνης και επιτρέπει την προετοιμασία του UI.
Για απόκρυψη μεμονωμένων κουμπιών χρησιμοποιείται η ιδιότητα AVPlayerViewController.showsPlaybackControls. Αν οριστεί σε false, ο πίνακας μεταφοράς εξαφανίζεται εντελώς, αφήνοντας μόνο τη ροή βίντεο. Χρήσιμο για προσαρμοσμένα επικαλυπτόμενα στοιχεία.
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
) {
// Προσθήκη κουμπιού επικάλυψης
}
func playerViewController(
_ playerViewController: AVPlayerViewController,
didUpdate legibleMediaSelection: AVMediaSelectionGroup
) {
print("Επιλέχθηκε νέα γλώσσα υποτίτλων")
}
}
Ο εκπρόσωπος επιτρέπει την παρακολούθηση συμβάντων αλλαγής υποτίτλων, εισόδου και εξόδου από λειτουργία πλήρους οθόνης, καθώς και έναρξης και ολοκλήρωσης Picture in Picture. Στο WWDC 2024, η Apple συνέστησε τη χρήση εκπροσώπου για αναλυτικά στοιχεία — καταγραφή κάθε μετάβασης έως 100 ms.
Το AVPlayerViewController εμφανίζει αυτόματα όλους τους διαθέσιμους υπότιτλους και ηχητικές διαδρομές, εάν είναι ενσωματωμένοι στο αρχείο πολυμέσων ή αναφέρονται στο μανιφέστο HLS. Ο χρήστης μπορεί να τους εναλλάσσει μέσω του μενού που εμφανίζεται με πάτημα στο εικονίδιο υποτίτλων στον πίνακα μεταφοράς.
Για ροές HLS, το μανιφέστο M3U8 περιέχει μια λίστα διαθέσιμων γλωσσικών επιλογών. Το AVPlayer φορτώνει τα αντίστοιχα τμήματα υποτίτλων σε μορφή WebVTT και τα μεταδίδει για απόδοση μέσω του AVPlayerLayer. Στο iOS 16+ προστέθηκε υποστήριξη για στυλιζάρισμα υποτίτλων μέσω του 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)
}
}
}
Η μέθοδος selectAudioTrack αναζητά μεταξύ των ηχητικών επιλογών της ομάδας audible αυτήν της οποίας το extendedLanguageTag ταιριάζει με τον επιθυμητό κωδικό γλώσσας. Αυτό επιτρέπει την υλοποίηση της λειτουργίας “Ηχητική απόδοση στο πρωτότυπο” σε εφαρμογές με πολύγλωσσο περιεχόμενο.
Η λειτουργία Picture in Picture (PiP) επιτρέπει την εμφάνιση βίντεο σε πλωτό παράθυρο πάνω από άλλες εφαρμογές. Στο iPad αυτή η λειτουργία είναι διαθέσιμη από το iOS 9, στο iPhone — από το iOS 14. Το AVPlayerViewController προσθέτει αυτόματα το κουμπί PiP στον πίνακα μεταφοράς όταν υπάρχει εγγραφή στο UIBackgroundModes.
Για ενεργοποίηση του PiP, πρέπει να προστεθεί στο Info.plist το κλειδί UIBackgroundModes με τιμή audio και airplay. Μετά από αυτό, εμφανίζεται το κουμπί PiP στον ελεγκτή, με το πάτημα του οποίου το βίντεο συμπτύσσεται σε πλωτό παράθυρο μεγέθους 192x108 σημείων.
Τα συμβάντα PiP διαχειρίζονται μέσω του εκπροσώπου: playerViewController(_:willStartPictureInPictureFromFullScreen:) και playerViewController(_:didStopPictureInPicture:). Σύμφωνα με το Apple HIG, το ελάχιστο μέγεθος παραθύρου PiP πρέπει να είναι τουλάχιστον 120x68 σημεία για διατήρηση της αναγνωσιμότητας του περιεχομένου.
Συχνές ερωτήσεις
Όχι, για βίντεο YouTube απαιτείται η χρήση web-view WKWebView ή της βιβλιοθήκης YouTube iOS Helper, καθώς το YouTube χρησιμοποιεί το δικό του σύστημα DRM. Το AVPlayerViewController προορίζεται για άμεσες ροές πολυμέσων μέσω URL.
Ορίστε την ιδιότητα showsPlaybackControls σε false. Μετά από αυτό, η οθόνη παραμένει κενή — μόνο η ροή βίντεο. Για επιστροφή προσαρμοσμένων κουμπιών, προσθέστε overlay μέσω addSubview πάνω από τον ελεγκτή.
Ναι, ο ελεγκτής υποστηρίζει πλήρως HLS Live. Στον πίνακα μεταφοράς εμφανίζεται ένδειξη Live αντί για ολισθητή προόδου. Η καθυστέρηση εξαρτάται από τη διαμόρφωση HLS — ελάχιστα 6 δευτερόλεπτα με ρυθμίσεις χαμηλής καθυστέρησης.
Εγγραφείτε στο KVO της ιδιότητας AVPlayerItem.status. Σε περίπτωση σφάλματος, η κατάσταση αλλάζει σε .failed. Ανακτήστε τις λεπτομέρειες μέσω της ιδιότητας error του AVPlayerItem και εμφανίστε ειδοποίηση στον χρήστη με επεξήγηση — συχνά το πρόβλημα είναι στο δίκτυο ή στο λανθασμένο URL.
Ναι, χρησιμοποιήστε AVAsset με προσαρμοσμένο AVAssetResourceLoader για παροχή δεδομένων από τη μνήμη RAM. Υλοποιήστε τον εκπρόσωπο AVAssetResourceLoaderDelegate και επιστρέψτε bytes από τον buffer αντί για ανάγνωση από δίσκο.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης