AVPlayer هو إطار عمل مشغل وسائط من Apple، جزء من AVFoundation، يوفر تشغيل الصوت والفيديو على iOS وmacOS وtvOS وvisionOS. يدعم AVPlayer مجموعة واسعة من التنسيقات — من ملفات MP4 المحلية إلى تدفقات HLS التكيفية — عبر واجهة برمجة تطبيقات موحدة مع تسريع فك التشفير بالأجهزة على رقائق Apple Silicon. وفقًا لـ Apple WWDC (2024)، يُستخدم AVPlayer في 90% من تطبيقات iOS التي تعمل مع الوسائط، بما في ذلك Apple TV وMusic وPhotos.
الملامح الرئيسية
AVPlayer هو المكون المركزي لإطار عمل AVFoundation، المسؤول عن تشغيل الوسائط المتعددة على جميع منصات Apple. تم تقديمه في iOS 4.0 (2010) كبديل لـ MPMoviePlayerController القديم، يوفر AVPlayer تحكمًا منخفض المستوى في التشغيل مع ضبط دقيق لمعلمات فك التشفير، ومزامنة الصوت والفيديو، والتكامل مع خدمات النظام مثل AirPlay وPicture in Picture.
على عكس مشغلات الطرف الثالث، يستفيد AVPlayer من تسريع الأجهزة على رقائق Apple Silicon. يتم فك تشفير الفيديو عبر VideoToolbox باستخدام محركات الوسائط المخصصة من سلسلة M (Media Engine)، مما يتيح تشغيل 8K HDR باستهلاك طاقة ضئيل. بالنسبة لـ HEVC (H.265) وProRes، يتم فك التشفير على كتل رقاقة متخصصة دون إثقال كاهل وحدة المعالجة المركزية.
AVPlayer متكامل بشكل وثيق مع النظام البيئي لـ Apple: دعم Handoff لنقل التشغيل بين الأجهزة، وAirPlay 2 للبث إلى Apple TV، والصوت المكاني مع التتبع الديناميكي للرأس، والمزامنة مع عناصر التحكم في النظام عبر MPNowPlayingInfoCenter. هذه التكاملات تجعل AVPlayer المعيار الفعلي لجميع التطبيقات التي تعمل مع الوسائط على منصات Apple.
يوفر إطار عمل AVFoundation تسلسلاً هرميًا من ثلاثة مستويات للتشغيل: AVAsset (البيانات الوصفية ومعلومات المحتوى)، وAVPlayerItem (الحالة وإدارة مثيل محتوى معين)، وAVPlayer (التحكم في التشغيل). تفصل هذه البنية تحميل البيانات الوصفية، وإعداد التشغيل، وعملية التشغيل نفسها — وهو أمر مهم بشكل خاص لتدفقات HLS ذات بدائل معدل البت المتعددة.
AVAsset يمثل نموذج محتوى وسائط — ملف أو تدفق. AVAsset غير قابل للتشغيل بحد ذاته؛ فهو يحتوي على مسارات (AVAssetTrack)، وبيانات وصفية (commonMetadata)، ومعلومات المدة، وخصائص أخرى. يتم إنشاء AVPlayerItem من AVAsset، والذي يمكن بعد ذلك تمريره إلى AVPlayer للتشغيل.
يوفر AVPlayer مجموعة من الإمكانيات التي تغطي معظم سيناريوهات التشغيل — من تشغيل الملفات البسيط إلى البث المباشر المعقد مع DRM. دعنا نستكشف الميزات الرئيسية مع أمثلة الاستخدام.
| الميزة | الوصف | المنصات |
|---|---|---|
| الملفات المحلية | MP4، MOV، M4V، AVI، MKV (عبر الإضافات) | iOS، macOS، tvOS |
| HLS | HTTP Live Streaming مع ABR تكيفي | جميع منصات Apple |
| FairPlay DRM | محتوى HLS محمي بترخيص تدفق | iOS، tvOS، macOS |
| Picture in Picture | نافذة فيديو عائمة فوق التطبيقات الأخرى | iPad، iPhone (iOS 14+)، Mac |
| AirPlay 2 | البث اللاسلكي إلى Apple TV ومكبرات الصوت | جميع المنصات |
| الصوت المكاني | Dolby Atmos والتتبع الديناميكي للرأس | iOS 15+، macOS 13+ |
| HDR | Dolby Vision، HDR10، HLG مع دعم الشاشة | iOS 11+، macOS 10.13+ |
AVPlayer لديه دعم أصلي لـ HLS دون الحاجة إلى مكتبات إضافية. عند تشغيل تدفق HLS، يدير AVPlayer تلقائيًا التبديل التكيفي لمعدل البت باستخدام خوارزمية ABR مدمجة محسّنة لمنصات Apple. تأخذ الخوارزمية في الاعتبار ليس فقط عرض النطاق الترددي للشبكة ولكن أيضًا الحالة الحرارية للجهاز — عند ارتفاع درجة الحرارة، قد يخفض AVPlayer معدل البت لتقليل حمل وحدة المعالجة المركزية.
لتدفقات HLS مع FairPlay Streaming، يعالج AVPlayer تلقائيًا الحصول على التراخيص وتجديدها من خلال مفوض AVContentKeySession. يحتاج المطور إلى تنفيذ بروتوكول AVContentKeySessionDelegate، الذي يستدعيه المشغل عند الحاجة إلى الحصول على مفتاح فك التشفير أو تجديده. هذه هي الطريقة الوحيدة لحماية محتوى HLS على منصات Apple، حيث أن Widevine غير مدعوم على iOS.
PiP هو وضع يسمح للمستخدمين بمواصلة مشاهدة الفيديو في نافذة عائمة عند التبديل بين التطبيقات. على iPad وiPhone (iOS 14+)، يتكامل AVPlayer مع AVPictureInPictureController لتمكين هذا الوضع. على macOS 15+، PiP متاح أيضًا ولكنه يُنشَّط عبر قائمة النظام أو زر في نافذة المشغل.
يمكن دمج AVPlayer في تطبيق iOS بطريقتين: من خلال AVPlayerViewController عالي المستوى (للسيناريوهات القياسية) أو مباشرة عبر AVPlayer + AVPlayerLayer (لتخصيص واجهة المستخدم بالكامل). دعنا نستكشف كلا النهجين في Swift.
AVPlayerViewController هو مكون واجهة مستخدم جاهز للاستخدام يوفر عناصر تحكم مدمجة: تشغيل/إيقاف مؤقت، بحث، صوت، AirPlay، PiP، ووضع ملء الشاشة. يتطلب التكامل الأدنى بضعة أسطر فقط من التعليمات البرمجية: إنشاء مثيل AVPlayer، وتمريره إلى AVPlayerViewController، وعرض وحدة التحكم على الشاشة.
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 — طبقة Core Animation تعرض الفيديو داخل أي UIView. يمنحك هذا النهج تحكمًا كاملاً في الواجهة: يمكنك إضافة عناصر تحكم مخصصة ورسوم متحركة وطبقات إضافية فوق الفيديو.
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 عند ظهور الشاشة وتحريره عند إغلاقها. عند انتقال التطبيق إلى الخلفية، يُوصى بإيقاف التشغيل مؤقتًا للحفاظ على الموارد وتجنب عقوبات مراجعة التطبيق للتشغيل الخلفي غير الضروري.
AVPlayerLayer هي طبقة Core Animation ترث من CALayer وتعرض الفيديو على الشاشة. على عكس UIView، تعمل AVPlayerLayer مباشرة مع GPU عبر Metal أو OpenGL، مما يضمن أقل زمن وصول لإخراج الإطارات. فهم AVPlayerLayer ضروري لتنفيذ واجهات تشغيل مخصصة.
تحدد الخاصية videoGravity كيفية تناسب الفيديو داخل حدود الطبقة. AVLayerVideoGravity.resizeAspect (الحفاظ على نسبة العرض إلى الارتفاع مع أشرطة سوداء) هو القيمة الافتراضية لـ AVPlayerViewController. يُستخدم resizeAspectFill (ملء الشاشة بالكامل مع قص) لوضع ملء الشاشة. نادرًا ما يُستخدم resize (تشويه النسب لتناسب حجم الطبقة)، بشكل أساسي للتطبيقات التحليلية.
تعرض AVPlayerLayer الفيديو في الوقت الفعلي، ولكن يجب تنفيذ جميع عمليات المشغل (بدء، إيقاف مؤقت، بحث) على الخيط الرئيسي. القيم الرئيسية للمراقبة — timeControlStatus وrate وstatus وerror — يتم تتبعها عبر KVO (مراقبة القيمة والمفتاح) أو واجهة برمجة تطبيقات async/await الحديثة المقدمة في iOS 16 عبر طرق AVPlayer مع دعم 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 الترجمة المضمنة بتنسيقات VTT وCEA-608 وITT (iTunes Timed Text). يتم تحديد المسار الصوتي والترجمة عبر AVMediaSelectionGroup وAVMediaSelectionOption. تتم قراءة إعدادات الترجمة للمستخدم (الخط والحجم واللون) من إعدادات إمكانية الوصول في النظام ويتم تطبيقها تلقائيًا على AVPlayerLayer ما لم يتم تحديدها صراحةً في الكود.
لتطبيقات الإنتاج، غالبًا ما يتطلب تكامل AVPlayer الأساسي تكوينًا إضافيًا: التخزين المؤقت لشرائح HLS، والتكامل مع FairPlay DRM، والتكامل مع نظام Now Playing، وخوارزميات اختيار معدل البت المخصصة.
AVAssetResourceLoader هو الطريقة الوحيدة لاعتراض تحميل شرائح HLS وتنفيذ التخزين المؤقت. يستلم مفوض AVAssetResourceLoaderDelegate طلبات تحميل المفاتيح والشرائح، مما يسمح بتخزينها محليًا وإعادتها من ذاكرة التخزين المؤقت في الطلبات اللاحقة. هذا مفيد بشكل خاص للتطبيقات التي تعمل في ظروف شبكة غير مستقرة.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) هو معيار Apple لحماية محتوى HLS. لدمج FPS، تحتاج إلى تنفيذ بروتوكول AVContentKeySessionDelegate، الذي يعالج طلبات مفاتيح فك التشفير. تتضمن العملية: الحصول على SPC (سياق تشغيل الخادم) من المشغل، وإرساله إلى خادم الترخيص، واستلام CKC (سياق مفتاح المحتوى)، وإعادته إلى AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. الحصول على SPC من keyRequest
// 2. إرسال SPC إلى خادم الترخيص
// 3. الحصول على CKC وتمريره إلى keyRequest.processContentKeyResponse
}
}
لعرض معلومات التشغيل الحالية على شاشة القفل ومركز التحكم و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 هو مشغل عالمي للصوت والفيديو مع دعم البث وHLS وDRM والمزامنة مع عناصر التحكم في النظام. AVAudioPlayer هو مشغل صوت مبسط لتشغيل ملفات الصوت المحلية دون دعم البث أو تسريع الفيديو بالأجهزة. للفيديو وHLS، استخدم AVPlayer؛ للصوت البسيط، استخدم AVAudioPlayer.
لا، لا يدعم AVPlayer التحميل المباشر لمحتوى YouTube، حيث يستخدم YouTube مشغلًا خاصًا به يعتمد على DASH والتنسيقات الملكية. لدمج YouTube في تطبيق iOS، استخدم YouTube IFrame Player API عبر WKWebView أو المكتبة الرسمية youtube-ios-player-helper.
للصوت في الخلفية، أضف Audio, AirPlay and Picture in Picture إلى أوضاع الخلفية في مشروع Xcode الخاص بك. قم بتكوين AVAudioSession مع فئة .playback: try AVAudioSession.sharedInstance().setCategory(.playback). سيستمر AVPlayer في التشغيل في الخلفية، وستعرض شاشة القفل ومركز التحكم عناصر التحكم عبر MPNowPlayingInfoCenter.
تستخدم هذه الخدمات حماية DRM وحلول المشغل الخاصة بها. يمكن لـ AVPlayer تشغيل المحتوى فقط عبر رابط مباشر لملف الوسائط أو قائمة تشغيل HLS. مقاطع الفيديو من YouTube والمنصات المماثلة مغلفة في مشغلات iframe أو JavaScript غير متوافقة مع AVPlayer. استخدم SDKs الرسمية الخاصة بها أو WebView للعرض.
لـ HLS منخفض زمن الوصول، قم بتكوين AVPlayerItem مع preferredForwardBufferDuration = 2.0 (ثوانٍ) وإدارة الإيقاف المؤقت تلقائيًا عند التخلف عن الحد المباشر: استخدم player.currentItem?.configuredTimeOffsetFromLive وplayer.currentItem?.canPlayReverse. توصي Apple بـ LL-HLS بزمن وصول 2-4 ثوانٍ عند التكوين الصحيح على كل من الخادم والعميل.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.