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 надає набір можливостей, що охоплюють більшість сценаріїв відтворення — від простого програвання файлу до складних live-трансляцій з 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, якщо не вказані явно в коді.
Для production-застосунків базова інтеграція 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
}
}
Для відображення інформації про поточне відтворення на Lock Screen, 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 продовжить відтворення у фоні, а Lock Screen та Control Center будуть відображати елементи керування через MPNowPlayingInfoCenter.
Ці сервіси використовують DRM-захист та власні плеєрні рішення. AVPlayer може відтворювати контент тільки за прямим посиланням на медіафайл або HLS-плейлист. Відео з YouTube та подібних платформ загорнуті в iframe або JavaScript-плеєр, який несумісний з AVPlayer. Використовуйте їхні офіційні SDK або WebView для відображення.
Для Low-Latency HLS налаштуйте AVPlayerItem з preferredForwardBufferDuration = 2.0 (секунди) та автоматично керуйте паузою при відставанні від live-границі: використовуйте player.currentItem?.configuredTimeOffsetFromLive та player.currentItem?.canPlayReverse. Apple рекомендує LL-HLS з затримкою 2-4 секунди при правильній конфігурації на сервері та клієнті.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також