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 methods с поддержкой 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. Пользовательские настройки субтитров (шрифт, размер, цвет) считываются из системных настроек Accessibility и автоматически применяются к 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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