AVPlayer হল Apple-এর একটি মিডিয়া প্লেয়ার ফ্রেমওয়ার্ক, যা AVFoundation-এর অংশ এবং iOS, macOS, tvOS এবং visionOS-এ অডিও ও ভিডিও প্লেব্যাক প্রদান করে। AVPlayer স্থানীয় MP4 ফাইল থেকে অভিযোজিত HLS স্ট্রিম পর্যন্ত — Apple Silicon চিপে হার্ডওয়্যার-ত্বরিত ডিকোডিং সহ একটি ইউনিফাইড API-এর মাধ্যমে ফর্ম্যাটের একটি বিস্তৃত পরিসর সমর্থন করে। 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 চিপে হার্ডওয়্যার ত্বরণের সুবিধা নেয়। ভিডিও ডিকোডিং ডেডিকেটেড M-সিরিজ মিডিয়া ইঞ্জিন (Media Engine) ব্যবহার করে VideoToolbox-এর মাধ্যমে সম্পাদিত হয়, যা ন্যূনতম বিদ্যুৎ খরচে 8K HDR প্লেব্যাক সক্ষম করে। HEVC (H.265) এবং ProRes-এর জন্য, ডিকোডিং CPU-তে বোঝা না ফেলে বিশেষায়িত চিপ ব্লকে ঘটে।
AVPlayer Apple ইকোসিস্টেমের সাথে ঘনিষ্ঠভাবে একীভূত: ডিভাইসের মধ্যে প্লেব্যাক স্থানান্তরের জন্য Handoff সমর্থন, Apple TV-তে স্ট্রিমিংয়ের জন্য AirPlay 2, গতিশীল হেড ট্র্যাকিং সহ স্থানিক অডিও এবং MPNowPlayingInfoCenter-এর মাধ্যমে সিস্টেম নিয়ন্ত্রণ উপাদানের সাথে সিঙ্ক্রোনাইজেশন। এই একীকরণগুলি AVPlayer-কে Apple প্ল্যাটফর্মে মিডিয়ার সাথে কাজ করা সমস্ত অ্যাপ্লিকেশনের জন্য ডি ফ্যাক্টো স্ট্যান্ডার্ড করে তোলে।
AVFoundation ফ্রেমওয়ার্ক প্লেব্যাকের জন্য একটি তিন-স্তরের অনুক্রম প্রদান করে: AVAsset (মেটাডেটা এবং কন্টেন্ট তথ্য), AVPlayerItem (একটি নির্দিষ্ট কন্টেন্ট ইন্সট্যান্সের অবস্থা এবং ব্যবস্থাপনা), এবং AVPlayer (প্লেব্যাক নিয়ন্ত্রণ)। এই আর্কিটেকচার মেটাডেটা লোডিং, প্লেব্যাক প্রস্তুতি এবং প্লেব্যাক প্রক্রিয়াকে পৃথক করে — যা একাধিক বিটরেট বিকল্প সহ HLS স্ট্রিমের জন্য বিশেষভাবে গুরুত্বপূর্ণ।
AVAsset একটি মিডিয়া কন্টেন্ট মডেল — একটি ফাইল বা স্ট্রিম — উপস্থাপন করে। AVAsset নিজে থেকে প্লেবিল নয়; এতে ট্র্যাক (AVAssetTrack), মেটাডেটা (commonMetadata), সময়কাল তথ্য এবং অন্যান্য বৈশিষ্ট্য থাকে। AVAsset থেকে AVPlayerItem তৈরি করা হয়, যা পরে প্লেব্যাকের জন্য AVPlayer-এ পাস করা যেতে পারে।
AVPlayer বেশিরভাগ প্লেব্যাক পরিস্থিতি কভার করে এমন ক্ষমতার একটি সেট প্রদান করে — সাধারণ ফাইল প্লেব্যাক থেকে DRM সহ জটিল লাইভ সম্প্রচার পর্যন্ত। আসুন ব্যবহারের উদাহরণ সহ মূল বৈশিষ্ট্যগুলি অন্বেষণ করি।
| বৈশিষ্ট্য | বিবরণ | প্ল্যাটফর্ম |
|---|---|---|
| স্থানীয় ফাইল | MP4, MOV, M4V, AVI, MKV (এক্সটেনশনের মাধ্যমে) | iOS, macOS, tvOS |
| HLS | অভিযোজিত ABR সহ HTTP Live Streaming | সমস্ত 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 স্বয়ংক্রিয়ভাবে Apple প্ল্যাটফর্মের জন্য অপ্টিমাইজ করা একটি বিল্ট-ইন ABR অ্যালগরিদম ব্যবহার করে অভিযোজিত বিটরেট সুইচিং পরিচালনা করে। অ্যালগরিদম শুধুমাত্র নেটওয়ার্ক ব্যান্ডউইথ নয় বরং ডিভাইসের তাপীয় অবস্থাও বিবেচনা করে — অতিরিক্ত গরম হলে, AVPlayer CPU লোড কমাতে বিটরেট কমিয়ে দিতে পারে।
FairPlay Streaming সহ HLS স্ট্রিমের জন্য, AVPlayer স্বয়ংক্রিয়ভাবে AVContentKeySession ডেলিগেটের মাধ্যমে লাইসেন্স সংগ্রহ এবং নবায়ন পরিচালনা করে। ডেভেলপারকে AVContentKeySessionDelegate প্রোটোকল বাস্তবায়ন করতে হবে, যা প্লেয়ার ডিক্রিপশন কী পাওয়ার বা নবায়নের প্রয়োজন হলে কল করে। Apple প্ল্যাটফর্মে HLS কন্টেন্ট রক্ষার এটাই একমাত্র উপায়, কারণ iOS-এ Widevine সমর্থিত নয়।
PiP একটি মোড যা ব্যবহারকারীদের অ্যাপের মধ্যে সুইচ করার সময় ভাসমান উইন্ডোতে ভিডিও দেখতে চালিয়ে যেতে দেয়। iPad এবং iPhone (iOS 14+)-এ, AVPlayer এই মোড সক্ষম করতে AVPictureInPictureController-এর সাথে একীভূত হয়। macOS 15+-এ, PiP উপলব্ধ তবে সিস্টেম মেনু বা প্লেয়ার উইন্ডোতে একটি বোতামের মাধ্যমে সক্রিয় করা হয়।
AVPlayer-কে iOS অ্যাপে একীভূত করা দুটি উপায়ে করা যেতে পারে: উচ্চ-স্তরের AVPlayerViewController-এর মাধ্যমে (মানক পরিস্থিতির জন্য) বা সরাসরি AVPlayer + AVPlayerLayer-এর মাধ্যমে (সম্পূর্ণ UI কাস্টমাইজেশনের জন্য)। আসুন Swift-এ উভয় পদ্ধতি অন্বেষণ করি।
AVPlayerViewController একটি রেডি-টু-ইউজ UI উপাদান যা বিল্ট-ইন নিয়ন্ত্রণ প্রদান করে: প্লে/পজ, সিকিং, ভলিউম, 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()
}
কাস্টম UI সহ অ্যাপের জন্য, 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 স্ক্রিন উপস্থিত হলে তৈরি করা উচিত এবং বন্ধ হলে মুক্ত করা উচিত। অ্যাপ ব্যাকগ্রাউন্ডে গেলে, সম্পদ সংরক্ষণ এবং অপ্রয়োজনীয় ব্যাকগ্রাউন্ড প্লেব্যাকের জন্য App Review জরিমানা এড়াতে প্লেব্যাক বিরতি দেওয়ার পরামর্শ দেওয়া হয়।
AVPlayerLayer হল একটি Core Animation লেয়ার যা CALayer থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং স্ক্রিনে ভিডিও রেন্ডার করে। UIView-এর থেকে ভিন্ন, AVPlayerLayer Metal বা OpenGL-এর মাধ্যমে সরাসরি GPU-এর সাথে কাজ করে, ন্যূনতম ফ্রেম আউটপুট লেটেন্সি নিশ্চিত করে। কাস্টম প্লেব্যাক ইন্টারফেস বাস্তবায়নের জন্য AVPlayerLayer বোঝা অপরিহার্য।
videoGravity বৈশিষ্ট্য নির্ধারণ করে কীভাবে ভিডিও লেয়ারের সীমানার মধ্যে ফিট হয়। AVLayerVideoGravity.resizeAspect (কালো বার সহ আকৃতি অনুপাত বজায় রাখা) AVPlayerViewController-এর জন্য ডিফল্ট। resizeAspectFill (ক্রপিং সহ পুরো স্ক্রিন পূরণ করা) ফুলস্ক্রিন মোডের জন্য ব্যবহৃত হয়। resize (লেয়ারের আকারে ফিট করার জন্য অনুপাত বিকৃত করা) খুব কমই ব্যবহৃত হয়, প্রধানত বিশ্লেষণাত্মক অ্যাপ্লিকেশনের জন্য।
AVPlayerLayer রিয়েল-টাইমে ভিডিও রেন্ডার করে, তবে সমস্ত প্লেয়ার অপারেশন (শুরু, বিরতি, সিক) মূল থ্রেডে সম্পাদন করতে হবে। পর্যবেক্ষণের জন্য মূল মান — timeControlStatus, rate, status এবং error — KVO (Key-Value Observing) বা iOS 16-এ Swift Concurrency সমর্থন সহ AVPlayer পদ্ধতির মাধ্যমে প্রবর্তিত আধুনিক async/await API-এর মাধ্যমে ট্র্যাক করা হয়।
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) HLS কন্টেন্ট সুরক্ষার জন্য Apple-এর মান। FPS একীভূত করতে, আপনাকে AVContentKeySessionDelegate প্রোটোকল বাস্তবায়ন করতে হবে, যা ডিক্রিপশন কী-এর অনুরোধগুলি পরিচালনা করে। প্রক্রিয়াটি অন্তর্ভুক্ত করে: প্লেয়ার থেকে SPC (সার্ভার প্লেব্যাক কনটেক্সট) পাওয়া, এটি লাইসেন্স সার্ভারে পাঠানো, CKC (কন্টেন্ট কী কনটেক্সট) পাওয়া এবং এটি AVContentKeySession-এ ফেরত পাঠানো।
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. keyRequest থেকে SPC পান
// 2. SPC লাইসেন্স সার্ভারে পাঠান
// 3. CKC পান এবং keyRequest.processContentKeyResponse-এ পাস করুন
}
}
লক স্ক্রিন, কন্ট্রোল সেন্টার এবং Apple Watch-এ বর্তমান প্লেব্যাক তথ্য প্রদর্শনের জন্য, MediaPlayer.framework থেকে MPNowPlayingInfoCenter ব্যবহার করুন। 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 এবং মালিকানাধীন ফর্ম্যাটের উপর ভিত্তি করে নিজস্ব প্লেয়ার ব্যবহার করে। iOS অ্যাপে YouTube একীভূত করতে, WKWebView বা অফিসিয়াল youtube-ios-player-helper লাইব্রেরির মাধ্যমে YouTube IFrame Player API ব্যবহার করুন।
ব্যাকগ্রাউন্ড অডিওর জন্য, আপনার Xcode প্রকল্পের Background Modes-এ Audio, AirPlay and Picture in Picture যোগ করুন। AVAudioSession-কে .playback ক্যাটাগরি দিয়ে কনফিগার করুন: try AVAudioSession.sharedInstance().setCategory(.playback)। AVPlayer ব্যাকগ্রাউন্ডে চলতে থাকবে, এবং লক স্ক্রিন ও কন্ট্রোল সেন্টার MPNowPlayingInfoCenter-এর মাধ্যমে নিয়ন্ত্রণ প্রদর্শন করবে।
এই পরিষেবাগুলি DRM সুরক্ষা এবং নিজস্ব প্লেয়ার সমাধান ব্যবহার করে। AVPlayer শুধুমাত্র সরাসরি মিডিয়া ফাইল URL বা HLS প্লেলিস্টের মাধ্যমে কন্টেন্ট চালাতে পারে। YouTube এবং অনুরূপ প্ল্যাটফর্মের ভিডিওগুলি iframe বা JavaScript প্লেয়ারে মোড়ানো থাকে যা AVPlayer-এর সাথে সামঞ্জস্যপূর্ণ নয়। প্রদর্শনের জন্য তাদের অফিসিয়াল SDK বা WebView ব্যবহার করুন।
লো-লেটেন্সি HLS-এর জন্য, AVPlayerItem-কে preferredForwardBufferDuration = 2.0 (সেকেন্ড) দিয়ে কনফিগার করুন এবং লাইভ এজ থেকে পিছিয়ে পড়লে স্বয়ংক্রিয়ভাবে বিরতি পরিচালনা করুন: player.currentItem?.configuredTimeOffsetFromLive এবং player.currentItem?.canPlayReverse ব্যবহার করুন। Apple সার্ভার এবং ক্লায়েন্ট উভয়েই সঠিকভাবে কনফিগার করা হলে 2-4 সেকেন্ড লেটেন্সি সহ LL-HLS সুপারিশ করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন