AVPlayer, Apple'ın AVFoundation'un bir parçası olan ve iOS, macOS, tvOS ve visionOS'ta ses ve video oynatma sağlayan bir medya oynatıcı framework'üdür. AVPlayer, yerel MP4 dosyalarından uyarlanabilir HLS akışlarına kadar geniş bir format yelpazesini — Apple Silicon yongalarında donanım hızlandırmalı kod çözme ile birleşik bir API aracılığıyla destekler. Apple WWDC (2024)'ye göre AVPlayer, Apple TV, Music ve Photos dahil olmak üzere medyayla çalışan iOS uygulamalarının %90'ında kullanılmaktadır.
Önemli Noktalar
AVPlayer, AVFoundation framework'ünün merkezi bileşenidir ve tüm Apple platformlarında multimedya oynatmadan sorumludur. iOS 4.0'da (2010) kullanımdan kaldırılan MPMoviePlayerController'ın yerine tanıtılan AVPlayer, kod çözme parametrelerinin ince ayarı, ses-video senkronizasyonu ve AirPlay ile Picture in Picture gibi sistem hizmetleriyle entegrasyon ile oynatma üzerinde düşük seviyeli kontrol sağlar.
Üçüncü taraf oynatıcılardan farklı olarak, AVPlayer Apple Silicon yongalarında donanım hızlandırmasından yararlanır. Video kod çözme, özel M-serisi medya motorlarını (Media Engine) kullanarak VideoToolbox aracılığıyla gerçekleştirilir ve minimum güç tüketimiyle 8K HDR oynatma sağlar. HEVC (H.265) ve ProRes için kod çözme, CPU'yu yormadan özel yonga bloklarında gerçekleşir.
AVPlayer, Apple ekosistemiyle sıkı bir şekilde entegredir: cihazlar arasında oynatmayı aktarmak için Handoff desteği, Apple TV'ye akış için AirPlay 2, dinamik kafa takibi ile uzamsal ses ve MPNowPlayingInfoCenter aracılığıyla sistem kontrol öğeleriyle senkronizasyon. Bu entegrasyonlar, AVPlayer'ı Apple platformlarında medyayla çalışan tüm uygulamalar için fiili standart haline getirir.
AVFoundation framework'ü, oynatma için üç seviyeli bir hiyerarşi sağlar: AVAsset (meta veriler ve içerik bilgisi), AVPlayerItem (belirli bir içerik örneğinin durumu ve yönetimi) ve AVPlayer (oynatma kontrolü). Bu mimari, meta veri yüklemeyi, oynatma hazırlığını ve oynatma sürecinin kendisini ayırır — bu, birden çok bit hızı seçeneğine sahip HLS akışları için özellikle önemlidir.
AVAsset bir medya içerik modelini — bir dosya veya akışı — temsil eder. AVAsset kendi başına oynatılabilir değildir; parçalar (AVAssetTrack), meta veriler (commonMetadata), süre bilgisi ve diğer özellikleri içerir. AVAsset'ten bir AVPlayerItem oluşturulur ve daha sonra oynatma için AVPlayer'a iletilebilir.
AVPlayer, basit dosya oynatmadan DRM'li karmaşık canlı yayınlara kadar çoğu oynatma senaryosunu kapsayan bir dizi yetenek sunar. Kullanım örnekleriyle temel özellikleri keşfedelim.
| Özellik | Açıklama | Platformlar |
|---|---|---|
| Yerel dosyalar | MP4, MOV, M4V, AVI, MKV (uzantılar yoluyla) | iOS, macOS, tvOS |
| HLS | Uyarlanabilir ABR ile HTTP Live Streaming | Tüm Apple platformları |
| FairPlay DRM | Akış lisansıyla korunan HLS içeriği | iOS, tvOS, macOS |
| Picture in Picture | Diğer uygulamaların üzerinde yüzen video penceresi | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Apple TV ve hoparlörlere kablosuz akış | Tüm platformlar |
| Uzamsal ses | Dolby Atmos ve dinamik kafa takibi | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG ekran desteğiyle | iOS 11+, macOS 10.13+ |
AVPlayer, ek kitaplık gerektirmeden yerel HLS desteğine sahiptir. Bir HLS akışını oynatırken AVPlayer, Apple platformları için optimize edilmiş yerleşik bir ABR algoritması kullanarak otomatik olarak uyarlanabilir bit hızı değiştirmeyi yönetir. Algoritma yalnızca ağ bant genişliğini değil, aynı zamanda cihazın termal durumunu da dikkate alır — aşırı ısınma durumunda AVPlayer, CPU yükünü azaltmak için bit hızını düşürebilir.
FairPlay Streaming ile HLS akışları için AVPlayer, AVContentKeySession delegate'i aracılığıyla otomatik olarak lisans alma ve yenilemeyi yönetir. Geliştiricinin, şifre çözme anahtarı alınması veya yenilenmesi gerektiğinde oynatıcı tarafından çağrılan AVContentKeySessionDelegate protokolünü uygulaması gerekir. Widevine iOS'ta desteklenmediğinden, Apple platformlarında HLS içeriğini korumanın tek yolu budur.
PiP, uygulamalar arasında geçiş yaparken kullanıcıların videoyu yüzen bir pencerede izlemeye devam etmesini sağlayan bir moddur. iPad ve iPhone'da (iOS 14+), AVPlayer bu modu etkinleştirmek için AVPictureInPictureController ile entegre olur. macOS 15+'te PiP de mevcuttur ancak sistem menüsü veya oynatıcı penceresindeki bir düğme aracılığıyla etkinleştirilir.
AVPlayer'ı bir iOS uygulamasına entegre etmek iki şekilde yapılabilir: üst düzey AVPlayerViewController aracılığıyla (standart senaryolar için) veya doğrudan AVPlayer + AVPlayerLayer aracılığıyla (tam UI özelleştirmesi için). Swift'te her iki yaklaşımı da keşfedelim.
AVPlayerViewController, yerleşik kontroller sağlayan kullanıma hazır bir UI bileşenidir: oynat/duraklat, arama, ses, AirPlay, PiP ve tam ekran modu. Minimum entegrasyon yalnızca birkaç satır kod gerektirir: bir AVPlayer örneği oluşturun, AVPlayerViewController'a iletin ve denetleyiciyi ekranda görüntüleyin.
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()
}
Özel UI'ya sahip uygulamalar için, herhangi bir UIView içinde video oluşturan bir Core Animation katmanı olan AVPlayerLayer'ı kullanın. Bu yaklaşım, arayüz üzerinde tam kontrol sağlar: özel kontroller, animasyonlar ekleyebilir ve videonun üzerine ek katmanlar yerleştirebilirsiniz.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Kullanım:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Uygun oynatıcı yaşam döngüsü yönetimi, uygulama kararlılığı için kritiktir. AVPlayer ekran göründüğünde oluşturulmalı ve kapatıldığında serbest bırakılmalıdır. Uygulama arka plana geçtiğinde, kaynakları korumak ve gereksiz arka plan oynatması için App Review cezalarından kaçınmak için oynatmanın duraklatılması önerilir.
AVPlayerLayer, CALayer'dan miras alan ve ekranda video oluşturan bir Core Animation katmanıdır. UIView'den farklı olarak AVPlayerLayer, Metal veya OpenGL aracılığıyla doğrudan GPU ile çalışarak minimum kare çıkış gecikmesi sağlar. Özel oynatma arayüzleri uygulamak için AVPlayerLayer'ı anlamak önemlidir.
videoGravity özelliği, videonun katman sınırlarına nasıl sığacağını belirler. AVLayerVideoGravity.resizeAspect (siyah çubuklarla en boy oranını koruma) AVPlayerViewController için varsayılandır. resizeAspectFill (kırpma ile tüm ekranı doldurma) tam ekran modu için kullanılır. resize (katman boyutuna uyacak şekilde oranları bozma) nadiren kullanılır, çoğunlukla analitik uygulamalar için.
AVPlayerLayer videoyu gerçek zamanlı olarak oluşturur, ancak tüm oynatıcı işlemleri (başlatma, duraklatma, arama) ana iş parçacığında gerçekleştirilmelidir. Gözlem için anahtar değerler — timeControlStatus, rate, status ve error — KVO (Key-Value Observing) veya iOS 16'da Swift Concurrency desteğiyle AVPlayer yöntemleri aracılığıyla tanıtılan modern async/await API'si aracılığıyla izlenir.
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, VTT, CEA-608 ve ITT (iTunes Timed Text) biçimlerinde gömülü altyazıları destekler. Ses parçası ve altyazı seçimi, AVMediaSelectionGroup ve AVMediaSelectionOption aracılığıyla yapılır. Kullanıcı altyazı ayarları (yazı tipi, boyut, renk) sistem Erişilebilirlik ayarlarından okunur ve kodda açıkça belirtilmediği sürece otomatik olarak AVPlayerLayer'a uygulanır.
Üretim uygulamaları için temel AVPlayer entegrasyonu genellikle ek yapılandırma gerektirir: HLS segment önbellekleme, FairPlay DRM entegrasyonu, Now Playing sistemi entegrasyonu ve özel bit hızı seçim algoritmaları.
AVAssetResourceLoader, HLS segment yüklemeyi durdurmanın ve önbellekleme uygulamanın tek yoludur. AVAssetResourceLoaderDelegate, anahtarlar ve segmentler için yükleme isteklerini alır, bunları yerel olarak depolamaya ve sonraki isteklerde önbellekten döndürmeye olanak tanır. Bu, kararsız ağ koşullarında çalışan uygulamalar için özellikle yararlıdır.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS), HLS içeriğini korumak için Apple'ın standardıdır. FPS'yi entegre etmek için, şifre çözme anahtarları isteklerini işleyen AVContentKeySessionDelegate protokolünü uygulamanız gerekir. Süreç şunları içerir: oynatıcıdan SPC (Sunucu Oynatma Bağlamı) alma, lisans sunucusuna gönderme, CKC (İçerik Anahtarı Bağlamı) alma ve AVContentKeySession'a geri iletme.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. keyRequest'ten SPC al
// 2. SPC'yi lisans sunucusuna gönder
// 3. CKC al ve keyRequest.processContentKeyResponse'a ilet
}
}
Kilit Ekranı, Kontrol Merkezi ve Apple Watch'ta geçerli oynatma bilgilerini görüntülemek için MediaPlayer.framework'ten MPNowPlayingInfoCenter'ı kullanın. AVPlayer, Now Playing'i otomatik olarak güncellemez — geliştirici, oynatma durumu değiştiğinde meta verileri (başlık, sanatçı, kapak resmi, ilerleme) manuel olarak ayarlamalıdır. İlerleme güncellemeleri için düzenli bir zamanlayıcı veya observe(\.timeControlStatus) kullanılır.
Remote Command Center, kilitli ekrandan, AirPods ve CarPlay'den oynatmayı kontrol etmeye izin veren başka bir sistem hizmetidir. MPRemoteCommandCenter, play, pause, nextTrack, previousTrack, changePlaybackPosition ve skipForward/skipBackward komutları için işleyiciler kaydeder. AVPlayer bu komutları otomatik olarak işlemez — geliştirici bunları player.play(), player.pause() ve player.seek() çağrılarına bağlamalıdır.
Sıkça sorulan sorular
AVPlayer, akış, HLS, DRM ve sistem kontrolleriyle senkronizasyon desteği sunan evrensel bir ses ve video oynatıcısıdır. AVAudioPlayer, akış veya donanım video hızlandırması olmadan yerel ses dosyası oynatma için basitleştirilmiş bir ses oynatıcısıdır. Video ve HLS için AVPlayer'ı kullanın; basit ses için AVAudioPlayer'ı kullanın.
Hayır, AVPlayer doğrudan YouTube içeriği yüklemeyi desteklemez çünkü YouTube, DASH ve tescilli biçimlere dayalı kendi oynatıcısını kullanır. YouTube'u bir iOS uygulamasına entegre etmek için WKWebView veya resmi youtube-ios-player-helper kitaplığı aracılığıyla YouTube IFrame Player API'sini kullanın.
Arka plan sesi için Xcode projenizin Arka Plan Modlarına Audio, AirPlay and Picture in Picture ekleyin. AVAudioSession'ı .playback kategorisiyle yapılandırın: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer arka planda oynatmaya devam edecek ve Kilit Ekranı ile Kontrol Merkezi, MPNowPlayingInfoCenter aracılığıyla kontrolleri gösterecektir.
Bu hizmetler DRM koruması ve kendi oynatıcı çözümlerini kullanır. AVPlayer yalnızca doğrudan medya dosyası URL'si veya HLS oynatma listesi aracılığıyla içerik oynatabilir. YouTube ve benzer platformlardaki videolar, AVPlayer ile uyumsuz olan iframe veya JavaScript oynatıcılara sarılır. Görüntüleme için resmi SDK'larını veya WebView'ı kullanın.
Düşük gecikmeli HLS için AVPlayerItem'ı preferredForwardBufferDuration = 2.0 (saniye) ile yapılandırın ve canlı kenarın gerisinde kaldığında duraklatmayı otomatik olarak yönetin: player.currentItem?.configuredTimeOffsetFromLive ve player.currentItem?.canPlayReverse kullanın. Apple, hem sunucu hem de istemcide doğru yapılandırıldığında 2-4 saniye gecikmeli LL-HLS'yi önerir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun