AVPlayerViewController adalah kontroler pemutar video bawaan di ekosistem Apple, dirancang untuk memutar konten media di iOS dan tvOS. Ini menyediakan antarmuka layar penuh dengan kontrol, dukungan subtitle, dan AirPlay tanpa perlu menulis UI khusus. Menurut Apple Developer Documentation, 2026, AVPlayerViewController terintegrasi dalam beberapa baris kode dan mendukung HLS, MP4, dan sebagian besar format media.
Poin utama
AVPlayerViewController adalah komponen dari framework AVKit yang menyediakan antarmuka siap pakai untuk memutar video di aplikasi Apple. Ini membebaskan pengembang dari kebutuhan membuat pemutar khusus dari awal, menawarkan kontrol standar: putar/jeda, mundur, pengaturan volume, dan mode layar penuh.
Tidak seperti AVPlayerLayer tingkat rendah yang memerlukan pembuatan UI manual, AVPlayerViewController sepenuhnya mengelola siklus hidup pemutar. Kontroler secara otomatis menangani rotasi layar, beradaptasi dengan Safe Area di iPhone berponi, dan mendukung multitasking di iPad.
Menurut Apple Documentation (2026), AVPlayerViewController kompatibel dengan AVPlayer dan AVQueuePlayer, memungkinkan pemutaran file tunggal maupun daftar putar. URL dari penyimpanan lokal, streaming jaringan HLS, dan konten FairPlay terenkripsi didukung.
Komponen ini muncul di iOS 8 bersama AVKit sebagai pengganti MPMoviePlayerController yang sudah usang. Di iOS 11 ditambahkan dukungan Picture in Picture dan tampilan subtitle. Di iOS 14 kontroler mendapat bilah kontrol yang dapat disesuaikan melalui delegat AVPlayerViewControllerDelegate. Mulai iOS 16, muncul dukungan untuk penggantian file media secara dinamis tanpa membuat ulang pemutar.
AVPlayerViewController modern dioptimalkan untuk layar ProMotion — kecepatan bingkai video secara otomatis disinkronkan dengan kecepatan penyegaran layar. Di tvOS komponen beradaptasi dengan antarmuka fokus Siri Remote, dan di macOS dengan mode jendela QuickTime Player.
Inti dari kontroler adalah hubungan antara AVPlayer dan AVPlayerItem. AVPlayer adalah objek pemutaran yang mengelola garis waktu, kecepatan, dan status. AVPlayerItem adalah pembungkus di sekitar file media tertentu yang berisi metadata, trek, dan informasi pemuatan.
Saat inisialisasi, AVPlayerViewController menerima referensi ke AVPlayer dan secara otomatis membuat AVPlayerLayer untuk menampilkan video. Kontroler berlangganan notifikasi KVO AVPlayer tentang perubahan status readyToPlay, kesalahan pemuatan, dan akhir pemutaran.
Kontrol (bilah transport) ditampilkan dengan mengetuk layar. Di iOS 15+ mereka mendukung kustomisasi melalui AVPlayerViewControllerCustomizationDelegate, memungkinkan menyembunyikan atau mengganti tombol standar.
Setelah kontroler dibuat dan AVPlayer ditetapkan, metode viewDidLoad dipanggil yang memulai persiapan streaming video. Ketika AVPlayerItem memasuki status AVPlayerItemStatusReadyToPlay, pemutar siap menampilkan bingkai. Saat metode play() dipanggil, decoding streaming video melalui Video Toolbox dimulai.
Saat meninggalkan layar, kontroler secara otomatis menjeda pemutaran dan membebaskan sumber daya decoder. Di iOS 13+ untuk mempertahankan pemutaran saat aplikasi diminimalkan, diperlukan konfigurasi Background Modes dan Audio Session. Menurut WWDC 2024, disarankan menggunakan AVPlayerPlaybackCoordinator untuk sinkronisasi dengan pusat media iOS.
Komponen ini menyediakan rangkaian fitur yang kaya langsung jadi, membuatnya menarik untuk sebagian besar proyek. Berikut adalah kemampuan utama yang tidak memerlukan kode tambahan.
Bilah transport adalah bagian bawah antarmuka yang berisi tombol kontrol utama. Secara default, bilah disembunyikan setelah 3 detik tidak ada aktivitas pengguna dan muncul saat disentuh. Di iOS 16+ melalui delegat, visibilitas elemen individual dapat dikelola.
Dalam mode debug, bilah transport dapat dipaksa tampil melalui properti AVPlayerViewController.requiresLinearPlayback, yang juga memblokir kemampuan untuk menjeda video. Ini berguna untuk sisipan iklan dan konten pendidikan.
Integrasi dasar kontroler tidak memakan lebih dari 10 baris kode. Pertama, perlu membuat instance AVPlayer dengan URL file media, kemudian meneruskannya ke AVPlayerViewController dan menampilkan kontroler di layar.
import AVKit
let player = AVPlayer(url: URL(string: "https://example.com/video.mp4")!)
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true) {
player.play()
}
Setelah memanggil present, kontroler ditampilkan di seluruh layar. Video mulai dimuat dari jaringan dan segera setelah buffer mencapai ambang readyToPlay, pemutaran otomatis dimulai setelah memanggil play().
let asset = AVAsset(url: videoURL)
let item = AVPlayerItem(asset: asset)
let metadata = AVMutableMetadataItem()
metadata.key = AVMetadataKey.commonKeyTitle
metadata.value = "Video saya"
item.addMetadata(metadata)
let player = AVPlayer(playerItem: item)
let playerVC = AVPlayerViewController()
playerVC.player = player
Penggunaan AVPlayerItem memberikan kontrol atas metadata, kode waktu, pemilihan trek audio, dan subtitle. Melalui AVPlayerItem juga dapat memantau kemajuan pemuatan, buffering, dan kesalahan jaringan dengan KVO pada properti status.
Mulai iOS 11, pengembang dapat menyesuaikan bilah transport melalui protokol AVPlayerViewControllerDelegate. Metode playerViewController(_:willBeginFullScreenPresentationWithAnimationCoordinator:) dipanggil sebelum memasuki mode layar penuh dan memungkinkan persiapan UI.
Untuk menyembunyikan tombol individual, digunakan properti AVPlayerViewController.showsPlaybackControls. Jika disetel ke false, bilah transport hilang sepenuhnya, hanya menyisakan streaming video. Berguna untuk elemen overlay khusus.
class CustomPlayerViewController: UIViewController {
private let playerVC = AVPlayerViewController()
override func viewDidLoad() {
super.viewDidLoad()
playerVC.delegate = self
playerVC.showsPlaybackControls = true
playerVC.entersFullScreenWhenPlaybackBegins = true
}
}
extension CustomPlayerViewController: AVPlayerViewControllerDelegate {
func playerViewController(
_ playerViewController: AVPlayerViewController,
willBeginFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator
) {
// Tambahkan tombol overlay
}
func playerViewController(
_ playerViewController: AVPlayerViewController,
didUpdate legibleMediaSelection: AVMediaSelectionGroup
) {
print("Bahasa subtitle baru dipilih")
}
}
Delegat memungkinkan mencegat event perubahan subtitle, masuk dan keluar dari mode layar penuh, serta mulai dan berakhirnya Picture in Picture. Di WWDC 2024, Apple merekomendasikan menggunakan delegat untuk analitik — mencatat setiap transisi hingga 100 ms.
AVPlayerViewController secara otomatis menampilkan semua subtitle dan trek audio yang tersedia, jika tertanam dalam file media atau ditentukan dalam manifes HLS. Pengguna dapat menggantinya melalui menu yang muncul saat mengetuk ikon subtitle di bilah transport.
Untuk streaming HLS, manifes M3U8 berisi daftar varian bahasa yang tersedia. AVPlayer memuat segmen subtitle yang sesuai dalam format WebVTT dan meneruskannya untuk rendering melalui AVPlayerLayer. Di iOS 16+ muncul dukungan untuk styling subtitle melalui AVTextStyleRule.
func selectAudioTrack(languageCode: String) {
guard let group = player.currentItem?
.asset.mediaSelectionGroup(forMediaCharacteristic: AVMediaCharacteristic.audible)
else { return }
for option in group.options {
if option.extendedLanguageTag?.hasPrefix(languageCode) == true {
player.currentItem?.select(option, in: group)
}
}
}
Metode selectAudioTrack mencari di antara opsi audio grup audiable varian yang extendedLanguageTag-nya cocok dengan kode bahasa yang diinginkan. Ini memungkinkan implementasi fitur “Audio asli” di aplikasi dengan konten multibahasa.
Mode Picture in Picture (PiP) memungkinkan menampilkan video di jendela mengambang di atas aplikasi lain. Di iPad, fitur ini tersedia sejak iOS 9, di iPhone sejak iOS 14. AVPlayerViewController secara otomatis menambahkan tombol PiP ke bilah transport saat ada langganan UIBackgroundModes.
Untuk mengaktifkan PiP, di Info.plist perlu menambahkan kunci UIBackgroundModes dengan nilai audio dan airplay. Setelah itu, tombol PiP muncul di kontroler, saat ditekan video mengecil ke jendela mengambang berukuran 192x108 titik.
Event PiP diproses melalui delegat: playerViewController(_:willStartPictureInPictureFromFullScreen:) dan playerViewController(_:didStopPictureInPicture:). Menurut Apple HIG, ukuran minimum jendela PiP harus setidaknya 120x68 titik untuk menjaga keterbacaan konten.
Pertanyaan yang sering diajukan
Tidak, untuk video YouTube diperlukan penggunaan web-view WKWebView atau pustaka YouTube iOS Helper, karena YouTube menggunakan sistem DRM sendiri. AVPlayerViewController ditujukan untuk streaming media langsung melalui URL.
Setel properti showsPlaybackControls ke false. Setelah itu layar tetap kosong — hanya streaming video. Untuk mengembalikan tombol khusus, tambahkan overlay melalui addSubview di atas kontroler.
Ya, kontroler sepenuhnya mendukung HLS Live. Di bilah transport, indikator Live ditampilkan sebagai pengganti penggeser kemajuan. Penundaan tergantung pada konfigurasi HLS — minimal 6 detik pada pengaturan low-latency.
Berlanggananlah ke KVO properti AVPlayerItem.status. Saat terjadi kesalahan, status berubah menjadi .failed. Dapatkan detail melalui properti error di AVPlayerItem dan tampilkan alert dengan penjelasan kepada pengguna — sering kali masalahnya ada di jaringan atau URL yang salah.
Ya, gunakan AVAsset dengan AVAssetResourceLoader khusus untuk menyediakan data dari RAM. Implementasikan delegat AVAssetResourceLoaderDelegate dan kembalikan byte dari buffer, bukan membaca dari disk.
Kesimpulan
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