AVPlayer to framework odtwarzacza multimedialnego od Apple, wchodzący w skład AVFoundation i zapewniający odtwarzanie audio i wideo na iOS, macOS, tvOS i visionOS. AVPlayer obsługuje szeroki zakres formatów — od lokalnych plików MP4 po adaptacyjne strumienie HLS — poprzez jednolite API z sprzętowym przyspieszeniem dekodowania na układach Apple Silicon. Według danych Apple WWDC (2024), AVPlayer jest używany w 90% aplikacji iOS pracujących z mediami, w tym Apple TV, Music i Photos.
Najważniejsze
AVPlayer — to centralny komponent frameworka AVFoundation, odpowiedzialny za odtwarzanie treści multimedialnych na wszystkich platformach Apple. Wprowadzony w iOS 4.0 (2010) jako zamiennik przestarzałego MPMoviePlayerController, AVPlayer zapewnia niskopoziomową kontrolę nad odtwarzaniem z możliwością precyzyjnego dostrajania parametrów dekodowania, synchronizacji audio i wideo oraz integracji z usługami systemowymi, takimi jak AirPlay i Picture in Picture.
W przeciwieństwie do odtwarzaczy innych firm, AVPlayer korzysta z przyspieszenia sprzętowego na układach Apple Silicon. Dekodowanie wideo odbywa się przez VideoToolbox z wykorzystaniem dedykowanych silników medialnych serii M (Media Engine), co zapewnia odtwarzanie 8K HDR przy minimalnym zużyciu energii. Dla HEVC (H.265) i ProRes dekodowanie odbywa się na wyspecjalizowanych blokach układu, nie obciążając CPU.
AVPlayer jest ściśle zintegrowany z ekosystemem Apple: wsparcie Handoff do przenoszenia odtwarzania między urządzeniami, AirPlay 2 do streamingu na Apple TV, dźwięk przestrzenny z dynamicznym śledzeniem głowy i synchronizacja z systemowymi elementami sterowania przez MPNowPlayingInfoCenter. Te integracje czynią AVPlayer standardem de facto dla wszystkich aplikacji pracujących z mediami na platformach Apple.
Framework AVFoundation zapewnia trójpoziomową hierarchię do odtwarzania: AVAsset (metadane i informacje o treści), AVPlayerItem (stan i zarządzanie konkretnym egzemplarzem treści) oraz AVPlayer (zarządzanie odtwarzaniem). Taka architektura pozwala rozdzielić ładowanie metadanych, przygotowanie do odtwarzania i sam proces odtwarzania, co jest szczególnie ważne dla strumieni HLS z wieloma wariantami przepływności.
AVAsset stanowi model treści medialnej — pliku lub strumienia. AVAsset sam w sobie nie jest odtwarzalny; zawiera ścieżki (AVAssetTrack), metadane (commonMetadata), informacje o czasie trwania i inne cechy. Z AVAsset tworzony jest AVPlayerItem, który może być przekazany do AVPlayer w celu odtwarzania.
AVPlayer oferuje zestaw możliwości pokrywających większość scenariuszy odtwarzania — od prostego odtwarzania pliku po złożone transmisje na żywo z DRM. Przyjrzyjmy się kluczowym funkcjom z przykładami ich zastosowania.
| Możliwość | Opis | Platformy |
|---|---|---|
| Pliki lokalne | MP4, MOV, M4V, AVI, MKV (przez rozszerzenia) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming z adaptacyjnym ABR | Wszystkie platformy Apple |
| FairPlay DRM | Zabezpieczona treść HLS z licencją strumieniową | iOS, tvOS, macOS |
| Picture in Picture | Pływające okno wideo nad innymi aplikacjami | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Bezprzewodowe przesyłanie na Apple TV i głośniki | Wszystkie platformy |
| Dźwięk przestrzenny | Dolby Atmos i dynamiczne śledzenie | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG przy wsparciu wyświetlacza | iOS 11+, macOS 10.13+ |
AVPlayer posiada natywne wsparcie dla HLS bez konieczności instalowania dodatkowych bibliotek. Podczas odtwarzania strumienia HLS AVPlayer automatycznie zarządza adaptacyjnym przełączaniem przepływności, używając wbudowanego algorytmu ABR zoptymalizowanego dla platform Apple. Algorytm uwzględnia nie tylko przepustowość sieci, ale także stan termiczny urządzenia — przy przegrzaniu AVPlayer może obniżyć przepływność, aby zmniejszyć obciążenie procesora.
Dla strumieni HLS z FairPlay Streaming AVPlayer automatycznie obsługuje pobieranie i odnawianie licencji przez delegata AVContentKeySession. Deweloper musi zaimplementować protokół AVContentKeySessionDelegate, który jest wywoływany przez odtwarzacz w razie potrzeby uzyskania lub odnowienia klucza deszyfrowania. To jedyny sposób ochrony treści HLS na platformach Apple, ponieważ Widevine nie jest obsługiwane na iOS.
PiP — tryb pozwalający użytkownikowi kontynuować oglądanie wideo w pływającym oknie podczas przełączania między aplikacjami. Na iPad i iPhone (iOS 14+) AVPlayer integruje się z AVPictureInPictureController, aby włączyć ten tryb. Na macOS 15+ PiP jest również dostępny, ale aktywowany przez menu systemowe lub przycisk w oknie odtwarzacza.
Integracja AVPlayer w aplikacji iOS może być wykonana na dwa sposoby: przez wysokopoziomowy AVPlayerViewController (dla typowych scenariuszy) lub bezpośrednio przez AVPlayer + AVPlayerLayer (dla pełnej customizacji interfejsu). Przyjrzyjmy się obu podejściom w Swift.
AVPlayerViewController — gotowy komponent UI, zapewniający wbudowane elementy sterowania: play/pause, przewijanie, głośność, AirPlay, PiP i tryb pełnoekranowy. Minimalna integracja wymaga zaledwie kilku linii kodu: utworzenie instancji AVPlayer, przekazanie jej do AVPlayerViewController i wyświetlenie kontrolera na ekranie.
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()
}
Dla aplikacji z niestandardowym UI użyj AVPlayerLayer — warstwy Core Animation, która renderuje wideo wewnątrz dowolnego UIView. To podejście daje pełną kontrolę nad interfejsem: można dodać własne elementy sterowania, animacje i nakładanie dodatkowych warstw na wideo.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Użycie:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Prawidłowe zarządzanie cyklem życia odtwarzacza jest krytyczne dla stabilności aplikacji. AVPlayer powinien być utworzony przy pojawieniu się ekranu i zwolniony przy jego zamknięciu. Przy przejściu aplikacji w tło zaleca się wstrzymanie odtwarzania w celu oszczędzania zasobów i uniknięcia kar App Review za odtwarzanie w tle bez wyraźnej potrzeby.
AVPlayerLayer — to warstwa Core Animation, dziedzicząca po CALayer, która zapewnia renderowanie wideo na ekranie. W przeciwieństwie do UIView, AVPlayerLayer działa bezpośrednio z GPU przez Metal lub OpenGL, zapewniając minimalne opóźnienie wyjścia klatek. Zrozumienie działania AVPlayerLayer jest niezbędne do implementacji niestandardowych interfejsów odtwarzania.
Właściwość videoGravity określa, jak wideo dopasowuje się do granic warstwy. AVLayerVideoGravity.resizeAspect (zachowanie proporcji z czarnymi pasami) — wartość domyślna dla AVPlayerViewController. resizeAspectFill (wypełnienie całego ekranu z przycięciem) jest używane dla trybu pełnoekranowego. resize (zniekształcenie proporcji do rozmiaru warstwy) jest rzadko stosowane, głównie w aplikacjach analitycznych.
AVPlayerLayer renderuje wideo w czasie rzeczywistym, ale wszystkie operacje na odtwarzaczu (start, pause, seek) muszą być wykonywane na głównym wątku. Kluczowe wartości do obserwacji — timeControlStatus, rate, status i error — są śledzone przez KVO (Key-Value Observing) lub nowoczesne async/await API, wprowadzone w iOS 16 przez metody AVPlayer z wsparciem 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 obsługuje wbudowane napisy w formatach VTT, CEA-608 i ITT (iTunes Timed Text). Wybór ścieżki audio i napisów odbywa się przez AVMediaSelectionGroup i AVMediaSelectionOption. Ustawienia napisów użytkownika (czcionka, rozmiar, kolor) są odczytywane z systemowych ustawień Accessibility i automatycznie stosowane do AVPlayerLayer, jeśli nie są jawnie określone w kodzie.
Dla aplikacji produkcyjnych podstawowa integracja AVPlayer często wymaga dodatkowej konfiguracji: buforowanie segmentów HLS, praca z FairPlay DRM, integracja z systemem „Now Playing" i implementacja niestandardowych algorytmów wyboru przepływności.
AVAssetResourceLoader — to jedyny sposób na przechwycenie ładowania segmentów HLS i zaimplementowanie buforowania. Delegat AVAssetResourceLoaderDelegate otrzymuje żądania ładowania kluczy i segmentów, pozwalając zapisywać je lokalnie i zwracać z pamięci podręcznej przy ponownych żądaniach. Jest to szczególnie przydatne dla aplikacji działających w warunkach niestabilnej sieci.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) — standard Apple do ochrony treści HLS. Do integracji FPS należy zaimplementować protokół AVContentKeySessionDelegate, który obsługuje żądania uzyskania kluczy deszyfrowania. Proces obejmuje: uzyskanie SPC (Server Playback Context) z odtwarzacza, wysłanie na serwer licencyjny, otrzymanie CKC (Content Key Context) i przekazanie go z powrotem do AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. Pobierz SPC z keyRequest
// 2. Wyślij SPC na serwer licencyjny
// 3. Pobierz CKC i przekaż do keyRequest.processContentKeyResponse
}
}
Do wyświetlania informacji o bieżącym odtwarzaniu na ekranie blokady, Centrum Sterowania i Apple Watch używa się MPNowPlayingInfoCenter z MediaPlayer.framework. AVPlayer automatycznie nie aktualizuje Now Playing — deweloper musi ręcznie ustawiać metadane (tytuł, wykonawca, okładka, postęp) przy zmianie stanu odtwarzania. Do aktualizacji postępu używa się regularnego timera lub observe(\.timeControlStatus).
Remote Command Center — kolejna usługa systemowa, pozwalająca sterować odtwarzaniem z zablokowanego ekranu, AirPods i CarPlay. MPRemoteCommandCenter rejestruje procedury obsługi dla komend play, pause, nextTrack, previousTrack, changePlaybackPosition i skipForward/skipBackward. AVPlayer nie przetwarza tych komend automatycznie — deweloper musi powiązać je z wywołaniami player.play(), player.pause() i player.seek().
Często zadawane pytania
AVPlayer — uniwersalny odtwarzacz audio i wideo z wsparciem streamingu, HLS, DRM i synchronizacji z systemowymi elementami sterowania. AVAudioPlayer — uproszczony odtwarzacz audio do odtwarzania lokalnych plików audio bez wsparcia streamingu i sprzętowego przyspieszenia wideo. Do wideo i HLS używaj AVPlayer, do prostego audio — AVAudioPlayer.
Nie, AVPlayer nie obsługuje bezpośredniego ładowania treści YouTube, ponieważ YouTube używa własnego odtwarzacza opartego na DASH i formatach zastrzeżonych. Do integracji YouTube w aplikacji iOS użyj YouTube IFrame Player API przez WKWebView lub oficjalnej biblioteki youtube-ios-player-helper.
Do odtwarzania w tle dodaj Audio, AirPlay and Picture in Picture w Background Modes swojego projektu Xcode. Skonfiguruj AVAudioSession z kategorią .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer będzie kontynuował odtwarzanie w tle, a ekran blokady i Centrum Sterowania będą wyświetlać elementy sterowania przez MPNowPlayingInfoCenter.
Te serwisy używają ochrony DRM i własnych rozwiązań odtwarzaczy. AVPlayer może odtwarzać treści tylko z bezpośredniego linku do pliku medialnego lub playlisty HLS. Wideo z YouTube i podobnych platform jest opakowane w iframe lub JavaScript-owy odtwarzacz, który jest niekompatybilny z AVPlayer. Użyj ich oficjalnych SDK lub WebView do wyświetlania.
Dla Low-Latency HLS skonfiguruj AVPlayerItem z preferredForwardBufferDuration = 2.0 (sekundy) i automatycznie zarządzaj pauzą przy opóźnieniu względem granicy na żywo: użyj player.currentItem?.configuredTimeOffsetFromLive i player.currentItem?.canPlayReverse. Apple zaleca LL-HLS z opóźnieniem 2-4 sekund przy prawidłowej konfiguracji na serwerze i kliencie.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również