AVPlayerViewController: что это, способы интеграции в iOS

Автор: IT Sectr Опубликовано: 2026-05-23 Время чтения: 8 мин

AVPlayerViewController — встроенный контроллер видеоплеера в экосистеме Apple, предназначенный для воспроизведения медиаконтента на iOS и tvOS. Он обеспечивает полноэкранный интерфейс с элементами управления, поддержкой субтитров и AirPlay без необходимости писать кастомный UI. По данным Apple Developer Documentation, 2026, AVPlayerViewController интегрируется за несколько строк кода и поддерживает HLS, MP4 и большинство медиаформатов.

Главное

  • AVPlayerViewController — стандартный контроллер воспроизведения видео из фреймворка AVKit для iOS и tvOS.
  • Он предоставляет готовый пользовательский интерфейс с панелью управления, кнопками воспроизведения и индикатором прогресса.
  • Контроллер автоматически поддерживает субтитры, аудиодорожки, AirPlay и Picture in Picture.
  • Интеграция выполняется через AVPlayer — базовый объект для управления воспроизведением.
  • Разработчик может настроить отображение элементов управления, добавить overlay-вью и обрабатывать события через делегат.

Что такое AVPlayerViewController?

AVPlayerViewController — это компонент фреймворка AVKit, предоставляющий готовый интерфейс для воспроизведения видео в приложениях Apple. Он избавляет разработчика от необходимости создавать кастомный плеер с нуля, предлагая стандартные элементы управления: play/pause, перемотку, регулировку громкости и полноэкранный режим.

В отличие от низкоуровневого AVPlayerLayer, который требует ручного построения UI, AVPlayerViewController полностью управляет жизненным циклом плеера. Контроллер автоматически обрабатывает поворот экрана, адаптируется под Safe Area на iPhone с вырезом и поддерживает многозадачность на iPad.

По данным Apple Documentation (2026), AVPlayerViewController совместим с AVPlayer и AVQueuePlayer, что позволяет воспроизводить как одиночные файлы, так и плейлисты. Поддерживаются URL из локального хранилища, сетевые потоки HLS и зашифрованные FairPlay-контенты.

История и версии AVPlayerViewController

Компонент появился в iOS 8 вместе с AVKit как замена устаревшему MPMoviePlayerController. В iOS 11 была добавлена поддержка Picture in Picture и отображение субтитров. В iOS 14 контроллер получил кастомизируемую транспортную панель через делегат AVPlayerViewControllerDelegate. Начиная с iOS 16, появилась поддержка динамической замены медиафайла без пересоздания плеера.

Современный AVPlayerViewController оптимизирован под ProMotion дисплеи — частота кадров видео автоматически синхронизируется с частотой обновления экрана. На tvOS компонент адаптируется под фокус-интерфейс Siri Remote, а на macOS — под оконный режим QuickTime Player.

Как работает AVPlayerViewController

В основе контроллера лежит связка AVPlayer и AVPlayerItem. AVPlayer — это объект воспроизведения, который управляет таймлайном, скоростью и состоянием. AVPlayerItem — обёртка над конкретным медиафайлом, содержащая метаданные, треки и информацию о загрузке.

При инициализации AVPlayerViewController получает ссылку на AVPlayer и автоматически создаёт AVPlayerLayer для отображения видео. Контроллер подписывается на KVO-уведомления AVPlayer о смене статуса readyToPlay, ошибках загрузки и окончании воспроизведения.

Элементы управления (транспортная панель) отображаются по нажатию на экран. В iOS 15+ они поддерживают кастомизацию через AVPlayerViewControllerCustomizationDelegate, позволяя скрывать или заменять стандартные кнопки.

Жизненный цикл контроллера

После создания контроллера и присвоения AVPlayer вызывается метод viewDidLoad, который запускает подготовку видеопотока. Когда AVPlayerItem переходит в статус AVPlayerItemStatusReadyToPlay, плеер готов к показу кадров. При вызове метода play() запускается декодирование видеопотока через Video Toolbox.

При уходе с экрана контроллер автоматически приостанавливает воспроизведение и освобождает ресурсы декодера. На iOS 13+ для сохранения воспроизведения при сворачивании приложения требуется настроить Background Modes и Audio Session. По данным WWDC 2024, рекомендуется использовать AVPlayerPlaybackCoordinator для синхронизации с медиацентром iOS.

Основные возможности AVPlayerViewController

Компонент предоставляет богатый набор функций из коробки, что делает его привлекательным для большинства проектов. Ниже приведены ключевые возможности, которые не требуют дополнительного кода.

  • Транспортная панель с play/pause, перемоткой на 15 секунд, регулятором громкости и слайдером прогресса.
  • Поддержка субтитров — автоматическое отображение встроенных и внешних субтитров в форматах VTT, SRT и iTunes Timed Text.
  • AirPlay — возможность транслировать видео на Apple TV и другие AirPlay-совместимые устройства.
  • Picture in Picture — воспроизведение в плавающем окне при нажатии на специальную кнопку (на iPad и iPhone с iOS 14+).
  • Полноэкранный режим — автоматическое переключение при повороте устройства и при тапе на кнопку увеличения.
  • Смена скорости — встроенный контрол выбора скорости воспроизведения (0.5x, 1.0x, 1.5x, 2.0x).
  • Защищённый контент — нативная поддержка FairPlay Streaming для HLS контента с DRM.

Транспортная панель AVPlayerViewController

Транспортная панель — это нижняя часть интерфейса, содержащая основные кнопки управления. По умолчанию панель скрывается через 3 секунды бездействия пользователя и появляется при тапе. В iOS 16+ через делегат можно управлять видимостью отдельных элементов.

В дебаг-режиме транспортную панель можно принудительно показывать через свойство AVPlayerViewController.requiresLinearPlayback, которое также блокирует возможность ставить видео на паузу. Это полезно для рекламных вставок и образовательного контента.

Интеграция AVPlayerViewController в проект

Базовая интеграция контроллера занимает не более 10 строк кода. Сначала необходимо создать экземпляр AVPlayer с URL медиафайла, затем передать его в AVPlayerViewController и отобразить контроллер на экране.

Создание базового плеера на Swift

swift
import AVKit

let player = AVPlayer(url: URL(string: "https://example.com/video.mp4")!)
let playerVC = AVPlayerViewController()
playerVC.player = player

present(playerVC, animated: true) {
    player.play()
}

После вызова present контроллер отображается на весь экран. Видео начинает загрузку из сети, и как только буфер достигает порога readyToPlay, автоматически начинается воспроизведение после вызова play().

Настройка AVPlayerItem для продвинутого управления

swift
let asset = AVAsset(url: videoURL)
let item = AVPlayerItem(asset: asset)

let metadata = AVMutableMetadataItem()
metadata.key = AVMetadataKey.commonKeyTitle
metadata.value = "Моё видео"
item.addMetadata(metadata)

let player = AVPlayer(playerItem: item)
let playerVC = AVPlayerViewController()
playerVC.player = player

Использование AVPlayerItem даёт контроль над метаданными, тайм-кодами, выбором аудиотреков и субтитров. Через AVPlayerItem можно также наблюдать за прогрессом загрузки, буферизацией и ошибками сети с помощью KVO на свойстве status.

Настройка элементов управления

Начиная с iOS 11 разработчик может кастомизировать транспортную панель через протокол AVPlayerViewControllerDelegate. Метод playerViewController(_:willBeginFullScreenPresentationWithAnimationCoordinator:) вызывается перед входом в полноэкранный режим и позволяет подготовить UI.

Для скрытия отдельных кнопок используется свойство AVPlayerViewController.showsPlaybackControls. Если установить его в false, транспортная панель полностью исчезает, оставляя только видеопоток. Полезно для кастомных оверлейных элементов.

Кастомизация с использованием делегата

swift
class CustomPlayerViewController: UIViewController {
    private let playerVC = AVPlayerViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        playerVC.delegate = self
        playerVC.showsPlaybackControls = true
        playerVC.entersFullScreenWhenPlaybackBegins = true
    }
}

extension CustomPlayerViewController: AVPlayerViewControllerDelegate {
    func playerViewController(
        _ playerViewController: AVPlayerViewController,
        willBeginFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator
    ) {
        // Добавить overlay-кнопку
    }

    func playerViewController(
        _ playerViewController: AVPlayerViewController,
        didUpdate legibleMediaSelection: AVMediaSelectionGroup
    ) {
        print("Выбран новый язык субтитров")
    }
}

Делегат позволяет перехватывать события смены субтитров, входа и выхода из полноэкранного режима, а также начала и завершения Picture in Picture. На WWDC 2024 Apple рекомендовала использовать делегат для аналитики — логировать каждый переход до 100 мс.

Работа с субтитрами и аудиодорожками

AVPlayerViewController автоматически отображает все доступные субтитры и аудиодорожки, если они зашиты в медиафайле или указаны в манифесте HLS. Пользователь может переключать их через меню, которое появляется при тапе на иконку субтитров в транспортной панели.

Для HLS-потоков манифест M3U8 содержит список доступных языковых вариантов. AVPlayer загружает соответствующие сегменты субтитров в формате WebVTT и передаёт их на рендеринг через AVPlayerLayer. На iOS 16+ появилась поддержка стилизации субтитров через AVTextStyleRule.

Программный выбор аудиодорожки

swift
func selectAudioTrack(languageCode: String) {
    guard let group = player.currentItem?
        .asset.mediaSelectionGroup(forMediaCharacteristic: AVMediaCharacteristic.audible)
    else { return }

    for option in group.options {
        if option.extendedLanguageTag?.hasPrefix(languageCode) == true {
            player.currentItem?.select(option, in: group)
        }
    }
}

Метод selectAudioTrack ищет среди аудиоопций группы audiable тот вариант, чей extendedLanguageTag совпадает с нужным кодом языка. Это позволяет реализовать функцию «Озвучка в оригинале» в приложениях с мультиязычным контентом.

Picture in Picture на iPad

Режим Picture in Picture (PiP) позволяет отображать видео в плавающем окне поверх других приложений. На iPad эта функция доступна с iOS 9, на iPhone — с iOS 14. AVPlayerViewController автоматически добавляет кнопку PiP в транспортную панель при наличии подписки на UIBackgroundModes.

Для активации PiP необходимо в Info.plist добавить ключ UIBackgroundModes со значением audio и airplay. После этого в контроллере появляется кнопка PiP, при нажатии на которую видео сворачивается в плавающее окно размером 192x108 точек.

События PiP обрабатываются через делегат: playerViewController(_:willStartPictureInPictureFromFullScreen:) и playerViewController(_:didStopPictureInPicture:). По данным Apple HIG, минимальный размер PiP окна должен быть не менее 120x68 точек для сохранения читаемости контента.

Часто задаваемые вопросы

Поддерживает ли AVPlayerViewController воспроизведение YouTube-видео?

Нет, для YouTube-видео требуется использование web-вью WKWebView или библиотеки YouTube iOS Helper, так как YouTube использует собственную систему DRM. AVPlayerViewController предназначен для прямых медиапотоков через URL.

Как отключить транспортную панель AVPlayerViewController?

Установите свойство showsPlaybackControls в false. После этого экран остаётся пустым — только видеопоток. Для возврата кастомных кнопок добавьте overlay через addSubview поверх контроллера.

Работает ли AVPlayerViewController с Live-трансляциями HLS?

Да, контроллер полностью поддерживает HLS Live. В транспортной панели отображается индикатор Live вместо слайдера прогресса. Задержка зависит от конфигурации HLS — минимально 6 секунд при low-latency настройках.

Как обработать ошибку загрузки видео в AVPlayerViewController?

Подпишитесь на KVO свойства AVPlayerItem.status. При ошибке статус меняется на .failed. Достаньте детали через свойство error у AVPlayerItem и покажите пользователю alert с пояснением — часто проблема в сети или неверном URL.

Можно ли в AVPlayerViewController загрузить видео из памяти?

Да, используйте AVAsset с пользовательским AVAssetResourceLoader для подачи данных из оперативной памяти. Реализуйте делегат AVAssetResourceLoaderDelegate и возвращайте байты из буфера вместо чтения с диска.

Итоги

  • AVPlayerViewController — готовый компонент AVKit для воспроизведения видео на iOS, iPadOS и tvOS с минимальным кодом интеграции.
  • Контроллер поддерживает HLS, MP4, защищённый FairPlay контент, субтитры и аудиодорожки из коробки.
  • Для базового использования достаточно создать AVPlayer и передать его в контроллер — UI отрисуется автоматически.
  • Делегат AVPlayerViewControllerDelegate позволяет кастомизировать транспортную панель, обрабатывать PiP и смену субтитров.
  • Транспортная панель скрывается через 3 секунды бездействия, но showsPlaybackControls даёт полный контроль над её видимостью.
  • Для Picture in Picture требуется активация UIBackgroundModes audio и airplay в Info.plist.
  • При возникновении ошибок используйте KVO на AVPlayerItem.status для получения деталей и отображения пользователю.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

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

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