AVPlayer — kluczowe pojęcia, możliwości i zastosowanie

Autor: IT Sectr Opublikowano: 2026-05-23 Czas czytania: 9 min

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 framework odtwarzacza multimedialnego Apple z AVFoundation dla wszystkich platform Apple.
  • Przyspieszenie sprzętowe — AVPlayer wykorzystuje VideoToolbox do dekodowania na GPU, zmniejszając zużycie energii.
  • HLS — natywne wsparcie dla HTTP Live Streaming z automatycznym adaptacyjnym przełączaniem przepływności.
  • Picture in Picture — wbudowane wsparcie dla trybu „obraz w obrazie” na iPad, iPhone i Mac.
  • DRM — integracja z FairPlay Streaming do ochrony treści premium.

Czym jest AVPlayer?

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.

AVFoundation i hierarchia klas

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.

Główne możliwości AVPlayer

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śćOpisPlatformy
Pliki lokalneMP4, MOV, M4V, AVI, MKV (przez rozszerzenia)iOS, macOS, tvOS
HLSHTTP Live Streaming z adaptacyjnym ABRWszystkie platformy Apple
FairPlay DRMZabezpieczona treść HLS z licencją strumieniowąiOS, tvOS, macOS
Picture in PicturePływające okno wideo nad innymi aplikacjamiiPad, iPhone (iOS 14+), Mac
AirPlay 2Bezprzewodowe przesyłanie na Apple TV i głośnikiWszystkie platformy
Dźwięk przestrzennyDolby Atmos i dynamiczne śledzenieiOS 15+, macOS 13+
HDRDolby Vision, HDR10, HLG przy wsparciu wyświetlaczaiOS 11+, macOS 10.13+

Wsparcie HLS i adaptacyjne przełączanie

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.

Picture in Picture

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.

Jak używać AVPlayer w aplikacji iOS

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.

Integracja przez AVPlayerViewController

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.

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()
}

Bezpośrednia integracja przez AVPlayerLayer

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.

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
    }
}

// Użycie:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)

Zarządzanie cyklem życia AVPlayer

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 i wyświetlanie wideo

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.

Konfiguracja videoGravity

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.

Synchronizacja z głównym wątkiem

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.

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
    }
}

Wsparcie napisów i alternatywnych ścieżek

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.

Zarządzanie odtwarzaniem i zaawansowane scenariusze

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.

Buforowanie HLS przez AVAssetResourceLoader

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.

swift
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
    resourceLoaderDelegate,
    queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)

FairPlay Streaming — integracja DRM

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.

swift
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
    }
}

Now Playing i systemowe elementy sterowania

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

Czym AVPlayer różni się od AVAudioPlayer?

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.

Czy AVPlayer obsługuje odtwarzanie YouTube?

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.

Jak zaimplementować odtwarzanie w tle audio z AVPlayer?

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.

Dlaczego AVPlayer nie odtwarza wideo z YouTube, Vimeo lub Twitter?

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.

Jak zmniejszyć opóźnienie w transmisji na żywo przez AVPlayer?

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

  • AVPlayer — uniwersalny odtwarzacz multimedialny Apple z sprzętowym przyspieszeniem na Apple Silicon dla iOS, macOS, tvOS i visionOS.
  • HLS — natywne wsparcie z automatycznym adaptacyjnym przełączaniem przepływności bez dodatkowych bibliotek.
  • FairPlay Streaming — jedyny system DRM dla chronionego HLS na platformach Apple.
  • Integracja — AVPlayerViewController do szybkiego startu lub AVPlayerLayer dla niestandardowego UI.
  • Buforowanie HLS implementuje się przez AVAssetResourceLoaderDelegate z przechwytywaniem żądań segmentów.
  • Now Playing — ręczna aktualizacja metadanych dla Centrum Sterowania i ekranu blokady przez MPNowPlayingInfoCenter.
  • Zalecane używanie AVPlayer dla wszystkich projektów medialnych na platformach Apple z wymaganiami HLS.

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.

Omów projekt

Przeczytaj również