AVPlayer adalah framework pemutar media dari Apple, bagian dari AVFoundation yang menyediakan pemutaran audio dan video di iOS, macOS, tvOS, dan visionOS. AVPlayer mendukung berbagai format — dari file MP4 lokal hingga streaming HLS adaptif — melalui API tunggal dengan akselerasi perangkat keras decoding pada chip Apple Silicon. Menurut data Apple WWDC (2024), AVPlayer digunakan di 90% aplikasi iOS yang bekerja dengan media, termasuk Apple TV, Music, dan Photos.
Poin utama
AVPlayer — adalah komponen utama framework AVFoundation, bertanggung jawab atas pemutaran konten multimedia di semua platform Apple. Diperkenalkan di iOS 4.0 (2010) sebagai pengganti MPMoviePlayerController yang usang, AVPlayer menyediakan kontrol tingkat rendah atas pemutaran dengan kemampuan penyesuaian parameter decoding, sinkronisasi audio dan video, serta integrasi dengan layanan sistem seperti AirPlay dan Picture in Picture.
Tidak seperti pemutar pihak ketiga, AVPlayer mendapatkan keuntungan akselerasi perangkat keras pada chip Apple Silicon. Decoding video dilakukan melalui VideoToolbox menggunakan mesin media khusus seri M (Media Engine), memungkinkan pemutaran 8K HDR dengan konsumsi daya minimal. Untuk HEVC (H.265) dan ProRes, decoding dilakukan pada blok chip khusus, tanpa membebani CPU.
AVPlayer terintegrasi erat dengan ekosistem Apple: dukungan Handoff untuk mentransfer pemutaran antar perangkat, AirPlay 2 untuk streaming ke Apple TV, audio spasial dengan pelacakan kepala dinamis, dan sinkronisasi dengan kontrol sistem melalui MPNowPlayingInfoCenter. Integrasi ini menjadikan AVPlayer standar de facto untuk semua aplikasi yang bekerja dengan media di platform Apple.
Framework AVFoundation menyediakan hierarki tiga tingkat untuk pemutaran: AVAsset (metadata dan informasi tentang konten), AVPlayerItem (status dan pengelolaan instance konten tertentu), dan AVPlayer (pengelolaan pemutaran). Arsitektur ini memungkinkan pemisahan pemuatan metadata, persiapan pemutaran, dan proses pemutaran itu sendiri, yang sangat penting untuk streaming HLS dengan banyak varian bitrate.
AVAsset mewakili model konten media — file atau streaming. AVAsset tidak dapat diputar dengan sendirinya; ia berisi track (AVAssetTrack), metadata (commonMetadata), informasi durasi, dan karakteristik lainnya. Dari AVAsset dibuat AVPlayerItem, yang kemudian dapat diteruskan ke AVPlayer untuk diputar.
AVPlayer menyediakan seperangkat fitur yang mencakup sebagian besar skenario pemutaran — dari pemutaran file sederhana hingga siaran langsung kompleks dengan DRM. Mari kita lihat fungsi utama dengan contoh penerapannya.
| Fitur | Deskripsi | Platform |
|---|---|---|
| File lokal | MP4, MOV, M4V, AVI, MKV (melalui ekstensi) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming dengan ABR adaptif | Semua platform Apple |
| FairPlay DRM | Konten HLS terlindungi dengan lisensi streaming | iOS, tvOS, macOS |
| Picture in Picture | Jendela video mengambang di atas aplikasi lain | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Transmisi nirkabel ke Apple TV dan speaker | Semua platform |
| Audio spasial | Dolby Atmos dan pelacakan dinamis | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG dengan dukungan layar | iOS 11+, macOS 10.13+ |
AVPlayer memiliki dukungan native untuk HLS tanpa perlu menginstal pustaka tambahan. Saat memutar streaming HLS, AVPlayer secara otomatis mengelola perpindahan bitrate adaptif menggunakan algoritma ABR bawaan yang dioptimalkan untuk platform Apple. Algoritma ini tidak hanya mempertimbangkan bandwidth jaringan, tetapi juga kondisi termal perangkat — saat terlalu panas, AVPlayer dapat menurunkan bitrate untuk mengurangi beban prosesor.
Untuk streaming HLS dengan FairPlay Streaming, AVPlayer secara otomatis menangani perolehan dan pembaruan lisensi melalui delegat AVContentKeySession. Pengembang harus mengimplementasikan protokol AVContentKeySessionDelegate, yang dipanggil oleh pemutar saat perlu mendapatkan atau memperbarui kunci dekripsi. Ini adalah satu-satunya cara untuk melindungi konten HLS di platform Apple, karena Widevine tidak didukung di iOS.
PiP — mode yang memungkinkan pengguna terus menonton video di jendela mengambang saat beralih antar aplikasi. Di iPad dan iPhone (iOS 14+) AVPlayer terintegrasi dengan AVPictureInPictureController untuk mengaktifkan mode ini. Di macOS 15+ PiP juga tersedia, tetapi diaktifkan melalui menu sistem atau tombol di jendela pemutar.
Integrasi AVPlayer dalam aplikasi iOS dapat dilakukan dengan dua cara: melalui AVPlayerViewController tingkat tinggi (untuk skenario umum) atau langsung melalui AVPlayer + AVPlayerLayer (untuk kustomisasi antarmuka penuh). Mari kita lihat kedua pendekatan dalam Swift.
AVPlayerViewController — komponen UI siap pakai yang menyediakan kontrol bawaan: play/pause, mundur, volume, AirPlay, PiP, dan mode layar penuh. Integrasi minimal hanya memerlukan beberapa baris kode: membuat instance AVPlayer, meneruskannya ke AVPlayerViewController, dan menampilkan controller di layar.
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()
}
Untuk aplikasi dengan UI kustom, gunakan AVPlayerLayer — lapisan Core Animation yang me-render video di dalam UIView mana pun. Pendekatan ini memberikan kontrol penuh atas antarmuka: Anda dapat menambahkan kontrol, animasi, dan lapisan tambahan di atas video.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Penggunaan:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
Pengelolaan siklus hidup pemutar yang benar sangat penting untuk stabilitas aplikasi. AVPlayer harus dibuat saat layar muncul dan dibebaskan saat ditutup. Saat aplikasi masuk ke latar belakang, disarankan untuk menjeda pemutaran guna menghemat sumber daya dan menghindari sanksi App Review untuk pemutaran latar belakang tanpa kebutuhan yang jelas.
AVPlayerLayer — adalah lapisan Core Animation, turunan dari CALayer, yang menyediakan rendering video di layar. Tidak seperti UIView, AVPlayerLayer bekerja langsung dengan GPU melalui Metal atau OpenGL, memastikan latensi output bingkai minimal. Memahami cara kerja AVPlayerLayer diperlukan untuk mengimplementasikan antarmuka pemutaran kustom.
Properti videoGravity menentukan bagaimana video muat dalam batas lapisan. AVLayerVideoGravity.resizeAspect (mempertahankan rasio aspek dengan bilah hitam) — nilai default untuk AVPlayerViewController. resizeAspectFill (mengisi seluruh layar dengan pemotongan) digunakan untuk mode layar penuh. resize (mendistorsi rasio aspek ke ukuran lapisan) jarang digunakan, terutama untuk aplikasi analitik.
AVPlayerLayer me-render video secara real-time, tetapi semua operasi pemutar (start, pause, seek) harus dilakukan di thread utama. Nilai kunci untuk diamati — timeControlStatus, rate, status, dan error — dilacak melalui KVO (Key-Value Observing) atau API async/await modern, diperkenalkan di iOS 16 melalui metode AVPlayer dengan dukungan 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 mendukung subtitle bawaan dalam format VTT, CEA-608, dan ITT (iTunes Timed Text). Pemilihan track audio dan subtitle dilakukan melalui AVMediaSelectionGroup dan AVMediaSelectionOption. Pengaturan subtitle pengguna (font, ukuran, warna) dibaca dari pengaturan Aksesibilitas sistem dan secara otomatis diterapkan ke AVPlayerLayer, jika tidak ditentukan secara eksplisit dalam kode.
Untuk aplikasi produksi, integrasi dasar AVPlayer seringkali memerlukan konfigurasi tambahan: caching segmen HLS, bekerja dengan FairPlay DRM, integrasi dengan sistem “Now Playing”, dan implementasi algoritma pemilihan bitrate kustom.
AVAssetResourceLoader — satu-satunya cara untuk mencegat pemuatan segmen HLS dan mengimplementasikan caching. Delegat AVAssetResourceLoaderDelegate menerima permintaan pemuatan kunci dan segmen, memungkinkan penyimpanan lokal dan pengembalian dari cache pada permintaan berulang. Ini sangat berguna untuk aplikasi yang beroperasi dalam kondisi jaringan tidak stabil.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) — standar Apple untuk melindungi konten HLS. Untuk integrasi FPS, perlu mengimplementasikan protokol AVContentKeySessionDelegate yang menangani permintaan untuk mendapatkan kunci dekripsi. Prosesnya meliputi: mendapatkan SPC (Server Playback Context) dari pemutar, mengirim ke server lisensi, menerima CKC (Content Key Context) dan mengirimkannya kembali ke AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. Dapatkan SPC dari keyRequest
// 2. Kirim SPC ke server lisensi
// 3. Dapatkan CKC dan teruskan ke keyRequest.processContentKeyResponse
}
}
Untuk menampilkan informasi tentang pemutaran saat ini di Layar Kunci, Pusat Kontrol, dan Apple Watch, digunakan MPNowPlayingInfoCenter dari MediaPlayer.framework. AVPlayer tidak memperbarui Now Playing secara otomatis — pengembang harus secara manual mengatur metadata (judul, artis, sampul, progres) saat status pemutaran berubah. Untuk memperbarui progres, digunakan timer reguler atau observe(\.timeControlStatus).
Remote Command Center — layanan sistem lain yang memungkinkan pengendalian pemutaran dari layar terkunci, AirPods, dan CarPlay. MPRemoteCommandCenter mendaftarkan handler untuk perintah play, pause, nextTrack, previousTrack, changePlaybackPosition, dan skipForward/skipBackward. AVPlayer tidak memproses perintah ini secara otomatis — pengembang harus menghubungkannya dengan panggilan player.play(), player.pause(), dan player.seek().
Pertanyaan yang sering diajukan
AVPlayer — pemutar universal untuk audio dan video dengan dukungan streaming, HLS, DRM, dan sinkronisasi dengan kontrol sistem. AVAudioPlayer — pemutar audio sederhana untuk memutar file audio lokal tanpa dukungan streaming dan akselerasi perangkat keras video. Untuk video dan HLS gunakan AVPlayer, untuk audio sederhana — AVAudioPlayer.
Tidak, AVPlayer tidak mendukung pemuatan langsung konten YouTube, karena YouTube menggunakan pemutar sendiri berbasis DASH dan format kepemilikan. Untuk integrasi YouTube dalam aplikasi iOS, gunakan YouTube IFrame Player API melalui WKWebView atau pustaka resmi youtube-ios-player-helper.
Untuk audio latar belakang, tambahkan Audio, AirPlay and Picture in Picture di Background Modes proyek Xcode Anda. Konfigurasikan AVAudioSession dengan kategori .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer akan melanjutkan pemutaran di latar belakang, dan Layar Kunci serta Pusat Kontrol akan menampilkan kontrol melalui MPNowPlayingInfoCenter.
Layanan ini menggunakan perlindungan DRM dan solusi pemutar sendiri. AVPlayer hanya dapat memutar konten melalui tautan langsung ke file media atau daftar putar HLS. Video dari YouTube dan platform serupa dibungkus dalam iframe atau pemutar JavaScript yang tidak kompatibel dengan AVPlayer. Gunakan SDK resmi mereka atau WebView untuk menampilkan.
Untuk Low-Latency HLS, konfigurasikan AVPlayerItem dengan preferredForwardBufferDuration = 2.0 (detik) dan kelola jeda secara otomatis saat tertinggal dari batas langsung: gunakan player.currentItem?.configuredTimeOffsetFromLive dan player.currentItem?.canPlayReverse. Apple merekomendasikan LL-HLS dengan latensi 2-4 detik dengan konfigurasi yang benar di server dan klien.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga