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, контролер се приказује преко целог екрана. Видео почиње учитавање из мреже и чим бафер достигне праг 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, транспортна трака потпуно нестаје, остављајући само видео ток. Корисно за прилагођене overlay елементе.
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 дугме
}
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 тражи међу аудио опцијама групе audiable ону варијанту чији 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 секунди при low-latency подешавањима.
Претплатите се на KVO својства AVPlayerItem.status. При грешци статус се мења у .failed. Добијте детаље преко својства error AVPlayerItem-а и прикажите кориснику alert са објашњењем — често је проблем у мрежи или неисправном URL-у.
Да, користите AVAsset са прилагођеним AVAssetResourceLoader-ом за довод података из RAM меморије. Имплементирајте делегат AVAssetResourceLoaderDelegate и враћајте бајтове из бафера уместо читања са диска.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође