Інтеграція AVPlayer для відтворення відео в iOS-застосунку
AVPlayer — нативний плеєр iOS з підтримкою HLS, MPEG-4, progressive download, AirPlay, Picture in Picture та субтитрів. Перш ніж використовувати сторонні плеєри (VLCKit, IJKPlayer), варто розібратися, що вміє AVPlayer — у більшості випадків цього достатньо.
Базова інтеграція
AVPlayer сам по собі не відображає відео — він керує відтворенням. Для відображення потрібен AVPlayerLayer, вбудований у UIView.layer, або AVPlayerViewController з AVKit — готовий контролер із системними елементами управління.
let player = AVPlayer(url: videoURL)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = containerView.bounds
playerLayer.videoGravity = .resizeAspect
containerView.layer.addSublayer(playerLayer)
player.play()
Для SwiftUI — VideoPlayer з AVKit, враппер над AVPlayerViewController.
Де з'являються проблеми
Буферизація та стан. player.currentItem?.status не відбиває готовність до відтворення в реальному часі. Правильний шлях — KVO на player.currentItem та timeControlStatus:
player.publisher(for: \.timeControlStatus)
.receive(on: DispatchQueue.main)
.sink { status in
switch status {
case .playing: hideLoader()
case .waitingToPlayAtSpecifiedRate: showLoader()
case .paused: break
}
}
HLS та якість. Для HLS (m3u8) AVPlayer автоматично вибирає потік за пропускною здатністю. Керувати вибором можна через AVPlayerItem.preferredPeakBitRate (обмеження) або AVPlayerItem.preferredMaximumResolution. Ручний вибір якості — через AVMediaSelectionGroup з AVAssetVariant.
Фоновое відтворення. Аудіопотік при переході застосунку в фон вимагає: увімкнену capability «Background Modes → Audio, AirPlay» в Xcode та AVAudioSession.shared.setCategory(.playback) перед player.play(). Без setCategory аудіо обрізається одразу при переході в фон.
Picture in Picture. AVPictureInPictureController вимагає AVPlayerLayer або AVPlayerViewController. Додайте AVPictureInPictureControllerDelegate, у Info.plist — UIBackgroundModes: audio. Увімкніть pictureInPictureController.startPictureInPicture() по натисканню кнопки. PiP працює лише на фізичних пристроях, не в симуляторі.
Кастомні елементи управління
Якщо AVPlayerViewController не підходить за дизайном, будуємо кастомний плеєр на основі AVPlayer + AVPlayerLayer:
- Прогрес-бар:
player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.5), queue: .main)для оновлення позиції - Перемотка:
player.seek(to: CMTime(seconds: targetSeconds, preferredTimescale: 600), toleranceBefore: .zero, toleranceAfter: .zero)—toleranceBefore/After: .zeroдає точну позицію, але повільніше - Субтитри:
AVMediaCharacteristic.legible+AVPlayerItem.select(_:in:)для переключення доріжок
Що входить у роботу
- Інтеграція
AVPlayerзAVPlayerLayerабоAVPlayerViewController - Кастомний UI управління (play/pause, seek bar, fullscreen)
- Фоновое відтворення та AirPlay
- Picture in Picture (якщо потрібен iOS 14+)
- HLS з можливістю вибору якості
- Обробка помилок мережі та буферизації з retry-логікою
Строки
Базовий плеєр із системними контролами: половина дня. Повністю кастомний плеєр з субтитрами, PiP та HLS quality selector: 2–3 дні. Вартість розраховується індивідуально.







