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. Потребителските настройки на субтитрите (шрифт, размер, цвят) се четат от системните настройки за достъпност и автоматично се прилагат към 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също