Audio Session হলো iOS-এর কেন্দ্রীয় প্রক্রিয়া যা অ্যাপ্লিকেশনের অডিও আচরণ পরিচালনা করে: সিস্টেমের সাথে মিথস্ক্রিয়া, বিঘ্নগুলি সামলানো এবং অডিও রাউটিং। প্রতিটি iOS অ্যাপ্লিকেশন একটি একক অডিও সেশন পায় যা নির্ধারণ করে যে স্ক্রিন লক থাকলে, কলের সময় এবং Bluetooth সংযোগের সময় শব্দ কেমন আচরণ করে। Apple Developer Documentation, 2026 অনুযায়ী, Audio Session একটি বিভাগ এবং মোডের মাধ্যমে কনফিগার করা হয় — সঠিক কনফিগারেশন ছাড়া, অ্যাপ্লিকেশন পটভূমিতে শব্দ চালাতে নাও পারে।
মূল পয়েন্ট
Audio Session হলো AVAudioSession-এর একটি একক ইনস্ট্যান্স যা সিস্টেম তৈরি করে যখন কোনো অ্যাপ্লিকেশন চালু হয় এবং তার সম্পূর্ণ জীবনচক্র জুড়ে বিদ্যমান থাকে। এটি অ্যাপ্লিকেশন এবং iOS অডিও সিস্টেমের মধ্যে মধ্যস্থতাকারী হিসাবে কাজ করে: বিভাগ কনফিগারেশন নির্ধারণ করে যে অ্যাপ্লিকেশনটিকে পটভূমিতে শব্দ চালানোর অনুমতি আছে কিনা, কলের সময় শব্দ মিউট হবে কিনা এবং কোন ডিভাইসে অডিও আউটপুট করতে হবে।
Android Audio Focus-এর বিপরীতে, যেখানে প্রতিটি অ্যাপ্লিকেশন স্বাধীনভাবে ফোকাস অনুরোধ এবং প্রকাশ করে, iOS Audio Session প্রতি অ্যাপ্লিকেশনে একটি সেশনের মাধ্যমে কেন্দ্রীয়ভাবে পরিচালিত হয়। যখন একটি সেশন সক্রিয় হয়, সিস্টেম স্বয়ংক্রিয়ভাবে পূর্ববর্তী অ্যাপ্লিকেশনের সেশন নিষ্ক্রিয় করে, এটিকে একটি বিঘ্ন বিজ্ঞপ্তি পাঠায়। এই আর্কিটেকচারাল পার্থক্য দুটি প্ল্যাটফর্মে অডিও পরিচালনার বিভিন্ন পদ্ধতি নির্ধারণ করে।
WWDC 2024 সেশন 211 অনুযায়ী, iOS অ্যাপ্লিকেশনে প্রায় 40% অডিও সমস্যা ভুল Audio Session কনফিগারেশনের কারণে ঘটে। সবচেয়ে সাধারণ ভুল হলো playback-এর পরিবর্তে ambient বিভাগ নির্বাচন করা, যার ফলে স্ক্রিন লক হলে শব্দ অদৃশ্য হয়ে যায়।
চালু হলে, অ্যাপ্লিকেশন সেশনের sharedInstance পায়, setCategory(_:mode:options:) কলের মাধ্যমে বিভাগ সেট করে এবং setActive(true)-এর মাধ্যমে সেশন সক্রিয় করে। সক্রিয়করণের পর, iOS রাউটিংয়ের জন্য বিভাগ নীতিগুলি বিবেচনা করে। যদি অন্য কোনো অ্যাপ্লিকেশন তার সেশন সক্রিয় করে, বর্তমানটি Notification.Name.AVAudioSessionInterruption-এর মাধ্যমে একটি AudioSessionInterruptionType.began বিজ্ঞপ্তি পায়।
বিভাগ হলো Audio Session-এর প্রধান প্যারামিটার, যা ছয়টি পূর্বনির্ধারিত আচরণ বিকল্প নির্ধারণ করে। বিভাগ নির্বাচন করা iOS-এ অডিও সেটআপ করার সময় প্রথম এবং সবচেয়ে গুরুত্বপূর্ণ সিদ্ধান্ত।
| বিভাগ | কখন ব্যবহার করবেন | পটভূমির অডিও | মিউট সুইচ প্রভাবিত করে |
|---|---|---|---|
| ambient | গেম, পটভূমির প্রভাব | না | হ্যাঁ |
| playback | সংগীত, পডকাস্ট, অডিওবুক | হ্যাঁ | না |
| record | ভয়েস মেমো, অডিও রেকর্ডিং | না | প্রযোজ্য নয় |
| playAndRecord | VoIP, ভয়েস বার্তা | হ্যাঁ | না |
| multiRoute | DJ মিক্সার, কারাওকে | হ্যাঁ | না |
| soloAmbient | ডিফল্ট (iOS default) | না | হ্যাঁ |
সংগীত এবং ভিডিও প্লেয়ারের জন্য, সর্বদা playback ব্যবহার করুন। এই বিভাগ অনুমতি দেয়: স্ক্রিন লক থাকা অবস্থায়, মিউট সুইচ বন্ধ থাকা অবস্থায় (iPhone-এর শারীরিক বোতাম), এবং অ্যাপ্লিকেশন পটভূমিতে থাকা অবস্থায় শব্দ চালানো। playback বিভাগ ছাড়া, স্ক্রিন লক বা অ্যাপ্লিকেশন ছোট হলে সেশন নিষ্ক্রিয় হয়।
ambient বিভাগ গেম এবং পটভূমির শব্দযুক্ত অ্যাপ্লিকেশনের জন্য উপযুক্ত — এটি অন্যান্য অ্যাপ্লিকেশনকে চালিয়ে যেতে দেয়। উদাহরণস্বরূপ, যদি একজন ব্যবহারকারী সংগীত শুনছেন এবং ambient সেশনসহ একটি গেম খোলেন, সংগীত গেমের শব্দের ওপর দিয়ে চলতে থাকে। এটি Android থেকে একটি মৌলিক পার্থক্য, যেখানে এই ধরনের পরিস্থিতিতে স্পষ্ট duck অনুমতি প্রয়োজন।
Audio Session কনফিগারেশন যেকোনো প্লেব্যাক শুরুর আগে করা উচিত। application(_:didFinishLaunchingWithOptions:) পদ্ধতিতে বা প্লেয়ারের ইনিশিয়ালাইজারে সেশন কনফিগার করার সুপারিশ করা হয়। বিভাগ সেট করার পর, সেশন সক্রিয় করতে হবে।
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Audio Session সেটআপ ব্যর্থ: \(error.localizedDescription)")
}
options প্যারামিটারে allowBluetooth (Bluetooth হেডসেটে আউটপুট) এবং defaultToSpeaker (ইয়ারপিসের পরিবর্তে স্পিকারের মাধ্যমে প্লেব্যাক) অন্তর্ভুক্ত। allowBluetooth অপশনটি Bluetooth হেডফোন সমর্থনকারী অ্যাপ্লিকেশনের জন্য বাধ্যতামূলক — এটি ছাড়া, হেডসেট সংযুক্ত থাকলেও শব্দ বিল্ট-ইন স্পিকারে যেতে পারে।
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
playAndRecord বিভাগ voiceChat মোডসহ ভয়েস যোগাযোগের জন্য অডিও পাথ অপ্টিমাইজ করে: ইকো ক্যান্সেলেশন, অটোমেটিক গেইন কন্ট্রোল (AGC) সক্ষম করে এবং সর্বোত্তম কোডেক নির্বাচন করে। OverrideOutputAudioPort(.speaker) হেডসেট সংযুক্ত থাকলেও স্পিকারের মাধ্যমে আউটপুট বাধ্য করে — স্পিকারফোনের জন্য উপযোগী।
setActive(true) কল করলে সেশন সক্রিয় হয় এবং সিস্টেমকে জানায় যে অ্যাপ্লিকেশন অডিও ব্যবহার করবে। যখন প্লেব্যাক বিরাম দেওয়া হয়, সেশন নিষ্ক্রিয় করার সুপারিশ করা হয় যাতে অন্যান্য অ্যাপ্লিকেশন অডিও স্ট্রিম পেতে পারে। ব্যতিক্রম হলো দীর্ঘ পটভূমি প্লেব্যাক (সংগীত, পডকাস্ট) সহ অ্যাপ্লিকেশন, যেখানে সেশন পুরো ট্র্যাক জুড়ে সক্রিয় থাকে।
setActive কল করার সময় ত্রুটিগুলি সামলানো গুরুত্বপূর্ণ। যদি উচ্চ অগ্রাধিকারযুক্ত অন্য একটি সেশন সক্রিয় থাকে (উদাহরণস্বরূপ, কলের সময় ফোন), setActive একটি ত্রুটি ফেলতে পারে। এই ক্ষেত্রে, AudioSessionInterruptionType.ended বিজ্ঞপ্তির জন্য অপেক্ষা করুন এবং সক্রিয়করণ পুনরায় চেষ্টা করুন।
মোড বিভাগকে পরিশোধন করে এবং একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে অডিও পাথ অপ্টিমাইজ করে। প্রতিটি মোড AGC, ইকো ক্যান্সেলেশন এবং কোডেকের আচরণ পরিবর্তন করে। মোডগুলি বিভাগ প্রতিস্থাপন করে না বরং পরিপূরক করে — একটি বিভাগ বিভিন্ন মোডের সাথে কাজ করতে পারে।
অপশনগুলি সেশন আচরণের সূক্ষ্ম সমন্বয় প্রদান করে। প্রতিটি অপশন একটি ফ্ল্যাগ যা একটি অ্যারেতে অন্যদের সাথে একত্রিত করা যেতে পারে। উদাহরণস্বরূপ, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] Bluetooth হেডসেটে শব্দ আউটপুট অনুমতি দেয়, ডিফল্টরূপে স্পিকার ব্যবহার করে এবং অডিওবুকের সাথে মিশ্রিত হয়।
iOS 17+-এ spatialAudio অপশন এসেছে, যা AVAudioSessionSpatialPreferences-এর মাধ্যমে AirPods-এর জন্য ব্যক্তিগতকৃত স্থানিক শব্দ সক্ষম করে। WWDC 2024 অনুযায়ী, Apple-এর পরীক্ষায় স্থানিক শব্দ সংগীত অ্যাপ্লিকেশনে ব্যবহারকারীর ব্যস্ততা 25% বাড়ায়।
বিঘ্নগুলি Audio Session এবং Android Audio Focus-এর মধ্যে একটি মূল পার্থক্য। iOS-এ, বিঘ্নগুলি NotificationCenter-এর মাধ্যমে AVAudioSession.interruptionNotification-এ সাবস্ক্রাইব করে সামলানো হয়। বিজ্ঞপ্তিতে বিঘ্নের ধরনসহ একটি ডিকশনারি থাকে: began বা ended।
override func viewDidLoad() {
super.viewDidLoad()
let center = NotificationCenter.default
center.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
}
@objc func handleInterruption(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let type = userInfo[AVAudioSession.interruptionTypeKey]
as? AVAudioSessionInterruptionType
else { return }
switch type {
case began:
pausePlayback()
case ended:
guard let options = userInfo[AVAudioSession.interruptionOptionKey]
as? AVAudioSessionInterruptionOptions
else { return }
if options.contains(shouldResume) {
resumePlayback()
}
}
যখন interruptionType.began পাওয়া যায়, প্লেয়ারের প্লেব্যাক বিরাম দেওয়া উচিত। যখন interruptionType.ended পাওয়া যায়, interruptionOptionKey প্রপার্টি নির্দেশ করে যে প্লেয়ার স্বয়ংক্রিয়ভাবে পুনরায় শুরু করতে পারে কিনা (shouldResume)। যদি ব্যবহারকারী কল প্রত্যাখ্যান করেন, shouldResume = true। যদি কল টাইমআউটে শেষ হয় — shouldResume = false, পুনরায় শুরু করার অনুমতি নেই।
যখন অন্য একটি অ্যাপ্লিকেশন playback বিভাগসহ তার Audio Session সক্রিয় করে, বর্তমান সেশন একটি বিঘ্ন বিজ্ঞপ্তি পায়। যদি অন্য অ্যাপ্লিকেশন ambient ব্যবহার করে, কোনো বিঘ্ন ঘটে না — শব্দগুলি মিশ্রিত হয়। এই আচরণ Android থেকে সম্পূর্ণ ভিন্ন, যেখানে যেকোনো Audio Focus সক্রিয়করণ একটি LOSS ইভেন্ট ট্রিগার করে।
যেসব অ্যাপ্লিকেশনের অন্যান্য সেশন সক্রিয় হলে প্লেব্যাক চালিয়ে যেতে প্রয়োজন (উদাহরণস্বরূপ, সংগীত চলাকালীন নেভিগেশন), .mixWithOthers অপশন ব্যবহার করুন। এই অপশন অন্যান্য অ্যাপ্লিকেশনের সাথে শব্দ মিশ্রণের অনুমতি দেয় এবং কোনো বিঘ্ন পাঠানো হয় না। MixWithOthers হলো Android-এর duck মোডের iOS সমতুল্য।
Audio Session স্বয়ংক্রিয়ভাবে বিল্ট-ইন স্পিকার, হেডফোন, Bluetooth হেডসেট এবং AirPlay ডিভাইসের মধ্যে অডিও রাউটিং পরিচালনা করে। অ্যাপ্লিকেশন currentRoute প্রপার্টির মাধ্যমে বর্তমান রুট পর্যবেক্ষণ করতে পারে এবং AVAudioSession.routeChangeNotification-এর মাধ্যমে পরিবর্তন সম্পর্কে বিজ্ঞপ্তি পেতে পারে।
যখন Bluetooth হেডফোন সংযুক্ত হয়, iOS স্বয়ংক্রিয়ভাবে অডিও আউটপুট সেগুলিতে সুইচ করে যদি সেশন allowBluetooth অপশন দিয়ে কনফিগার করা থাকে। এই অপশন ছাড়া, শব্দ বিল্ট-ইন স্পিকারের মাধ্যমে চলতে থাকে। iOS 16 থেকে শুরু করে, যখন AirPods Pro সংযুক্ত হয়, সিস্টেম স্বয়ংক্রিয়ভাবে লেটেন্সি কমানোর জন্য ProMotion সিঙ্ক্রোনাইজেশন সক্ষম করে।
routeChangeNotification-এ সাবস্ক্রাইব করলে হেডফোন সংযোগ এবং বিচ্ছিন্নকরণে প্রতিক্রিয়া জানানোর অনুমতি দেয়। যখন একটি Bluetooth হেডসেট বিচ্ছিন্ন হয়, প্লেয়ারের প্লেব্যাক বিরাম দেওয়া উচিত — ব্যবহারকারী আশা করতে পারেন না যে ফোনের স্পিকার থেকে শব্দ আসতে শুরু করবে। Apple HIG (2026) অনুযায়ী, সংগীত অ্যাপ্লিকেশনের জন্য এটি বাধ্যতামূলক আচরণ।
availableInputs এবং availableOutputs প্রপার্টিগুলি তাদের ধরনসহ (builtInSpeaker, headphones, bluetoothA2DP, hdmi) উপলব্ধ অডিও ডিভাইসের একটি তালিকা ফেরত দেয়। ডেভেলপার কাস্টম রাউটিং পরিস্থিতির জন্য overrideOutputAudioPort-এর মাধ্যমে প্রোগ্রামেটিকভাবে একটি নির্দিষ্ট ডিভাইস নির্বাচন করতে পারেন।
সচরাচর জিজ্ঞাসিত প্রশ্ন
মূল পার্থক্য হলো আর্কিটেকচার। Audio Session হলো প্রতি অ্যাপ্লিকেশনে একটি একক কেন্দ্রীভূত সেশন যা একবার কনফিগার করা হয়। Android-এ Audio Focus-এর জন্য চালানোর সময় প্রতিবার手动 ফোকাস অনুরোধ প্রয়োজন। এছাড়াও, iOS mixWithOthers অপশনের মাধ্যমে মিশ্রণ সমর্থন করে, যখন Android-এ duck সম্পূর্ণ বন্ধের একমাত্র বিকল্প।
সবচেয়ে সাধারণ কারণ ভুল Audio Session বিভাগ। যদি ambient বা soloAmbient নির্বাচিত হয়, স্ক্রিন লক করলে শব্দ বন্ধ হয়ে যায়। বিভাগটি playback-এ পরিবর্তন করুন এবং নিশ্চিত করুন যে Info.plist-এ Background Modes — Audio, AirPlay, and Picture in Picture যোগ করা হয়েছে।
setCategory-এ .mixWithOthers অপশন যোগ করুন। এটি আপনার অ্যাপ্লিকেশনের শব্দকে অন্যান্য সক্রিয় সেশনের সাথে মিশ্রিত করার অনুমতি দেবে। এই অপশন ছাড়া, একটি নতুন অ্যাপ্লিকেশন বর্তমানটিকে বিঘ্নিত করে। MixWithOthers হলো Android-এর duck মোডের অনুরূপ, কিন্তু সম্পূর্ণ ভলিউম সংরক্ষণ সহ।
স্বয়ংক্রিয় নির্বাচনের জন্য nil সহ overrideOutputAudioPort ব্যবহার করুন। Bluetooth-এ জোরপূর্বক আউটপুটের জন্য: availableOutputs থেকে AVAudioSessionRouteDescription পান, .bluetoothA2DP ধরনের একটি পোর্ট নির্বাচন করুন এবং এটি overrideOutputAudioPort-এ পাঠান। নিশ্চিত করুন যে সেশন allowBluetooth দিয়ে কনফিগার করা হয়েছে।
বেশিরভাগ অ্যাপ্লিকেশনের জন্য — হ্যাঁ। বিরামে সেশন নিষ্ক্রিয় করলে অন্যান্য অ্যাপ্লিকেশন অডিও ফোকাস পেতে পারে। ব্যতিক্রম হলো দীর্ঘ পটভূমি প্লেব্যাকসহ সংগীত প্লেয়ার। যদি বিরাম ছোট হয় (5 সেকেন্ডের কম), দ্রুত পুনরায় শুরু করার জন্য সেশন সক্রিয় রাখা ভালো।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন