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 methods с поддержкой 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, если не указаны явно в коде.
Для 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также