AVPlayer — ключові поняття, можливості та використання

Автор: IT Sectr Опубліковано: 2026-05-23 Час читання: 9 хв

AVPlayer — це медіаплеєрний фреймворк від Apple, що входить до складу AVFoundation та забезпечує відтворення аудіо та відео на iOS, macOS, tvOS і visionOS. AVPlayer підтримує широкий спектр форматів — від локальних MP4-файлів до адаптивних HLS-потоків — через єдиний API з апаратним прискоренням декодування на чипах Apple Silicon. За даними Apple WWDC (2024), AVPlayer використовується в 90% iOS-застосунків, що працюють з медіа, включаючи Apple TV, Music та Photos.

Головне

  • AVPlayer — це медіаплеєрний фреймворк Apple зі складу AVFoundation для всіх платформ Apple.
  • Апаратне прискорення — AVPlayer використовує VideoToolbox для декодування на GPU, знижуючи енергоспоживання.
  • HLS — нативна підтримка HTTP Live Streaming з автоматичним адаптивним перемиканням бітрейтів.
  • Picture in Picture — вбудована підтримка режиму «картинка в картинці» на iPad, iPhone та Mac.
  • DRM — інтеграція з FairPlay Streaming для захисту контенту преміум-класу.

Що таке AVPlayer?

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 та ієрархія класів

Фреймворк AVFoundation надає трирівневу ієрархію для відтворення: AVAsset (метадані та інформація про контент), AVPlayerItem (стан та керування конкретним екземпляром контенту) та AVPlayer (керування відтворенням). Така архітектура дозволяє розділити завантаження метаданих, підготовку до відтворення та сам процес відтворення, що особливо важливо для HLS-потоків з множинними варіантами бітрейту.

AVAsset представляє модель медіа-контенту — файлу або потоку. AVAsset не є відтворюваним сам по собі; він містить треки (AVAssetTrack), метадані (commonMetadata), інформацію про тривалість та інші характеристики. З AVAsset створюється AVPlayerItem, який вже може бути переданий AVPlayer для відтворення.

Основні можливості AVPlayer

AVPlayer надає набір можливостей, що охоплюють більшість сценаріїв відтворення — від простого програвання файлу до складних live-трансляцій з DRM. Розглянемо ключові функції з прикладами їх застосування.

МожливістьОписПлатформи
Локальні файлиMP4, MOV, M4V, AVI, MKV (через розширення)iOS, macOS, tvOS
HLSHTTP 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+
HDRDolby Vision, HDR10, HLG при підтримці дисплеяiOS 11+, macOS 10.13+

Підтримка HLS та адаптивне перемикання

AVPlayer має нативну підтримку HLS без необхідності встановлення додаткових бібліотек. При відтворенні HLS-потоку AVPlayer автоматично керує адаптивним перемиканням бітрейтів, використовуючи вбудований алгоритм ABR, оптимізований для платформ Apple. Алгоритм враховує не тільки пропускну здатність мережі, але й тепловий стан пристрою — при перегріві AVPlayer може знизити бітрейт для зменшення навантаження на процесор.

Для HLS-потоків з FairPlay Streaming AVPlayer автоматично обробляє отримання та оновлення ліцензій через делегат AVContentKeySession. Розробнику необхідно реалізувати протокол AVContentKeySessionDelegate, який викликається плеєром при необхідності отримати або оновити ключ дешифрування. Це єдиний спосіб захистити HLS-контент на платформах Apple, оскільки Widevine не підтримується на iOS.

Picture in Picture

PiP — режим, що дозволяє користувачеві продовжувати перегляд відео в плаваючому вікні при перемиканні між застосунками. На iPad та iPhone (iOS 14+) AVPlayer інтегрується з AVPictureInPictureController для включення цього режиму. На macOS 15+ PiP також доступний, але активується через системне меню або кнопку у вікні плеєра.

Як використовувати AVPlayer у застосунку iOS

Інтеграція AVPlayer у застосунок iOS може бути виконана двома способами: через високорівневий AVPlayerViewController (для типових сценаріїв) або напряму через AVPlayer + AVPlayerLayer (для повної кастомізації інтерфейсу). Розглянемо обидва підходи на Swift.

Інтеграція через AVPlayerViewController

AVPlayerViewController — готовий UI-компонент, що надає вбудовані елементи керування: play/pause, перемотування, гучність, AirPlay, PiP та повноекранний режим. Мінімальна інтеграція потребує всього кількох рядків коду: створити екземпляр AVPlayer, передати його AVPlayerViewController та відобразити контролер на екрані.

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

Пряма інтеграція через AVPlayerLayer

Для застосунків з кастомним UI використовуйте AVPlayerLayer — шар Core Animation, який рендерить відео всередині будь-якого UIView. Цей підхід дає повний контроль над інтерфейсом: можна додати власні елементи керування, анімації та накладення додаткових шарів поверх відео.

swift
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

Коректне керування життєвим циклом плеєра критично важливе для стабільності застосунку. AVPlayer повинен бути створений при появі екрана та звільнений при його закритті. При переході застосунку у фон рекомендується призупиняти відтворення для економії ресурсів та уникнення штрафів App Review за фонове відтворення без явної необхідності.

AVPlayerLayer та відображення відео

AVPlayerLayer — це Core Animation шар, що успадковує від CALayer, який забезпечує рендеринг відео на екрані. На відміну від UIView, AVPlayerLayer працює напряму з GPU через Metal або OpenGL, забезпечуючи мінімальну затримку виведення кадрів. Розуміння роботи AVPlayerLayer необхідне для реалізації кастомних інтерфейсів відтворення.

Налаштування videoGravity

Властивість 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.

swift
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 та реалізація користувацьких алгоритмів вибору бітрейту.

Кешування HLS через AVAssetResourceLoader

AVAssetResourceLoader — єдиний спосіб перехопити завантаження HLS-сегментів та реалізувати кешування. Делегат AVAssetResourceLoaderDelegate отримує запити на завантаження ключів та сегментів, дозволяючи зберігати їх локально та повертати з кешу при повторних запитах. Це особливо корисно для застосунків, що працюють в умовах нестабільної мережі.

swift
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
    resourceLoaderDelegate,
    queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)

FairPlay Streaming — інтеграція DRM

FairPlay Streaming (FPS) — стандарт Apple для захисту HLS-контенту. Для інтеграції FPS необхідно реалізувати протокол AVContentKeySessionDelegate, який обробляє запити на отримання ключів дешифрування. Процес включає: отримання SPC (Server Playback Context) від плеєра, відправку на ліцензійний сервер, отримання CKC (Content Key Context) та передачу його назад у AVContentKeySession.

swift
class DRMDelegate: NSObject, AVContentKeySessionDelegate {

    func contentKeySession(
        _ session: AVContentKeySession,
        didProvide keyRequest: AVContentKeyRequest
    ) {
        // 1. Отримати SPC з keyRequest
        // 2. Відправити SPC на ліцензійний сервер
        // 3. Отримати CKC та передати в keyRequest.processContentKeyResponse
    }
}

Now Playing та системні елементи керування

Для відображення інформації про поточне відтворення на 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 відрізняється від AVAudioPlayer?

AVPlayer — універсальний плеєр для аудіо та відео з підтримкою стрімінгу, HLS, DRM та синхронізації з системними елементами керування. AVAudioPlayer — спрощений аудіоплеєр для відтворення локальних аудіофайлів без підтримки стрімінгу та апаратного прискорення відео. Для відео та HLS використовуйте AVPlayer, для простого аудіо — AVAudioPlayer.

Чи підтримує AVPlayer відтворення YouTube?

Ні, AVPlayer не підтримує пряме завантаження YouTube-контенту, оскільки YouTube використовує власний програвач на базі DASH та пропрієтарних форматів. Для інтеграції YouTube у застосунок iOS використовуйте YouTube IFrame Player API через WKWebView або офіційну бібліотеку youtube-ios-player-helper.

Як реалізувати фонове відтворення аудіо з AVPlayer?

Для фонового аудіо додайте Audio, AirPlay and Picture in Picture у Background Modes вашого Xcode-проекту. Налаштуйте AVAudioSession з категорією .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer продовжить відтворення у фоні, а Lock Screen та Control Center будуть відображати елементи керування через MPNowPlayingInfoCenter.

Чому AVPlayer не відтворює відео з YouTube, Vimeo або Twitter?

Ці сервіси використовують DRM-захист та власні плеєрні рішення. AVPlayer може відтворювати контент тільки за прямим посиланням на медіафайл або HLS-плейлист. Відео з YouTube та подібних платформ загорнуті в iframe або JavaScript-плеєр, який несумісний з AVPlayer. Використовуйте їхні офіційні SDK або WebView для відображення.

Як зменшити затримку в live-трансляції через AVPlayer?

Для Low-Latency HLS налаштуйте AVPlayerItem з preferredForwardBufferDuration = 2.0 (секунди) та автоматично керуйте паузою при відставанні від live-границі: використовуйте player.currentItem?.configuredTimeOffsetFromLive та player.currentItem?.canPlayReverse. Apple рекомендує LL-HLS з затримкою 2-4 секунди при правильній конфігурації на сервері та клієнті.

Підсумки

  • AVPlayer — універсальний медіаплеєр Apple з апаратним прискоренням на Apple Silicon для iOS, macOS, tvOS та visionOS.
  • HLS — нативна підтримка з автоматичним адаптивним перемиканням бітрейтів без додаткових бібліотек.
  • FairPlay Streaming — єдина DRM-система для захищеного HLS на платформах Apple.
  • Інтеграція — AVPlayerViewController для швидкого старту або AVPlayerLayer для кастомного UI.
  • Кешування HLS реалізується через AVAssetResourceLoaderDelegate з перехопленням запитів на сегменти.
  • Now Playing — ручне оновлення метаданих для Control Center та Lock Screen через MPNowPlayingInfoCenter.
  • Рекомендується використовувати AVPlayer для всіх медіа-проектів на платформах Apple з вимогами до HLS.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також