AVPlayerViewController یک کنترلر پخشکننده ویدیوی داخلی در اکوسیستم Apple است که برای پخش محتوای رسانهای در iOS و tvOS طراحی شده است. این کنترلر یک رابط تمامصفحه با عناصر کنترل، پشتیبانی از زیرنویس و AirPlay بدون نیاز به نوشتن UI سفارشی فراهم میکند. بر اساس Apple Developer Documentation, 2026، AVPlayerViewController با چند خط کد یکپارچه میشود و از HLS، MP4 و اکثر فرمتهای رسانهای پشتیبانی میکند.
نکات اصلی
AVPlayerViewController یک کامپوننت از فریمورک AVKit است که یک رابط آماده برای پخش ویدیو در برنامههای Apple فراهم میکند. این کامپوننت توسعهدهنده را از نیاز به ایجاد یک پخشکننده سفارشی از صفر بینیاز میکند و عناصر کنترل استاندارد را ارائه میدهد: پخش/مکث، عقبکشیدن، تنظیم صدا و حالت تمامصفحه.
برخلاف AVPlayerLayer سطح پایین که نیاز به ساخت دستی UI دارد، AVPlayerViewController به طور کامل چرخه حیات پخشکننده را مدیریت میکند. کنترلر به طور خودکار چرخش صفحه را پردازش میکند، با Safe Area در iPhone دارای ناچ تطبیق مییابد و از چندوظیفهای در iPad پشتیبانی میکند.
بر اساس Apple Documentation (2026)، AVPlayerViewController با AVPlayer و AVQueuePlayer سازگار است و امکان پخش هم فایلهای تکی و هم لیستهای پخش را فراهم میکند. URLهای ذخیرهسازی محلی، جریانهای شبکه HLS و محتوای رمزگذاریشده FairPlay پشتیبانی میشوند.
این کامپوننت در iOS 8 همراه با AVKit به عنوان جایگزینی برای MPMoviePlayerController منسوخ ظاهر شد. در iOS 11 پشتیبانی از Picture in Picture و نمایش زیرنویسها اضافه شد. در iOS 14 کنترلر یک نوار کنترل قابل شخصیسازی از طریق دلیگیت AVPlayerViewControllerDelegate دریافت کرد. از iOS 16، پشتیبانی از جایگزینی دینامیک فایل رسانه بدون بازسازی پخشکننده فراهم شد.
AVPlayerViewController مدرن برای نمایشگرهای ProMotion بهینه شده است — نرخ فریم ویدیو به طور خودکار با نرخ تازهسازی صفحه همگام میشود. در tvOS کامپوننت با رابط فوکوس Siri Remote و در macOS با حالت پنجرهای QuickTime Player تطبیق مییابد.
در قلب کنترلر، پیوند AVPlayer و AVPlayerItem قرار دارد. AVPlayer یک شیء پخش است که خط زمانی، سرعت و وضعیت را مدیریت میکند. AVPlayerItem یک پوشش بر روی فایل رسانه مشخص است که شامل فرادادهها، ترکها و اطلاعات بارگذاری است.
در زمان مقداردهی اولیه، AVPlayerViewController یک ارجاع به AVPlayer دریافت میکند و به طور خودکار AVPlayerLayer را برای نمایش ویدیو ایجاد میکند. کنترلر در اعلانهای KVO AVPlayer درباره تغییر وضعیت readyToPlay، خطاهای بارگذاری و پایان پخش مشترک میشود.
عناصر کنترل (نوار حملونقل) با ضربه زدن روی صفحه نمایش داده میشوند. در iOS 15+ آنها از سفارشیسازی از طریق AVPlayerViewControllerCustomizationDelegate پشتیبانی میکنند و امکان مخفی کردن یا جایگزینی دکمههای استاندارد را میدهند.
پس از ایجاد کنترلر و اختصاص AVPlayer، متد viewDidLoad فراخوانی میشود که آمادهسازی جریان ویدیو را آغاز میکند. وقتی AVPlayerItem به وضعیت AVPlayerItemStatusReadyToPlay میرود، پخشکننده برای نمایش فریمها آماده است. با فراخوانی متد play()، رمزگشایی جریان ویدیو از طریق Video Toolbox آغاز میشود.
هنگام خروج از صفحه، کنترلر به طور خودکار پخش را متوقف میکند و منابع رمزگشا را آزاد میکند. در iOS 13+ برای حفظ پخش هنگام کوچکسازی برنامه، پیکربندی Background Modes و Audio Session مورد نیاز است. به گفته WWDC 2024، توصیه میشود از AVPlayerPlaybackCoordinator برای همگامسازی با مرکز رسانه iOS استفاده کنید.
این کامپوننت مجموعه غنی از قابلیتها را به صورت آماده فراهم میکند که آن را برای اکثر پروژهها جذاب میسازد. در زیر قابلیتهای کلیدی که به کد اضافی نیاز ندارند آورده شده است.
نوار حملونقل بخش پایینی رابط است که دکمههای اصلی کنترل را شامل میشود. به طور پیشفرض، نوار پس از ۳ ثانیه عدم فعالیت کاربر مخفی میشود و با ضربه ظاهر میشود. در iOS 16+ از طریق دلیگیت میتوان visibility عناصر جداگانه را مدیریت کرد.
در حالت اشکالزدایی، نوار حملونقل را میتوان از طریق ویژگی AVPlayerViewController.requiresLinearPlayback به طور اجباری نمایش داد که همچنین امکان مکث ویدیو را مسدود میکند. این برای درج تبلیغات و محتوای آموزشی مفید است.
یکپارچهسازی پایه کنترلر بیش از ۱۰ خط کد نمیگیرد. ابتدا باید یک نمونه AVPlayer با URL فایل رسانه ایجاد کنید، سپس آن را به AVPlayerViewController منتقل کنید و کنترلر را روی صفحه نمایش دهید.
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()
}
پس از فراخوانی present، کنترلر در تمامصفحه نمایش داده میشود. ویدیو شروع به بارگذاری از شبکه میکند و به محض اینکه بافر به آستانه readyToPlay رسید، پس از فراخوانی play() به طور خودکار پخش آغاز میشود.
let asset = AVAsset(url: videoURL)
let item = AVPlayerItem(asset: asset)
let metadata = AVMutableMetadataItem()
metadata.key = AVMetadataKey.commonKeyTitle
metadata.value = "ویدیوی من"
item.addMetadata(metadata)
let player = AVPlayer(playerItem: item)
let playerVC = AVPlayerViewController()
playerVC.player = player
استفاده از AVPlayerItem کنترل بر فرادادهها، کدهای زمانی، انتخاب ترکهای صوتی و زیرنویسها را فراهم میکند. از طریق AVPlayerItem میتوان پیشرفت بارگذاری، بافر کردن و خطاهای شبکه را با KVO روی ویژگی status مشاهده کرد.
از iOS 11، توسعهدهنده میتواند نوار حملونقل را از طریق پروتکل AVPlayerViewControllerDelegate سفارشی کند. متد playerViewController(_:willBeginFullScreenPresentationWithAnimationCoordinator:) قبل از ورود به حالت تمامصفحه فراخوانی میشود و امکان آمادهسازی UI را فراهم میکند.
برای مخفی کردن دکمههای جداگانه از ویژگی AVPlayerViewController.showsPlaybackControls استفاده میشود. اگر آن را روی false تنظیم کنید، نوار حملونقل کاملاً ناپدید میشود و فقط جریان ویدیو باقی میماند. برای عناصر overlay سفارشی مفید است.
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
) {
// دکمه overlay اضافه کن
}
func playerViewController(
_ playerViewController: AVPlayerViewController,
didUpdate legibleMediaSelection: AVMediaSelectionGroup
) {
print("زبان زیرنویس جدید انتخاب شد")
}
}
دلیگیت امکان رهگیری رویدادهای تغییر زیرنویس، ورود و خروج از حالت تمامصفحه و همچنین شروع و پایان Picture in Picture را فراهم میکند. در WWDC 2024، Apple استفاده از دلیگیت را برای تحلیل توصیه کرد — ثبت هر انتقال تا ۱۰۰ میلیثانیه.
AVPlayerViewController به طور خودکار تمام زیرنویسهای موجود و ترکهای صوتی را که در فایل رسانه جاسازی شده یا در مانیفست HLS مشخص شدهاند نمایش میدهد. کاربر میتواند آنها را از طریق منویی که با ضربه روی آیکون زیرنویس در نوار حملونقل ظاهر میشود تغییر دهد.
برای جریانهای HLS، مانیفست M3U8 شامل فهرست گزینههای زبانی موجود است. AVPlayer بخشهای زیرنویس مربوطه را در قالب WebVTT بارگذاری میکند و آنها را برای رندر از طریق AVPlayerLayer منتقل میکند. در iOS 16+ پشتیبانی از سبکدهی زیرنویس از طریق 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)
}
}
}
متد selectAudioTrack در میان گزینههای صوتی گروه audiable به دنبال گزینهای میگردد که extendedLanguageTag آن با کد زبان مورد نظر مطابقت دارد. این امکان پیادهسازی قابلیت «صداگذاری اصلی» را در برنامههای با محتوای چندزبانه فراهم میکند.
حالت Picture in Picture (PiP) امکان نمایش ویدیو در یک پنجره شناور روی سایر برنامهها را فراهم میکند. در iPad این قابلیت از iOS 9 و در iPhone از iOS 14 در دسترس است. AVPlayerViewController با اشتراک UIBackgroundModes به طور خودکار دکمه PiP را به نوار حملونقل اضافه میکند.
برای فعالسازی PiP باید در Info.plist کلید UIBackgroundModes با مقدار audio و airplay اضافه شود. پس از آن، دکمه PiP در کنترلر ظاهر میشود که با فشار دادن آن، ویدیو به یک پنجره شناور به اندازه 192x108 نقطه جمع میشود.
رویدادهای PiP از طریق دلیگیت پردازش میشوند: playerViewController(_:willStartPictureInPictureFromFullScreen:) و playerViewController(_:didStopPictureInPicture:). بر اساس Apple HIG، حداقل اندازه پنجره PiP باید حداقل 120x68 نقطه برای حفظ خوانایی محتوا باشد.
سوالات متداول
خیر، برای ویدیوهای YouTube استفاده از web-view WKWebView یا کتابخانه YouTube iOS Helper مورد نیاز است، زیرا YouTube از سیستم DRM خود استفاده میکند. AVPlayerViewController برای جریانهای مستقیم رسانه از طریق URL طراحی شده است.
ویژگی showsPlaybackControls را روی false تنظیم کنید. پس از آن صفحه خالی میماند — فقط جریان ویدیو. برای بازگرداندن دکمههای سفارشی، از طریق addSubview یک overlay روی کنترلر اضافه کنید.
بله، کنترلر به طور کامل از HLS Live پشتیبانی میکند. در نوار حملونقل به جای لغزنده پیشرفت، نشانگر Live نمایش داده میشود. تأخیر به پیکربندی HLS بستگی دارد — حداقل ۶ ثانیه در تنظیمات low-latency.
در KVO ویژگی AVPlayerItem.status مشترک شوید. در صورت خطا، وضعیت به .failed تغییر میکند. جزئیات را از طریق ویژگی error در AVPlayerItem دریافت کنید و یک alert با توضیح به کاربر نشان دهید — معمولاً مشکل در شبکه یا URL نامعتبر است.
بله، از AVAsset با AVAssetResourceLoader سفارشی برای تأمین داده از RAM استفاده کنید. دلیگیت AVAssetResourceLoaderDelegate را پیادهسازی کرده و به جای خواندن از دیسک، بایتها را از بافر برگردانید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید