AVPlayer — مفاهیم کلیدی، قابلیت‌ها و استفاده

نویسنده: IT Sectr منتشر شده: 2026-05-23 زمان مطالعه: 9 دقیقه

AVPlayer یک فریمورک پخش‌کننده رسانه از اپل است که بخشی از AVFoundation بوده و پخش صدا و تصویر را در iOS، macOS، tvOS و visionOS فراهم می‌کند. AVPlayer طیف گسترده‌ای از فرمت‌ها — از فایل‌های MP4 محلی تا استریم‌های تطبیقی HLS — را از طریق یک API واحد با شتاب‌دهی سخت‌افزاری رمزگشایی روی تراشه‌های Apple Silicon پشتیبانی می‌کند. طبق داده‌های Apple WWDC (2024)، AVPlayer در 90% از برنامه‌های iOS که با رسانه کار می‌کنند، از جمله Apple TV، Music و Photos استفاده می‌شود.

نکات اصلی

  • AVPlayer — یک فریمورک پخش‌کننده رسانه اپل از AVFoundation برای تمام پلتفرم‌های اپل است.
  • شتاب‌دهی سخت‌افزاری — AVPlayer از VideoToolbox برای رمزگشایی روی GPU استفاده می‌کند و مصرف انرژی را کاهش می‌دهد.
  • HLS — پشتیبانی بومی از HTTP Live Streaming با تغییر خودکار تطبیقی نرخ بیت.
  • Picture in Picture — پشتیبانی داخلی از حالت «تصویر در تصویر» در iPad، iPhone و Mac.
  • DRM — ادغام با FairPlay Streaming برای محافظت از محتوای پریمیوم.

AVPlayer چیست؟

AVPlayer — مؤلفه مرکزی فریمورک AVFoundation است که مسئول پخش محتوای چندرسانه‌ای در تمام پلتفرم‌های اپل می‌باشد. معرفی شده در iOS 4.0 (2010) به عنوان جایگزینی برای MPMoviePlayerController منسوخ، AVPlayer کنترل سطح پایین بر پخش با امکان تنظیم دقیق پارامترهای رمزگشایی، همگام‌سازی صدا و تصویر و همچنین ادغام با سرویس‌های سیستمی مانند AirPlay و Picture in Picture را فراهم می‌کند.

برخلاف پخش‌کننده‌های شخص ثالث، AVPlayer از مزایای شتاب‌دهی سخت‌افزاری روی تراشه‌های Apple Silicon بهره‌مند می‌شود. رمزگشایی ویدئو از طریق VideoToolbox با استفاده از موتورهای رسانه‌ای اختصاصی سری M (Media Engine) انجام می‌شود که پخش 8K HDR با حداقل مصرف انرژی را فراهم می‌کند. برای HEVC (H.265) و ProRes رمزگشایی روی بلوک‌های تخصصی تراشه و بدون بارگذاری CPU انجام می‌شود.

AVPlayer با اکوسیستم اپل ادغام محکمی دارد: پشتیبانی از Handoff برای انتقال پخش بین دستگاه‌ها، AirPlay 2 برای استریم به Apple TV، صدای فضایی با ردیابی پویای سر و همگام‌سازی با عناصر کنترلی سیستم از طریق MPNowPlayingInfoCenter. این ادغام‌ها AVPlayer را به استاندارد واقعی برای همه برنامه‌هایی که با رسانه روی پلتفرم‌های اپل کار می‌کنند تبدیل می‌کند.

AVFoundation و سلسله‌مراتب کلاس‌ها

فریمورک AVFoundation یک سلسله‌مراتب سه‌سطحی برای پخش فراهم می‌کند: AVAsset (فراداده و اطلاعات درباره محتوا)، AVPlayerItem (وضعیت و مدیریت نمونه خاصی از محتوا) و AVPlayer (مدیریت پخش). این معماری امکان جداسازی بارگذاری فراداده، آماده‌سازی برای پخش و خود فرآیند پخش را فراهم می‌کند که به ویژه برای استریم‌های HLS با گزینه‌های چندگانه نرخ بیت مهم است.

AVAsset مدل محتوای رسانه‌ای — فایل یا استریم — را نشان می‌دهد. AVAsset به خودی خود قابل پخش نیست؛ آن شامل trackها (AVAssetTrack)، فراداده (commonMetadata)، اطلاعات مدت‌زمان و سایر ویژگی‌ها. از AVAsset یک AVPlayerItem ساخته می‌شود که می‌تواند برای پخش به AVPlayer ارسال شود.

قابلیت‌های اصلی AVPlayer

AVPlayer مجموعه‌ای از قابلیت‌ها را ارائه می‌دهد که بیشتر سناریوهای پخش — از پخش ساده فایل تا پخش زنده پیچیده با DRM — را پوشش می‌دهد. بیایید ویژگی‌های کلیدی را با مثال‌های کاربرد آنها بررسی کنیم.

قابلیتتوضیحاتپلتفرم‌ها
فایل‌های محلیMP4, MOV, M4V, AVI, MKV (از طریق افزونه‌ها)iOS, macOS, tvOS
HLSHTTP Live Streaming با ABR تطبیقیهمه پلتفرم‌های اپل
FairPlay DRMمحتوای HLS محافظت‌شده با مجوز استریمiOS, tvOS, macOS
Picture in Pictureپنجره ویدئوی شناور روی سایر برنامه‌هاiPad, iPhone (iOS 14+), Mac
AirPlay 2انتقال بی‌سیم به Apple TV و بلندگوهاهمه پلتفرم‌ها
صدای فضاییDolby Atmos و ردیابی پویاiOS 15+, macOS 13+
HDRDolby Vision, HDR10, HLG با پشتیبانی نمایشگرiOS 11+, macOS 10.13+

پشتیبانی HLS و تغییر تطبیقی

AVPlayer پشتیبانی بومی از HLS بدون نیاز به نصب کتابخانه‌های اضافی دارد. هنگام پخش استریم HLS، AVPlayer به طور خودکار تغییر تطبیقی نرخ بیت را با استفاده از الگوریتم داخلی ABR بهینه‌شده برای پلتفرم‌های اپل مدیریت می‌کند. الگوریتم نه تنها پهنای باند شبکه، بلکه وضعیت حرارتی دستگاه را نیز در نظر می‌گیرد — در صورت داغ شدن بیش از حد، AVPlayer ممکن است نرخ بیت را کاهش دهد تا بار پردازنده را کم کند.

برای استریم‌های HLS با FairPlay Streaming، AVPlayer به طور خودکار دریافت و تمدید مجوزها را از طریق نماینده AVContentKeySession مدیریت می‌کند. توسعه‌دهنده باید پروتکل AVContentKeySessionDelegate را پیاده‌سازی کند که در صورت نیاز به دریافت یا تمدید کلید رمزگشایی توسط پخش‌کننده فراخوانی می‌شود. این تنها راه محافظت از محتوای HLS در پلتفرم‌های اپل است، زیرا Widevine در iOS پشتیبانی نمی‌شود.

Picture in Picture

PiP — حالتی که به کاربر امکان می‌دهد هنگام جابجایی بین برنامه‌ها به تماشای ویدئو در یک پنجره شناور ادامه دهد. در iPad و iPhone (iOS 14+) AVPlayer برای فعال‌سازی این حالت با AVPictureInPictureController ادغام می‌شود. در macOS 15+ PiP نیز در دسترس است، اما از طریق منوی سیستم یا دکمه در پنجره پخش‌کننده فعال می‌شود.

چگونه از AVPlayer در برنامه iOS استفاده کنیم

ادغام AVPlayer در برنامه iOS می‌تواند به دو روش انجام شود: از طریق AVPlayerViewController سطح بالا (برای سناریوهای معمولی) یا مستقیماً از طریق AVPlayer + AVPlayerLayer (برای سفارشی‌سازی کامل رابط). بیایید هر دو رویکرد را در Swift بررسی کنیم.

ادغام از طریق AVPlayerViewController

AVPlayerViewController — یک مؤلفه UI آماده است که عناصر کنترلی داخلی: play/pause، عقب‌رفت، صدا، AirPlay، PiP و حالت تمام‌صفحه را فراهم می‌کند. ادغام حداقلی تنها به چند خط کد نیاز دارد: ایجاد یک نمونه AVPlayer، ارسال آن به AVPlayerViewController و نمایش کنترلر روی صفحه.

swift
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()
}

ادغام مستقیم از طریق AVPlayerLayer

برای برنامه‌های با UI سفارشی از AVPlayerLayer — یک لایه Core Animation که ویدئو را درون هر UIView رندر می‌کند — استفاده کنید. این رویکرد کنترل کامل روی رابط را می‌دهد: می‌توانید عناصر کنترلی، انیمیشن‌ها و لایه‌های اضافی خود را روی ویدئو اضافه کنید.

swift
class VideoPlayerView: UIView {

    var player: AVPlayer? {
        get { (layer as! AVPlayerLayer).player }
        set { (layer as! AVPlayerLayer).player = newValue }
    }

    override class var layerClass: AnyClass {
        AVPlayerLayer.self
    }
}

// استفاده:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)

مدیریت چرخه حیات AVPlayer

مدیریت صحیح چرخه حیات پخش‌کننده برای پایداری برنامه حیاتی است. AVPlayer باید هنگام ظاهر شدن صفحه ایجاد و هنگام بسته شدن آن آزاد شود. هنگام رفتن برنامه به پس‌زمینه، توصیه می‌شود برای صرفه‌جویی در منابع و جلوگیری از جریمه‌های App Review برای پخش پس‌زمینه بدون نیاز آشکار، پخش را متوقف کنید.

AVPlayerLayer و نمایش ویدئو

AVPlayerLayer — یک لایه Core Animation است که از CALayer ارث‌بری می‌کند و رندر ویدئو را روی صفحه فراهم می‌کند. برخلاف UIView، AVPlayerLayer مستقیماً با GPU از طریق Metal یا OpenGL کار می‌کند و حداقل تأخیر خروجی فریم را تضمین می‌کند. درک نحوه کار AVPlayerLayer برای پیاده‌سازی رابط‌های پخش سفارشی ضروری است.

پیکربندی videoGravity

ویژگی videoGravity نحوه قرارگیری ویدئو در مرزهای لایه را تعیین می‌کند. AVLayerVideoGravity.resizeAspect (حفظ نسبت با نوارهای سیاه) — مقدار پیش‌فرض برای AVPlayerViewController. resizeAspectFill (پر کردن تمام صفحه با برش) برای حالت تمام‌صفحه استفاده می‌شود. resize (تحریف نسبت به اندازه لایه) به ندرت، عمدتاً برای برنامه‌های تحلیلی استفاده می‌شود.

همگام‌سازی با نخ اصلی

AVPlayerLayer ویدئو را در زمان واقعی رندر می‌کند، اما تمام عملیات روی پخش‌کننده (start, pause, seek) باید روی نخ اصلی انجام شود. مقادیر کلیدی برای مشاهده — timeControlStatus, rate, status و error — از طریق KVO (Key-Value Observing) یا API مدرن async/await که در iOS 16 از طریق متدهای AVPlayer با پشتیبانی Swift Concurrency معرفی شده ردیابی می‌شوند.

swift
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
    }
}

پشتیبانی از زیرنویس و trackهای جایگزین

AVPlayer از زیرنویس‌های داخلی در فرمت‌های VTT، CEA-608 و ITT (iTunes Timed Text) پشتیبانی می‌کند. انتخاب track صوتی و زیرنویس از طریق AVMediaSelectionGroup و AVMediaSelectionOption انجام می‌شود. تنظیمات زیرنویس کاربر (فونت، اندازه، رنگ) از تنظیمات دسترسی سیستم خوانده می‌شود و اگر در کد صریحاً مشخص نشده باشد، به طور خودکار روی AVPlayerLayer اعمال می‌شود.

مدیریت پخش و سناریوهای پیشرفته

برای برنامه‌های تولیدی، ادغام پایه AVPlayer اغلب به پیکربندی اضافی نیاز دارد: ذخیره‌سازی قطعات HLS در حافظه پنهان، کار با FairPlay DRM، ادغام با سیستم «Now Playing» و پیاده‌سازی الگوریتم‌های سفارشی انتخاب نرخ بیت.

ذخیره‌سازی HLS از طریق AVAssetResourceLoader

AVAssetResourceLoader — تنها راه رهگیری بارگیری قطعات HLS و پیاده‌سازی ذخیره‌سازی در حافظه پنهان است. نماینده AVAssetResourceLoaderDelegate درخواست‌های بارگیری کلیدها و قطعات را دریافت می‌کند و امکان ذخیره محلی آنها و بازگرداندن از حافظه پنهان در درخواست‌های بعدی را فراهم می‌کند. این به ویژه برای برنامه‌هایی که در شرایط شبکه ناپایدار کار می‌کنند مفید است.

swift
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
    resourceLoaderDelegate,
    queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)

FairPlay Streaming — ادغام DRM

FairPlay Streaming (FPS) — استاندارد اپل برای محافظت از محتوای HLS است. برای ادغام FPS باید پروتکل AVContentKeySessionDelegate را پیاده‌سازی کرد که درخواست‌های دریافت کلیدهای رمزگشایی را پردازش می‌کند. فرآیند شامل: دریافت SPC (Server Playback Context) از پخش‌کننده، ارسال به سرور مجوز، دریافت CKC (Content Key Context) و ارسال آن به AVContentKeySession است.

swift
class DRMDelegate: NSObject, AVContentKeySessionDelegate {

    func contentKeySession(
        _ session: AVContentKeySession,
        didProvide keyRequest: AVContentKeyRequest
    ) {
        // 1. دریافت SPC از keyRequest
        // 2. ارسال SPC به سرور مجوز
        // 3. دریافت CKC و ارسال به keyRequest.processContentKeyResponse
    }
}

Now Playing و عناصر کنترلی سیستم

برای نمایش اطلاعات درباره پخش فعلی روی صفحه قفل، Control Center و Apple Watch از MPNowPlayingInfoCenter از MediaPlayer.framework استفاده می‌شود. AVPlayer به طور خودکار Now Playing را به‌روزرسانی نمی‌کند — توسعه‌دهنده باید به صورت دستی فراداده (عنوان، اجراکننده، جلد، پیشرفت) را هنگام تغییر وضعیت پخش تنظیم کند. برای به‌روزرسانی پیشرفت از تایمر منظم یا observe(\.timeControlStatus) استفاده می‌شود.

Remote Command Center — سرویس سیستمی دیگری است که امکان کنترل پخش از صفحه قفل، AirPods و CarPlay را فراهم می‌کند. MPRemoteCommandCenter کنترل‌کننده‌هایی برای دستورات play, pause, nextTrack, previousTrack, changePlaybackPosition و skipForward/skipBackward ثبت می‌کند. AVPlayer این دستورات را به طور خودکار پردازش نمی‌کند — توسعه‌دهنده باید آنها را با فراخوانی‌های player.play(), player.pause() و player.seek() مرتبط کند.

سوالات متداول

AVPlayer چه تفاوتی با AVAudioPlayer دارد؟

AVPlayer — یک پخش‌کننده جهانی برای صدا و تصویر با پشتیبانی از استریمینگ، HLS، DRM و همگام‌سازی با عناصر کنترلی سیستم است. AVAudioPlayer — یک پخش‌کننده صوتی ساده برای پخش فایل‌های صوتی محلی بدون پشتیبانی از استریمینگ و شتاب‌دهی سخت‌افزاری ویدئو. برای ویدئو و HLS از AVPlayer، برای صوتی ساده از AVAudioPlayer استفاده کنید.

آیا AVPlayer از پخش YouTube پشتیبانی می‌کند؟

خیر، AVPlayer از بارگیری مستقیم محتوای YouTube پشتیبانی نمی‌کند، زیرا YouTube از پخش‌کننده اختصاصی خود مبتنی بر DASH و فرمت‌های اختصاصی استفاده می‌کند. برای ادغام YouTube در برنامه iOS از YouTube IFrame Player API از طریق WKWebView یا کتابخانه رسمی youtube-ios-player-helper استفاده کنید.

چگونه پخش پس‌زمینه صدا را با AVPlayer پیاده‌سازی کنیم؟

برای صدای پس‌زمینه، Audio, AirPlay and Picture in Picture را در Background Modes پروژه Xcode خود اضافه کنید. AVAudioSession را با دسته .playback پیکربندی کنید: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer به پخش در پس‌زمینه ادامه می‌دهد و صفحه قفل و Control Center عناصر کنترلی را از طریق MPNowPlayingInfoCenter نمایش می‌دهند.

چرا AVPlayer ویدئو را از YouTube، Vimeo یا Twitter پخش نمی‌کند؟

این سرویس‌ها از محافظت DRM و راه‌حل‌های پخش‌کننده اختصاصی استفاده می‌کنند. AVPlayer می‌تواند محتوا را فقط از طریق لینک مستقیم به فایل رسانه‌ای یا پلی‌لیست HLS پخش کند. ویدئوهای YouTube و پلتفرم‌های مشابه در iframe یا پخش‌کننده JavaScript پیچیده شده‌اند که با AVPlayer ناسازگار است. برای نمایش از SDKهای رسمی آنها یا WebView استفاده کنید.

چگونه تأخیر در پخش زنده از طریق AVPlayer را کاهش دهیم؟

برای Low-Latency HLS، AVPlayerItem را با preferredForwardBufferDuration = 2.0 (ثانیه) پیکربندی کنید و به طور خودکار مکث را هنگام عقب‌ماندن از مرز زنده مدیریت کنید: از player.currentItem?.configuredTimeOffsetFromLive و player.currentItem?.canPlayReverse استفاده کنید. اپل LL-HLS با تأخیر 2-4 ثانیه با پیکربندی صحیح در سرور و کلاینت توصیه می‌کند.

خلاصه

  • AVPlayer — پخش‌کننده رسانه جهانی اپل با شتاب‌دهی سخت‌افزاری روی Apple Silicon برای iOS، macOS، tvOS و visionOS.
  • HLS — پشتیبانی بومی با تغییر تطبیقی خودکار نرخ بیت بدون کتابخانه‌های اضافی.
  • FairPlay Streaming — تنها سیستم DRM برای HLS محافظت‌شده در پلتفرم‌های اپل.
  • ادغام — AVPlayerViewController برای شروع سریع یا AVPlayerLayer برای UI سفارشی.
  • ذخیره‌سازی HLS از طریق AVAssetResourceLoaderDelegate با رهگیری درخواست‌های قطعات پیاده‌سازی می‌شود.
  • Now Playing — به‌روزرسانی دستی فراداده برای Control Center و صفحه قفل از طریق MPNowPlayingInfoCenter.
  • توصیه می‌شود استفاده از AVPlayer برای تمام پروژه‌های رسانه‌ای روی پلتفرم‌های اپل با نیازهای HLS.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید