AVPlayer је медија плејер фрејмворк компаније Apple, који је део AVFoundation-а и обезбеђује репродукцију аудио и видео записа на iOS, macOS, tvOS и visionOS платформама. AVPlayer подржава широк спектар формата — од локалних MP4 датотека до адаптивних HLS стримова — кроз јединствени API са хардверским убрзањем декодирања на Apple Silicon чиповима. Према подацима Apple WWDC (2024), AVPlayer се користи у 90% iOS апликација које раде са медијима, укључујући Apple TV, Music и Photos.
Главно
AVPlayer — централна компонента AVFoundation фрејмворка, одговорна за репродукцију мултимедијалног садржаја на свим Apple платформама. Представљен у iOS 4.0 (2010) као замена за застарели MPMoviePlayerController, AVPlayer обезбеђује нискоконтролну контролу над репродукцијом са могућношћу финоће подешавања параметара декодирања, синхронизације аудио и видео записа, као и интеграције са системским сервисима као што су AirPlay и Picture in Picture.
За разлику од плејера трећих страна, AVPlayer добија предности хардверског убрзања на Apple Silicon чиповима. Декодирање видеа се обавља преко VideoToolbox-а коришћењем наменских медија мотора M-серије (Media Engine), што обезбеђује репродукцију 8K HDR-а са минималном потрошњом енергије. За HEVC (H.265) и ProRes декодирање се обавља на специјализованим блоковима чипа, без оптерећења CPU-а.
AVPlayer је тесно интегрисан са Apple екосистемом: подршка за Handoff ради преноса репродукције између уређаја, AirPlay 2 за стримовање на Apple TV, просторни звук са динамичким праћењем главе и синхронизација са системским контролним елементима преко MPNowPlayingInfoCenter-а. Ове интеграције чине AVPlayer де факто стандардом за све апликације које раде са медијима на Apple платформама.
Фрејмворк AVFoundation пружа тростепену хијерархију за репродукцију: AVAsset (метаподаци и информације о садржају), AVPlayerItem (стање и управљање одређеном инстанцом садржаја) и AVPlayer (управљање репродукцијом). Ова архитектура омогућава раздвајање учитавања метаподатака, припреме за репродукцију и самог процеса репродукције, што је посебно важно за HLS стримове са вишеструким варијантама битрејта.
AVAsset представља модел медија садржаја — датотеке или стрима. AVAsset сам по себи није репродуктибилан; садржи траке (AVAssetTrack), метаподатке (commonMetadata), информације о трајању и друге карактеристике. Од AVAsset-а се креира AVPlayerItem, који се затим може предати AVPlayer-у за репродукцију.
AVPlayer пружа скуп могућности које покривају већину сценарија репродукције — од једноставног пуштања датотеке до сложених уживо преноса са DRM-ом. Размотримо кључне функције са примерима њихове примене.
| Могућност | Опис | Платформе |
|---|---|---|
| Локалне датотеке | MP4, MOV, M4V, AVI, MKV (кроз проширења) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming са адаптивним ABR-ом | Све Apple платформе |
| FairPlay DRM | Заштићени HLS садржај са стрим лиценцом | iOS, tvOS, macOS |
| Picture in Picture | Плутајући видео прозор изнад других апликација | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Бежични пренос на Apple TV и звучнике | Све платформе |
| Просторни звук | Dolby Atmos и динамичко праћење | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG уз подршку екрана | iOS 11+, macOS 10.13+ |
AVPlayer има изворну подршку за HLS без потребе за инсталирањем додатних библиотека. При репродукцији HLS стрима, AVPlayer аутоматски управља адаптивним пребацивањем битрејта, користећи уграђени ABR алгоритам оптимизован за Apple платформе. Алгоритам узима у обзир не само пропусни опсег мреже, већ и термичко стање уређаја — при прегревању, AVPlayer може смањити битрејт да би смањио оптерећење процесора.
За HLS стримове са FairPlay Streaming-ом, AVPlayer аутоматски обрађује добијање и обнављање лиценци путем делегата AVContentKeySession. Програмер треба да имплементира протокол AVContentKeySessionDelegate, који плејер позива када је потребно добити или обновити кључ за дешифровање. Ово је једини начин заштите HLS садржаја на Apple платформама, јер Widevine није подржан на iOS-у.
PiP — режим који омогућава кориснику да настави гледање видеа у плутајућем прозору при пребацивању између апликација. На iPad-у и iPhone-у (iOS 14+) AVPlayer се интегрише са AVPictureInPictureController-ом за укључивање овог режима. На macOS 15+ PiP је такође доступан, али се активира преко системског менија или дугмета у прозору плејера.
Интеграција AVPlayer-а у iOS апликацију може се извршити на два начина: преко високонивовског AVPlayerViewController-а (за типичне сценарије) или директно преко AVPlayer + AVPlayerLayer (за потпуну прилагођавање интерфејса). Размотримо оба приступа у Swift-у.
AVPlayerViewController — готова UI компонента која пружа уграђене контролне елементе: play/pause, премотавање, јачина звука, AirPlay, PiP и режим преко целог екрана. Минимална интеграција захтева само неколико линија кода: креирање инстанце AVPlayer-а, прослеђивање AVPlayerViewController-у и приказивање контролера на екрану.
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()
}
За апликације са прилагођеним UI-јем користите AVPlayerLayer — слој Core Animation-а који рендерује видео унутар било ког UIView-а. Овај приступ пружа потпуну контролу над интерфејсом: можете додати сопствене контролне елементе, анимације и додатне слојеве преко видеа.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Употреба:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Исправно управљање животним циклусом плејера је критично за стабилност апликације. AVPlayer треба креирати када се екран појави и ослободити када се затвори. При одласку апликације у позадину, препоручује се паузирање репродукције ради уштеде ресурса и избегавања казни App Review-а за позадинску репродукцију без јасне потребе.
AVPlayerLayer — је Core Animation слој, наслеђен из CALayer-а, који обезбеђује рендеровање видеа на екрану. За разлику од UIView-а, AVPlayerLayer ради директно са GPU-ом преко Metal-а или OpenGL-а, обезбеђујући минимално кашњење излаза оквира. Разумевање рада AVPlayerLayer-а је неопходно за имплементацију прилагођених интерфејса репродукције.
Својство videoGravity одређује како се видео уклапа у границе слоја. AVLayerVideoGravity.resizeAspect (очување пропорција са црним тракама) — подразумевана вредност за AVPlayerViewController. resizeAspectFill (попуњавање целог екрана са обрезивањем) користи се за режим преко целог екрана. resize (изобличење пропорција према величини слоја) ретко се примењује, углавном за аналитичке апликације.
AVPlayerLayer рендерује видео у реалном времену, али све операције са плејером (start, pause, seek) морају се извршавати на главној нити. Кључне вредности за посматрање — timeControlStatus, rate, status и error — прате се кроз KVO (Key-Value Observing) или модерни async/await API, представљен у iOS 16 кроз AVPlayer методе са подршком за Swift Concurrency.
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 подржава уграђене титлове у форматима VTT, CEA-608 и ITT (iTunes Timed Text). Избор аудио траке и титлова врши се преко AVMediaSelectionGroup и AVMediaSelectionOption. Корисничка подешавања титлова (фонт, величина, боја) читају се из системских Accessibility подешавања и аутоматски се примењују на AVPlayerLayer, ако нису експлицитно наведена у коду.
За продукцијске апликације, основна интеграција AVPlayer-а често захтева додатно подешавање: кеширање HLS сегмената, рад са FairPlay DRM-ом, интеграција са „Now Playing" системом и имплементација прилагођених алгоритама за избор битрејта.
AVAssetResourceLoader — једини начин да се пресретне учитавање HLS сегмената и имплементира кеширање. Делегат AVAssetResourceLoaderDelegate прима захтеве за учитавање кључева и сегмената, омогућавајући њихово локално чување и враћање из кеша при поновљеним захтевима. Ово је посебно корисно за апликације које раде у условима нестабилне мреже.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) — Apple стандард за заштиту HLS садржаја. За FPS интеграцију потребно је имплементирати протокол AVContentKeySessionDelegate, који обрађује захтеве за добијање кључева за дешифровање. Процес укључује: добијање SPC (Server Playback Context) од плејера, слање на лиценцни сервер, примање CKC (Content Key Context) и прослеђивање назад у AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. Преузети SPC из keyRequest-а
// 2. Послати SPC на лиценцни сервер
// 3. Преузети CKC и проследити у keyRequest.processContentKeyResponse
}
}
За приказ информација о тренутној репродукцији на закључаном екрану, Control Center-у и Apple Watch-у користи се MPNowPlayingInfoCenter из MediaPlayer.framework-а. AVPlayer не ажурира Now Playing аутоматски — програмер мора ручно постављати метаподатке (назив, извођач, омот, напредак) при промени стања репродукције. За ажурирање напретка користи се редовни тајмер или observe(\.timeControlStatus).
Remote Command Center — још један системски сервис који омогућава управљање репродукцијом са закључаног екрана, AirPods-а и CarPlay-а. MPRemoteCommandCenter региструје руковаоце за команде play, pause, nextTrack, previousTrack, changePlaybackPosition и skipForward/skipBackward. AVPlayer не обрађује ове команде аутоматски — програмер их мора повезати са позивима player.play(), player.pause() и player.seek().
Често постављана питања
AVPlayer — универзални плејер за аудио и видео са подршком за стриминг, HLS, DRM и синхронизацију са системским контролним елементима. AVAudioPlayer — поједностављени аудио плејер за репродукцију локалних аудио датотека без подршке за стриминг и хардверско убрзање видеа. За видео и HLS користите AVPlayer, за једноставан аудио — AVAudioPlayer.
Не, AVPlayer не подржава директно учитавање YouTube садржаја, јер YouTube користи сопствени плејер заснован на DASH-у и власничким форматима. За интеграцију YouTube-а у iOS апликацију користите YouTube IFrame Player API преко WKWebView-а или званичну библиотеку youtube-ios-player-helper.
За позадински звук додајте Audio, AirPlay and Picture in Picture у Background Modes вашег Xcode пројекта. Подесите AVAudioSession са категоријом .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer ће наставити репродукцију у позадини, а закључани екран и Control Center ће приказивати контролне елементе преко MPNowPlayingInfoCenter-а.
Ови сервиси користе DRM заштиту и сопствена плејер решења. AVPlayer може репродуковати садржај само путем директне везе до медија датотеке или HLS плејлисте. Видео са YouTube-а и сличних платформи је умотан у iframe или JavaScript плејер који није компатибилан са AVPlayer-ом. Користите њихове званичне SDK-ове или WebView за приказ.
За Low-Latency HLS подесите AVPlayerItem са preferredForwardBufferDuration = 2.0 (секунде) и аутоматски управљајте паузом при кашњењу у односу на уживо границу: користите player.currentItem?.configuredTimeOffsetFromLive и player.currentItem?.canPlayReverse. Apple препоручује LL-HLS са кашњењем од 2-4 секунде уз исправну конфигурацију на серверу и клијенту.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође