AVPlayerViewController: шта је то, начини интеграције у iOS

Аутор: IT Sectr Објављено: 2026-05-23 Време читања: 8 мин

AVPlayerViewController је уграђени контролер видео плејера у Apple екосистему, намењен за репродукцију медијског садржаја на iOS и tvOS-у. Он обезбеђује интерфејс преко целог екрана са контролама, подршком за титлове и AirPlay без потребе за писањем прилагођеног UI-ја. Према Apple Developer Documentation, 2026, AVPlayerViewController се интегрише са неколико линија кода и подржава HLS, MP4 и већину медијских формата.

Главне тачке

  • AVPlayerViewController је стандардни контролер репродукције видеа из AVKit оквира за iOS и tvOS.
  • Он пружа готов кориснички интерфејс са контролном траком, дугмадима за репродукцију и индикатором напретка.
  • Контролер аутоматски подржава титлове, аудио траке, AirPlay и Picture in Picture.
  • Интеграција се врши преко AVPlayer-а — основног објекта за управљање репродукцијом.
  • Програмер може подесити приказ контрола, додати overlay-приказ и обрађивати догађаје преко делегата.

Шта је AVPlayerViewController?

AVPlayerViewController је компонента AVKit оквира која пружа готов интерфејс за репродукцију видеа у Apple апликацијама. Ослобађа програмера потребе за креирањем прилагођеног плејера од нуле, нудећи стандардне контроле: play/pause, премотавање, подешавање јачине звука и режим преко целог екрана.

За разлику од нисконивоског AVPlayerLayer-а који захтева ручно изграђивање UI-ја, AVPlayerViewController у потпуности управља животним циклусом плејера. Контролер аутоматски обрађује ротацију екрана, прилагођава се Safe Area-и на iPhone-у са изрезом и подржава мултитаскинг на iPad-у.

Према Apple Documentation (2026), AVPlayerViewController је компатибилан са AVPlayer и AVQueuePlayer, што омогућава репродукцију како појединачних датотека, тако и плејлиста. Подржани су URL-ови из локалног складишта, мрежни токови HLS и шифровани FairPlay садржаји.

Историја и верзије AVPlayerViewController-а

Компонента се појавила у iOS 8 заједно са AVKit-ом као замена за застарели MPMoviePlayerController. У iOS 11 додата је подршка за Picture in Picture и приказ титлова. У iOS 14 контролер је добио прилагодљиву контролну траку преко делегата AVPlayerViewControllerDelegate. Почев од iOS 16, појавила се подршка за динамичку замену медијске датотеке без поновног креирања плејера.

Модерни AVPlayerViewController је оптимизован за ProMotion дисплеје — брзина кадрова видеа се аутоматски синхронизује са брзином освежавања екрана. На tvOS-у се компонента прилагођава фокус интерфејсу Siri Remote-а, а на macOS-у — режиму прозора QuickTime Player-а.

Како ради AVPlayerViewController

У основи контролера лежи веза 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-а.

Главне могућности AVPlayerViewController-а

Компонента пружа богат скуп функција одмах из кутије, што је чини атрактивном за већину пројеката. Испод су представљене кључне могућности које не захтевају додатни код.

  • Транспортна трака са play/pause, премотавањем од 15 секунди, регулатором јачине звука и клизачем напретка.
  • Подршка за титлове — аутоматски приказ уграђених и спољних титлова у форматима VTT, SRT и iTunes Timed Text.
  • AirPlay — могућност емитовања видеа на Apple TV и друге AirPlay компатибилне уређаје.
  • Picture in Picture — репродукција у плутајућем прозору при притиску на специјално дугме (на iPad-у и iPhone-у са iOS 14+).
  • Режим преко целог екрана — аутоматско пребацивање при ротацији уређаја и при додиру дугмета за увећање.
  • Промена брзине — уграђени контролер избора брзине репродукције (0.5x, 1.0x, 1.5x, 2.0x).
  • Заштићени садржај — изворна подршка за FairPlay Streaming за HLS садржај са DRM-ом.

Транспортна трака AVPlayerViewController-а

Транспортна трака је доњи део интерфејса који садржи главна дугмад за контролу. Подразумевано, трака се сакрива након 3 секунде неактивности корисника и појављује се при додиру. У iOS 16+ преко делегата се може управљати видљивошћу појединих елемената.

У дебаг режиму, транспортна трака се може присилно приказати преко својства AVPlayerViewController.requiresLinearPlayback, које такође блокира могућност паузирања видеа. Ово је корисно за рекламне уметке и образовни садржај.

Интеграција AVPlayerViewController-а у пројекат

Основна интеграција контролера траје не више од 10 линија кода. Прво је потребно креирати инстанцу AVPlayer-а са URL-ом медијске датотеке, затим га проследити AVPlayerViewController-у и приказати контролер на екрану.

Креирање основног плејера у Swift-у

swift
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().

Подешавање AVPlayerItem-а за напредно управљање

swift
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 елементе.

Прилагођавање коришћењем делегата

swift
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-а.

Програмски избор аудио траке

swift
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 на iPad-у

Режим 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 тачака за очување читљивости садржаја.

Често постављана питања

Да ли AVPlayerViewController подржава репродукцију YouTube видеа?

Не, за YouTube видео је потребно користити web-view WKWebView или библиотеку YouTube iOS Helper, јер YouTube користи сопствени DRM систем. AVPlayerViewController је намењен за директне медијске токове преко URL-а.

Како искључити транспортну траку AVPlayerViewController-а?

Поставите својство showsPlaybackControls на false. Након тога екран остаје празан — само видео ток. За враћање прилагођених дугмади додајте overlay преко addSubview изнад контролера.

Да ли AVPlayerViewController ради са HLS уживо преносима?

Да, контролер у потпуности подржава HLS Live. На транспортној траци се приказује индикатор Live уместо клизача напретка. Кашњење зависи од HLS конфигурације — минимално 6 секунди при low-latency подешавањима.

Како обрадити грешку учитавања видеа у AVPlayerViewController-у?

Претплатите се на KVO својства AVPlayerItem.status. При грешци статус се мења у .failed. Добијте детаље преко својства error AVPlayerItem-а и прикажите кориснику alert са објашњењем — често је проблем у мрежи или неисправном URL-у.

Може ли се у AVPlayerViewController учитати видео из меморије?

Да, користите AVAsset са прилагођеним AVAssetResourceLoader-ом за довод података из RAM меморије. Имплементирајте делегат AVAssetResourceLoaderDelegate и враћајте бајтове из бафера уместо читања са диска.

Резиме

  • AVPlayerViewController — готова AVKit компонента за репродукцију видеа на iOS, iPadOS и tvOS-у са минималним кодом интеграције.
  • Контролер подржава HLS, MP4, заштићени FairPlay садржај, титлове и аудио траке одмах из кутије.
  • За основну употребу довољно је креирати AVPlayer и проследити га контролеру — UI ће се нацртати аутоматски.
  • Делегат AVPlayerViewControllerDelegate омогућава прилагођавање транспортне траке, управљање PiP-ом и промену титлова.
  • Транспортна трака се сакрива након 3 секунде неактивности, али showsPlaybackControls даје потпуну контролу над њеном видљивошћу.
  • За Picture in Picture потребна је активација UIBackgroundModes audio и airplay у Info.plist-у.
  • При грешкама користите KVO на AVPlayerItem.status за добијање детаља и приказивање кориснику.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође