AVPlayerViewController — встроенный контроллер видеоплеера в экосистеме Apple, предназначенный для воспроизведения медиаконтента на iOS и tvOS. Он обеспечивает полноэкранный интерфейс с элементами управления, поддержкой субтитров и AirPlay без необходимости писать кастомный UI. По данным Apple Developer Documentation, 2026, AVPlayerViewController интегрируется за несколько строк кода и поддерживает HLS, MP4 и большинство медиаформатов.
Главное
AVPlayerViewController — это компонент фреймворка AVKit, предоставляющий готовый интерфейс для воспроизведения видео в приложениях Apple. Он избавляет разработчика от необходимости создавать кастомный плеер с нуля, предлагая стандартные элементы управления: play/pause, перемотку, регулировку громкости и полноэкранный режим.
В отличие от низкоуровневого AVPlayerLayer, который требует ручного построения UI, AVPlayerViewController полностью управляет жизненным циклом плеера. Контроллер автоматически обрабатывает поворот экрана, адаптируется под Safe Area на iPhone с вырезом и поддерживает многозадачность на iPad.
По данным Apple Documentation (2026), AVPlayerViewController совместим с AVPlayer и AVQueuePlayer, что позволяет воспроизводить как одиночные файлы, так и плейлисты. Поддерживаются URL из локального хранилища, сетевые потоки HLS и зашифрованные FairPlay-контенты.
Компонент появился в iOS 8 вместе с AVKit как замена устаревшему MPMoviePlayerController. В iOS 11 была добавлена поддержка Picture in Picture и отображение субтитров. В iOS 14 контроллер получил кастомизируемую транспортную панель через делегат AVPlayerViewControllerDelegate. Начиная с iOS 16, появилась поддержка динамической замены медиафайла без пересоздания плеера.
Современный AVPlayerViewController оптимизирован под ProMotion дисплеи — частота кадров видео автоматически синхронизируется с частотой обновления экрана. На tvOS компонент адаптируется под фокус-интерфейс Siri Remote, а на macOS — под оконный режим QuickTime Player.
В основе контроллера лежит связка 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.
Компонент предоставляет богатый набор функций из коробки, что делает его привлекательным для большинства проектов. Ниже приведены ключевые возможности, которые не требуют дополнительного кода.
Транспортная панель — это нижняя часть интерфейса, содержащая основные кнопки управления. По умолчанию панель скрывается через 3 секунды бездействия пользователя и появляется при тапе. В iOS 16+ через делегат можно управлять видимостью отдельных элементов.
В дебаг-режиме транспортную панель можно принудительно показывать через свойство AVPlayerViewController.requiresLinearPlayback, которое также блокирует возможность ставить видео на паузу. Это полезно для рекламных вставок и образовательного контента.
Базовая интеграция контроллера занимает не более 10 строк кода. Сначала необходимо создать экземпляр AVPlayer с URL медиафайла, затем передать его в AVPlayerViewController и отобразить контроллер на экране.
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().
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, транспортная панель полностью исчезает, оставляя только видеопоток. Полезно для кастомных оверлейных элементов.
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.
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 (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 точек для сохранения читаемости контента.
Часто задаваемые вопросы
Нет, для YouTube-видео требуется использование web-вью WKWebView или библиотеки YouTube iOS Helper, так как YouTube использует собственную систему DRM. AVPlayerViewController предназначен для прямых медиапотоков через URL.
Установите свойство showsPlaybackControls в false. После этого экран остаётся пустым — только видеопоток. Для возврата кастомных кнопок добавьте overlay через addSubview поверх контроллера.
Да, контроллер полностью поддерживает HLS Live. В транспортной панели отображается индикатор Live вместо слайдера прогресса. Задержка зависит от конфигурации HLS — минимально 6 секунд при low-latency настройках.
Подпишитесь на KVO свойства AVPlayerItem.status. При ошибке статус меняется на .failed. Достаньте детали через свойство error у AVPlayerItem и покажите пользователю alert с пояснением — часто проблема в сети или неверном URL.
Да, используйте AVAsset с пользовательским AVAssetResourceLoader для подачи данных из оперативной памяти. Реализуйте делегат AVAssetResourceLoaderDelegate и возвращайте байты из буфера вместо чтения с диска.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также