AVPlayer este un framework player media de la Apple, care face parte din AVFoundation și asigură redarea audio și video pe iOS, macOS, tvOS și visionOS. AVPlayer suportă o gamă largă de formate — de la fișiere MP4 locale până la fluxuri HLS adaptive — printr-un API unic cu accelerare hardware a decodării pe cipurile Apple Silicon. Conform datelor Apple WWDC (2024), AVPlayer este utilizat în 90% din aplicațiile iOS care lucrează cu media, inclusiv Apple TV, Music și Photos.
Principalele
AVPlayer — este componenta centrală a frameworkului AVFoundation, responsabilă pentru redarea conținutului multimedia pe toate platformele Apple. Introdus în iOS 4.0 (2010) ca înlocuitor pentru MPMoviePlayerController învechit, AVPlayer oferă control de nivel scăzut asupra redării cu posibilitatea de reglare fină a parametrilor de decodare, sincronizare audio și video, precum și integrare cu servicii de sistem precum AirPlay și Picture in Picture.
Spre deosebire de playerele terțe, AVPlayer beneficiază de accelerare hardware pe cipurile Apple Silicon. Decodarea video se realizează prin VideoToolbox folosind motoarele media dedicate ale seriei M (Media Engine), asigurând redarea 8K HDR cu consum minim de energie. Pentru HEVC (H.265) și ProRes decodarea se face pe blocuri specializate ale cipului, fără a încărca CPU-ul.
AVPlayer este strâns integrat cu ecosistemul Apple: suport Handoff pentru transferul redării între dispozitive, AirPlay 2 pentru streaming pe Apple TV, sunet spațial cu urmărire dinamică a capului și sincronizare cu elementele de control ale sistemului prin MPNowPlayingInfoCenter. Aceste integrări fac din AVPlayer standardul de facto pentru toate aplicațiile care lucrează cu media pe platformele Apple.
Frameworkul AVFoundation oferă o ierarhie pe trei niveluri pentru redare: AVAsset (metadate și informații despre conținut), AVPlayerItem (stare și gestionarea unei instanțe specifice de conținut) și AVPlayer (gestionarea redării). Această arhitectură permite separarea încărcării metadatelor, pregătirii pentru redare și procesului de redare în sine, ceea ce este deosebit de important pentru fluxurile HLS cu multiple variante de rată de biți.
AVAsset reprezintă un model al conținutului media — fișier sau flux. AVAsset nu este redabil în sine; conține trackuri (AVAssetTrack), metadate (commonMetadata), informații despre durată și alte caracteristici. Din AVAsset se creează AVPlayerItem, care poate fi transmis AVPlayer pentru redare.
AVPlayer oferă un set de capacități care acoperă majoritatea scenariilor de redare — de la simpla redare a unui fișier până la transmisiuni live complexe cu DRM. Să examinăm funcțiile cheie cu exemple de aplicare.
| Capacitate | Descriere | Platforme |
|---|---|---|
| Fișiere locale | MP4, MOV, M4V, AVI, MKV (prin extensii) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming cu ABR adaptiv | Toate platformele Apple |
| FairPlay DRM | Conținut HLS protejat cu licență de streaming | iOS, tvOS, macOS |
| Picture in Picture | Fereastră video plutitoare peste alte aplicații | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Transmisie fără fir către Apple TV și difuzoare | Toate platformele |
| Sunet spațial | Dolby Atmos și urmărire dinamică | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG cu suport display | iOS 11+, macOS 10.13+ |
AVPlayer are suport nativ pentru HLS fără a necesita instalarea de biblioteci suplimentare. La redarea unui flux HLS, AVPlayer gestionează automat comutarea adaptivă a ratei de biți, folosind algoritmul ABR integrat, optimizat pentru platformele Apple. Algoritmul ia în considerare nu doar lățimea de bandă a rețelei, ci și starea termică a dispozitivului — la supraîncălzire, AVPlayer poate reduce rata de biți pentru a scădea încărcarea procesorului.
Pentru fluxurile HLS cu FairPlay Streaming, AVPlayer gestionează automat obținerea și reînnoirea licențelor prin delegatul AVContentKeySession. Dezvoltatorul trebuie să implementeze protocolul AVContentKeySessionDelegate, care este apelat de player atunci când este necesar să obțină sau să reînnoiască o cheie de decriptare. Aceasta este singura modalitate de a proteja conținutul HLS pe platformele Apple, deoarece Widevine nu este suportat pe iOS.
PiP — mod care permite utilizatorului să continue vizionarea video într-o fereastră plutitoare în timp ce comută între aplicații. Pe iPad și iPhone (iOS 14+) AVPlayer se integrează cu AVPictureInPictureController pentru a activa acest mod. Pe macOS 15+ PiP este de asemenea disponibil, dar se activează prin meniul de sistem sau un buton în fereastra playerului.
Integrarea AVPlayer într-o aplicație iOS poate fi realizată în două moduri: prin AVPlayerViewController de nivel înalt (pentru scenarii tipice) sau direct prin AVPlayer + AVPlayerLayer (pentru personalizarea completă a interfeței). Să examinăm ambele abordări în Swift.
AVPlayerViewController — o componentă UI gata făcută, care oferă elemente de control integrate: play/pause, derulare, volum, AirPlay, PiP și mod ecran complet. Integrarea minimă necesită doar câteva linii de cod: crearea unei instanțe AVPlayer, transmiterea acesteia către AVPlayerViewController și afișarea controlerului pe ecran.
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()
}
Pentru aplicațiile cu interfață personalizată, utilizați AVPlayerLayer — un strat Core Animation care redează video în interiorul oricărui UIView. Această abordare oferă control total asupra interfeței: puteți adăuga propriile elemente de control, animații și straturi suplimentare peste video.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Utilizare:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Gestionarea corectă a ciclului de viață al playerului este critică pentru stabilitatea aplicației. AVPlayer trebuie creat la apariția ecranului și eliberat la închiderea acestuia. La trecerea aplicației în fundal, se recomandă întreruperea redării pentru economisirea resurselor și evitarea sancțiunilor App Review pentru redare în fundal fără necesitate evidentă.
AVPlayerLayer — este un strat Core Animation, care moștenește din CALayer și asigură redarea video pe ecran. Spre deosebire de UIView, AVPlayerLayer lucrează direct cu GPU-ul prin Metal sau OpenGL, asigurând întârziere minimă la ieșirea cadrelor. Înțelegerea funcționării AVPlayerLayer este necesară pentru implementarea interfețelor de redare personalizate.
Proprietatea videoGravity determină modul în care video se încadrează în limitele stratului. AVLayerVideoGravity.resizeAspect (păstrarea proporțiilor cu benzi negre) — valoarea implicită pentru AVPlayerViewController. resizeAspectFill (umplerea întregului ecran cu decupare) este utilizat pentru modul ecran complet. resize (distorsionarea proporțiilor la dimensiunea stratului) se aplică rar, în principal pentru aplicații analitice.
AVPlayerLayer redează video în timp real, dar toate operațiile cu playerul (start, pause, seek) trebuie executate pe threadul principal. Valorile cheie pentru observare — timeControlStatus, rate, status și error — sunt urmărite prin KVO (Key-Value Observing) sau API-ul modern async/await, introdus în iOS 16 prin metodele AVPlayer cu suport 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 suportă subtitrări integrate în formatele VTT, CEA-608 și ITT (iTunes Timed Text). Selectarea trackului audio și a subtitrărilor se realizează prin AVMediaSelectionGroup și AVMediaSelectionOption. Setările de subtitrări ale utilizatorului (font, dimensiune, culoare) sunt citite din setările de sistem Accessibility și aplicate automat AVPlayerLayer, dacă nu sunt specificate explicit în cod.
Pentru aplicațiile de producție, integrarea de bază AVPlayer necesită adesea configurare suplimentară: cache-ul segmentelor HLS, lucrul cu FairPlay DRM, integrarea cu sistemul „Now Playing" și implementarea algoritmilor personalizați de selecție a ratei de biți.
AVAssetResourceLoader — este singura modalitate de a intercepta încărcarea segmentelor HLS și de a implementa cache-ul. Delegatul AVAssetResourceLoaderDelegate primește cereri de încărcare a cheilor și segmentelor, permițând salvarea lor locală și returnarea din cache la cereri repetate. Acest lucru este deosebit de util pentru aplicațiile care funcționează în condiții de rețea instabilă.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) — standardul Apple pentru protejarea conținutului HLS. Pentru integrarea FPS trebuie implementat protocolul AVContentKeySessionDelegate, care procesează cererile de obținere a cheilor de decriptare. Procesul include: obținerea SPC (Server Playback Context) de la player, trimiterea către serverul de licențe, primirea CKC (Content Key Context) și transmiterea acestuia înapoi către AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. Obțineți SPC din keyRequest
// 2. Trimiteți SPC către serverul de licențe
// 3. Obțineți CKC și transmiteți către keyRequest.processContentKeyResponse
}
}
Pentru afișarea informațiilor despre redarea curentă pe ecranul de blocare, Centrul de Control și Apple Watch se utilizează MPNowPlayingInfoCenter din MediaPlayer.framework. AVPlayer nu actualizează automat Now Playing — dezvoltatorul trebuie să seteze manual metadatele (titlu, artist, copertă, progres) la modificarea stării de redare. Pentru actualizarea progresului se utilizează un timer regulat sau observe(\.timeControlStatus).
Remote Command Center — un alt serviciu de sistem care permite controlul redării de pe ecranul blocat, AirPods și CarPlay. MPRemoteCommandCenter înregistrează handler-e pentru comenzile play, pause, nextTrack, previousTrack, changePlaybackPosition și skipForward/skipBackward. AVPlayer nu procesează aceste comenzi automat — dezvoltatorul trebuie să le conecteze cu apelurile player.play(), player.pause() și player.seek().
Întrebări frecvente
AVPlayer — un player universal pentru audio și video cu suport pentru streaming, HLS, DRM și sincronizare cu elementele de control ale sistemului. AVAudioPlayer — un player audio simplificat pentru redarea fișierelor audio locale fără suport pentru streaming și accelerare hardware video. Pentru video și HLS utilizați AVPlayer, pentru audio simplu — AVAudioPlayer.
Nu, AVPlayer nu suportă încărcarea directă a conținutului YouTube, deoarece YouTube utilizează propriul player bazat pe DASH și formate proprietare. Pentru integrarea YouTube într-o aplicație iOS, utilizați YouTube IFrame Player API prin WKWebView sau biblioteca oficială youtube-ios-player-helper.
Pentru audio în fundal, adăugați Audio, AirPlay and Picture in Picture în Background Modes ale proiectului Xcode. Configurați AVAudioSession cu categoria .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer va continua redarea în fundal, iar ecranul de blocare și Centrul de Control vor afișa elementele de control prin MPNowPlayingInfoCenter.
Aceste servicii utilizează protecție DRM și soluții proprii de playere. AVPlayer poate reda conținut numai printr-un link direct către fișierul media sau lista HLS. Videoclipurile de pe YouTube și platforme similare sunt încapsulate într-un iframe sau player JavaScript, care este incompatibil cu AVPlayer. Utilizați SDK-urile lor oficiale sau WebView pentru afișare.
Pentru Low-Latency HLS, configurați AVPlayerItem cu preferredForwardBufferDuration = 2.0 (secunde) și gestionați automat pauza la întârzierea față de limita live: utilizați player.currentItem?.configuredTimeOffsetFromLive și player.currentItem?.canPlayReverse. Apple recomandă LL-HLS cu o întârziere de 2-4 secunde cu configurare corectă pe server și client.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și