AVPlayer — Apple tomonidan ishlab chiqilgan, AVFoundation tarkibiga kiruvchi va iOS, macOS, tvOS hamda visionOS platformalarida audio va video tinglashni ta'minlovchi media pleer freymvorkidir. AVPlayer mahalliy MP4 fayllaridan adaptiv HLS oqimlarigacha keng formatlar spektrini yagona API orqali Apple Silicon chiplarida apparat tezlashtirilgan dekodlash bilan qo'llab-quvvatlaydi. Apple WWDC (2024) ma'lumotlariga ko'ra, AVPlayer media bilan ishlaydigan iOS ilovalarining 90 foizida, jumladan Apple TV, Music va Photos dasturlarida qo'llaniladi.
Asosiy ma'lumotlar
AVPlayer — AVFoundation freymvorkining markaziy komponenti bo'lib, Apple-ning barcha platformalarida multimedia kontentini tinglash uchun javobgardir. iOS 4.0 (2010) da eskirgan MPMoviePlayerController o'rniga taqdim etilgan AVPlayer, dekodlash parametrlarini nozik sozlash, audio va video sinxronizatsiyasi, shuningdek AirPlay va Picture in Picture kabi tizim xizmatlari bilan integratsiya imkoniyati bilan tinglash ustida past darajali nazoratni ta'minlaydi.
Uchinchi tomon pleerlaridan farqli o'laroq, AVPlayer Apple Silicon chiplarida apparat tezlashtirishning afzalliklariga ega. Video dekodlash M-seriyasining maxsus media mexanizmlaridan (Media Engine) foydalangan holda VideoToolbox orqali amalga oshiriladi, bu minimal energiya sarfi bilan 8K HDR tinglashni ta'minlaydi. HEVC (H.265) va ProRes uchun dekodlash CPU ni yuklamasdan chipning ixtisoslashgan bloklarida amalga oshiriladi.
AVPlayer Apple ekotizimi bilan chambarchas integratsiyalangan: qurilmalar o'rtasida tinglashni uzatish uchun Handoff, Apple TV ga striming uchun AirPlay 2, boshning dinamik kuzatuvi bilan fazoviy tovush va MPNowPlayingInfoCenter orqali tizim boshqaruv elementlari bilan sinxronizatsiya. Ushbu integratsiyalar AVPlayer-ni Apple platformalarida media bilan ishlaydigan barcha ilovalar uchun de-fakto standartga aylantiradi.
AVFoundation freymvorki tinglash uchun uch darajali iyerarxiyani ta'minlaydi: AVAsset (metama'lumotlar va kontent haqida ma'lumot), AVPlayerItem (holat va kontentning ma'lum bir nusxasini boshqarish) va AVPlayer (tinglashni boshqarish). Ushbu arxitektura metama'lumotlarni yuklash, tinglashga tayyorgarlik va tinglash jarayonining o'zini ajratish imkonini beradi, bu ko'p bitrate variantlari bo'lgan HLS oqimlari uchun ayniqsa muhimdir.
AVAsset media kontent — fayl yoki oqim modelini ifodalaydi. AVAsset o'z-o'zidan tinglab bo'lmaydi; u treklarni (AVAssetTrack), metama'lumotlarni (commonMetadata), davomiylik haqidagi ma'lumotni va boshqa xususiyatlarni o'z ichiga oladi. AVAsset dan AVPlayerItem yaratiladi, keyin u tinglash uchun AVPlayer ga uzatilishi mumkin.
AVPlayer oddiy fayl tinglashdan tortib DRM bilan murakkab jonli translyatsiyalargacha bo'lgan aksariyat tinglash stsenariylarini qamrab oluvchi imkoniyatlar to'plamini taqdim etadi. Keling, asosiy funksiyalarni ularni qo'llash misollari bilan ko'rib chiqaylik.
| Imkoniyat | Tavsif | Platformalar |
|---|---|---|
| Mahalliy fayllar | MP4, MOV, M4V, AVI, MKV (kengaytmalar orqali) | iOS, macOS, tvOS |
| HLS | Adaptiv ABR bilan HTTP Live Streaming | Barcha Apple platformalari |
| FairPlay DRM | Oqim litsenziyasi bilan himoyalangan HLS kontenti | iOS, tvOS, macOS |
| Picture in Picture | Boshqa ilovalar ustidagi suzuvchi video oyna | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Apple TV va dinamiklarga simsiz uzatish | Barcha platformalar |
| Fazoviy tovush | Dolby Atmos va dinamik kuzatuv | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG (displey qo'llab-quvvatlashi bilan) | iOS 11+, macOS 10.13+ |
AVPlayer qo'shimcha kutubxonalar o'rnatmasdan HLS uchun mahalliy qo'llab-quvvatlashga ega. HLS oqimini tinglashda AVPlayer Apple platformalari uchun optimallashtirilgan o'rnatilgan ABR algoritmidan foydalanib, adaptiv bitrate almashinuvini avtomatik boshqaradi. Algoritm nafaqat tarmoq o'tkazish qobiliyatini, balki qurilmaning termal holatini ham hisobga oladi — haddan tashqari qizib ketganda, AVPlayer protsessor yukini kamaytirish uchun bitrate-ni pasaytirishi mumkin.
FairPlay Streaming bilan HLS oqimlari uchun AVPlayer AVContentKeySession delegati orqali litsenziyalarni olish va yangilashni avtomatik boshqaradi. Dasturchi AVContentKeySessionDelegate protokolini amalga oshirishi kerak, bu pleer shifrlash kalitini olish yoki yangilash zarur bo'lganda chaqiriladi. Bu Apple platformalarida HLS kontentini himoya qilishning yagona usuli, chunki Widevine iOS da qo'llab-quvvatlanmaydi.
PiP — foydalanuvchiga ilovalar o'rtasida almashishda suzuvchi oynada video tomosha qilishni davom ettirish imkonini beruvchi rejim. iPad va iPhone da (iOS 14+) AVPlayer ushbu rejimni yoqish uchun AVPictureInPictureController bilan integratsiyalanadi. macOS 15+ da PiP ham mavjud, ammo tizim menyusi yoki pleer oynasidagi tugma orqali faollashtiriladi.
AVPlayer ni iOS ilovasiga integratsiya qilish ikki usulda amalga oshirilishi mumkin: yuqori darajadagi AVPlayerViewController orqali (odatiy stsenariylar uchun) yoki to'g'ridan-to'g'ri AVPlayer + AVPlayerLayer orqali (interfeysni to'liq moslashtirish uchun). Keling, ikkala yondashuvni Swift da ko'rib chiqaylik.
AVPlayerViewController — o'rnatilgan boshqaruv elementlarini ta'minlovchi tayyor UI komponenti: play/pause, orqaga o'rash, tovush, AirPlay, PiP va to'liq ekran rejimi. Minimal integratsiya atigi bir necha qator kodni talab qiladi: AVPlayer nusxasini yaratish, uni AVPlayerViewController ga uzatish va boshqaruvchini ekranda ko'rsatish.
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()
}
Maxsus UI ga ega ilovalar uchun AVPlayerLayer — istalgan UIView ichida video renderlovchi Core Animation qatlamidan foydalaning. Ushbu yondashuv interfeys ustidan to'liq nazorat beradi: o'zingizning boshqaruv elementlaringizni, animatsiyalaringizni va video ustiga qo'shimcha qatlamlarni qo'shishingiz mumkin.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Foydalanish:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Pleer hayotiy siklini to'g'ri boshqarish ilova barqarorligi uchun muhim ahamiyatga ega. AVPlayer ekran paydo bo'lganda yaratilishi va yopilganda bo'shatilishi kerak. Ilova fon rejimiga o'tganda, resurslarni tejash va aniq zaruratsiz fon tinglash uchun App Review jarimalaridan qochish uchun tinglashni to'xtatib turish tavsiya etiladi.
AVPlayerLayer — CALayer dan meros olgan, ekranda video renderini ta'minlovchi Core Animation qatlamidir. UIView dan farqli o'laroq, AVPlayerLayer to'g'ridan-to'g'ri GPU bilan Metal yoki OpenGL orqali ishlaydi, kadr chiqishining minimal kechikishini ta'minlaydi. AVPlayerLayer ishlashini tushunish maxsus tinglash interfeyslarini amalga oshirish uchun zarur.
videoGravity xususiyati videoning qatlam chegaralariga qanday moslashishini aniqlaydi. AVLayerVideoGravity.resizeAspect (qora chiziqlar bilan nisbatlarni saqlash) — AVPlayerViewController uchun standart qiymat. resizeAspectFill (kesish bilan butun ekranni to'ldirish) to'liq ekran rejimi uchun ishlatiladi. resize (qatlam o'lchamiga nisbatlarni buzish) kamdan-kam, asosan analitik ilovalar uchun qo'llaniladi.
AVPlayerLayer videoni real vaqtda renderlaydi, ammo pleer bilan barcha operatsiyalar (start, pause, seek) asosiy oqimda bajarilishi kerak. Kuzatish uchun asosiy qiymatlar — timeControlStatus, rate, status va error — KVO (Key-Value Observing) yoki iOS 16 da Swift Concurrency qo'llab-quvvatlashi bilan AVPlayer metodlari orqali taqdim etilgan zamonaviy async/await API orqali kuzatiladi.
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 va ITT (iTunes Timed Text) formatlarida o'rnatilgan subtitrlarni qo'llab-quvvatlaydi. Audio trek va subtitrlarni tanlash AVMediaSelectionGroup va AVMediaSelectionOption orqali amalga oshiriladi. Foydalanuvchi subtitr sozlamalari (shrift, o'lcham, rang) tizimning Accessibility sozlamalaridan o'qiladi va kodda aniq ko'rsatilmagan bo'lsa, AVPlayerLayer ga avtomatik qo'llaniladi.
Ishlab chiqarish ilovalari uchun AVPlayer ning asosiy integratsiyasi ko'pincha qo'shimcha sozlash ni talab qiladi: HLS segmentlarini keshlash, FairPlay DRM bilan ishlash, „Now Playing" tizimi bilan integratsiya va maxsus bitrate tanlash algoritmlarini amalga oshirish.
AVAssetResourceLoader — HLS segmentlarini yuklashni tutib olish va keshlashni amalga oshirishning yagona usuli. AVAssetResourceLoaderDelegate vakili kalitlar va segmentlarni yuklash so'rovlarini oladi, ularni mahalliy saqlash va takroriy so'rovlarda keshdan qaytarish imkonini beradi. Bu ayniqsa beqaror tarmoq sharoitida ishlaydigan ilovalar uchun foydalidir.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) — HLS kontentini himoya qilish uchun Apple standarti. FPS integratsiyasi uchun shifrlash kalitlarini olish so'rovlarini qayta ishlovchi AVContentKeySessionDelegate protokolini amalga oshirish kerak. Jarayon o'z ichiga oladi: pleerdan SPC (Server Playback Context) olish, litsenziya serveriga yuborish, CKC (Content Key Context) olish va uni AVContentKeySession ga qaytarish.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. keyRequest dan SPC oling
// 2. SPC ni litsenziya serveriga yuboring
// 3. CKC oling va keyRequest.processContentKeyResponse ga uzating
}
}
Qulflangan ekran, Control Center va Apple Watch da joriy tinglash haqidagi ma'lumotni ko'rsatish uchun MediaPlayer.framework dan MPNowPlayingInfoCenter ishlatiladi. AVPlayer Now Playing ni avtomatik yangilamaydi — dasturchi tinglash holati o'zgarganda qo'lda metama'lumotlarni (nom, ijrochi, muqova, taraqqiyot) o'rnatishi kerak. Taraqqiyotni yangilash uchun muntazam taymer yoki observe(\.timeControlStatus) ishlatiladi.
Remote Command Center — qulflangan ekrandan, AirPods va CarPlay dan tinglashni boshqarish imkonini beruvchi yana bir tizim xizmati. MPRemoteCommandCenter play, pause, nextTrack, previousTrack, changePlaybackPosition va skipForward/skipBackward buyruqlari uchun ishlovchilarni ro'yxatdan o'tkazadi. AVPlayer bu buyruqlarni avtomatik qayta ishlamaydi — dasturchi ularni player.play(), player.pause() va player.seek() chaqiruvlari bilan bog'lashi kerak.
Tez-tez beriladigan savollar
AVPlayer — striming, HLS, DRM va tizim boshqaruv elementlari bilan sinxronizatsiya qo'llab-quvvatlashiga ega universal audio va video pleeri. AVAudioPlayer — striming va apparat video tezlashtirishsiz mahalliy audio fayllarni tinglash uchun soddalashtirilgan audio pleer. Video va HLS uchun AVPlayer, oddiy audio uchun AVAudioPlayer dan foydalaning.
Yo'q, AVPlayer YouTube kontentini to'g'ridan-to'g'ri yuklashni qo'llab-quvvatlamaydi, chunki YouTube DASH va xususiy formatlarga asoslangan o'z pleeridan foydalanadi. YouTube ni iOS ilovasiga integratsiya qilish uchun WKWebView orqali YouTube IFrame Player API yoki rasmiy youtube-ios-player-helper kutubxonasidan foydalaning.
Fon audio uchun Xcode loyihangizning Background Modes bo'limiga Audio, AirPlay and Picture in Picture ni qo'shing. AVAudioSession ni .playback kategoriyasi bilan sozlang: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer fonda tinglashni davom ettiradi, qulflangan ekran va Control Center esa MPNowPlayingInfoCenter orqali boshqaruv elementlarini ko'rsatadi.
Ushbu xizmatlar DRM himoyasi va o'z pleer yechimlaridan foydalanadi. AVPlayer faqat media fayl yoki HLS pleylistiga to'g'ridan-to'g'ri havola orqali kontentni tinglashi mumkin. YouTube va shunga o'xshash platformalardan videolar AVPlayer bilan mos kelmaydigan iframe yoki JavaScript pleeriga o'ralgan. Ko'rsatish uchun ularning rasmiy SDK lari yoki WebView dan foydalaning.
Low-Latency HLS uchun AVPlayerItem ni preferredForwardBufferDuration = 2.0 (soniya) bilan sozlang va jonli chegaradan orqada qolganda avtomatik pauzani boshqaring: player.currentItem?.configuredTimeOffsetFromLive va player.currentItem?.canPlayReverse dan foydalaning. Apple server va mijoz tomonida to'g'ri sozlash bilan 2-4 soniya kechikishli LL-HLS ni tavsiya qiladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.