স্পেশাল অডিও হলো একটি ইমারসিভ অডিও অভিজ্ঞতা যা আপনার ব্যবহারকারীদেরকে ঘটনার কেন্দ্রে রাখে এবং আপনার কন্টেন্টকে আরও বাস্তবসম্মত করে তোলে। সারাউন্ড সাউন্ড সেটআপের মতো একটি মাল্টি-স্পিকার এফেক্ট তৈরি করার জন্য শব্দটিকে "স্পেশালাইজড" করা হয়, কিন্তু এক্ষেত্রে স্পিকারের পরিবর্তে হেডফোন ব্যবহার করা হয়।
উদাহরণস্বরূপ, একটি সিনেমায় গাড়ির শব্দ ব্যবহারকারীর পেছন থেকে শুরু হয়ে সামনের দিকে এগিয়ে যেতে পারে এবং শেষে দূরে মিলিয়ে যেতে পারে। ভিডিও চ্যাটে, কণ্ঠস্বরগুলোকে আলাদা করে ব্যবহারকারীর চারপাশে স্থাপন করা যায়, ফলে বক্তাদের শনাক্ত করা সহজ হয়।
আপনার কন্টেন্টে যদি কোনো সমর্থিত অডিও ফরম্যাট ব্যবহার করা হয়, তাহলে আপনি অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) থেকে আপনার অ্যাপে স্পেশিয়াল অডিও যোগ করতে পারবেন।
সক্ষমতা সম্পর্কে জিজ্ঞাসা করুন
ডিভাইসের স্পেশালাইজেশন ক্ষমতা এবং আচরণ সম্পর্কে জানতে Spatializer ক্লাসটি ব্যবহার করুন। প্রথমে AudioManager থেকে Spatializer এর একটি ইনস্ট্যান্স সংগ্রহ করুন:
কোটলিন
val spatializer = audioManager.spatializer
জাভা
Spatializer spatializer = AudioManager.getSpatializer();
Spatializer পাওয়ার পর, ডিভাইসটি থেকে স্পেশালাইজড অডিও আউটপুট পাওয়ার জন্য যে চারটি শর্ত অবশ্যই পূরণ হতে হবে, তা যাচাই করে দেখুন:
| মানদণ্ড | চেক |
|---|---|
| ডিভাইসটি কি স্থানিকীকরণ সমর্থন করে? | getImmersiveAudioLevel() SPATIALIZER_IMMERSIVE_LEVEL_NONE নয় |
| স্থানিকীকরণ কি উপলব্ধ আছে? প্রাপ্যতা বর্তমান অডিও আউটপুট রাউটিংয়ের সাথে সামঞ্জস্যের উপর নির্ভর করে। | isAvailable() true |
| স্থানিকীকরণ কি সক্রিয় করা হয়েছে ? | isEnabled() true |
| প্রদত্ত প্যারামিটারসহ একটি অডিও ট্র্যাককে কি স্থানিকীকরণ করা সম্ভব? | canBeSpatialized() true |
এই শর্তগুলো পূরণ নাও হতে পারে, উদাহরণস্বরূপ, যদি বর্তমান অডিও ট্র্যাকের জন্য স্পেশিয়ালাইজেশন উপলব্ধ না থাকে অথবা অডিও আউটপুট ডিভাইসে এটি সম্পূর্ণরূপে নিষ্ক্রিয় করা থাকে।
হেড ট্র্যাকিং
সমর্থিত হেডসেটগুলির সাহায্যে, প্ল্যাটফর্মটি ব্যবহারকারীর মাথার অবস্থানের উপর ভিত্তি করে অডিওর স্থানিকতা সামঞ্জস্য করতে পারে। বর্তমান অডিও আউটপুট রাউটিংয়ের জন্য কোনো হেড ট্র্যাকার উপলব্ধ আছে কিনা তা পরীক্ষা করতে, isHeadTrackerAvailable() কল করুন।
সামঞ্জস্যপূর্ণ বিষয়বস্তু
Spatializer.canBeSpatialized() নির্দেশ করে যে প্রদত্ত বৈশিষ্ট্যযুক্ত অডিও বর্তমান আউটপুট ডিভাইস রাউটিংয়ের মাধ্যমে স্পেশালাইজ করা যাবে কি না। এই মেথডটি একটি AudioAttributes এবং একটি AudioFormat গ্রহণ করে, যে দুটি সম্পর্কেই নিচে আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে।
AudioAttributes
একটি AudioAttributes অবজেক্ট একটি অডিও স্ট্রিমের (যেমন, গেম অডিও বা স্ট্যান্ডার্ড মিডিয়া ) ব্যবহার , এর প্লেব্যাক আচরণ এবং কন্টেন্ট টাইপ বর্ণনা করে।
canBeSpatialized() কল করার সময়, আপনার Player জন্য সেট করা একই AudioAttributes ইনস্ট্যান্স ব্যবহার করুন। উদাহরণস্বরূপ, যদি আপনি Jetpack Media3 লাইব্রেরি ব্যবহার করেন এবং AudioAttributes কাস্টমাইজ না করে থাকেন, তাহলে AudioAttributes.DEFAULT ব্যবহার করুন।
স্থানিক অডিও নিষ্ক্রিয় করা
আপনার কন্টেন্ট যে ইতিমধ্যেই স্পেশিয়ালাইজ করা হয়েছে তা বোঝাতে, setIsContentSpatialized(true) কল করুন, যাতে অডিওটি ডাবল-প্রসেসড না হয়। বিকল্পভাবে, setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER) কল করে স্পেশিয়ালাইজেশন বিহেভিয়ার অ্যাডজাস্ট করে স্পেশিয়ালাইজেশন সম্পূর্ণরূপে নিষ্ক্রিয় করে দিন।
AudioFormat
একটি AudioFormat অবজেক্ট কোনো অডিও ট্র্যাকের ফরম্যাট এবং চ্যানেল কনফিগারেশন সম্পর্কে বিস্তারিত তথ্য বর্ণনা করে।
canBeSpatialized() ফাংশনে পাস করার জন্য AudioFormat ইনস্ট্যানশিয়েট করার সময়, এনকোডিংটি ডিকোডার থেকে প্রত্যাশিত আউটপুট ফরম্যাটের সমান সেট করুন। এছাড়াও, আপনার কন্টেন্টের চ্যানেল কনফিগারেশনের সাথে মেলে এমন একটি চ্যানেল মাস্ক সেট করা উচিত। কোন নির্দিষ্ট মান ব্যবহার করতে হবে সে সম্পর্কে নির্দেশনার জন্য ডিফল্ট স্পেশালাইজেশন আচরণ বিভাগটি দেখুন।
Spatializer পরিবর্তনগুলি শুনুন
Spatializer এর অবস্থার পরিবর্তন শোনার জন্য, আপনি Spatializer.addOnSpatializerStateChangedListener() ব্যবহার করে একটি লিসেনার যোগ করতে পারেন। একইভাবে, একটি হেড ট্র্যাকারের প্রাপ্যতার পরিবর্তন শোনার জন্য, Spatializer.addOnHeadTrackerAvailableListener() কল করুন।
প্লেব্যাকের সময় লিসেনারের কলব্যাক ব্যবহার করে আপনার ট্র্যাক নির্বাচন সামঞ্জস্য করতে চাইলে এটি কার্যকর হতে পারে। উদাহরণস্বরূপ, যখন একজন ব্যবহারকারী ডিভাইস থেকে তাদের হেডসেট সংযোগ বা সংযোগ বিচ্ছিন্ন করেন, তখন onSpatializerAvailableChanged কলব্যাকটি নির্দেশ করে যে নতুন অডিও আউটপুট রাউটিংয়ের জন্য স্পেশিয়ালাইজার এফেক্টটি উপলব্ধ আছে কি না। এই পর্যায়ে, আপনি ডিভাইসের নতুন সক্ষমতার সাথে মেলানোর জন্য আপনার প্লেয়ারের ট্র্যাক নির্বাচন লজিক আপডেট করার কথা বিবেচনা করতে পারেন। ExoPlayer-এর ট্র্যাক নির্বাচন আচরণ সম্পর্কে বিস্তারিত জানতে, "ExoPlayer এবং স্পেশিয়াল অডিও" বিভাগটি দেখুন।
এক্সোপ্লেয়ার এবং স্থানিক অডিও
ExoPlayer-এর সাম্প্রতিক সংস্করণগুলো স্পেশিয়াল অডিও ব্যবহার করা আরও সহজ করে তুলেছে। আপনি যদি স্বতন্ত্র ExoPlayer লাইব্রেরি (প্যাকেজ নাম com.google.android.exoplayer2 ) ব্যবহার করেন, তাহলে সংস্করণ ২.১৭ প্ল্যাটফর্মটিকে স্পেশিয়ালাইজড অডিও আউটপুট করার জন্য কনফিগার করে এবং সংস্করণ ২.১৮ অডিও চ্যানেল সংখ্যার সীমাবদ্ধতা যুক্ত করে। আপনি যদি Media3 লাইব্রেরির ExoPlayer মডিউল (প্যাকেজ নাম androidx.media3 ) ব্যবহার করেন, তাহলে সংস্করণ 1.0.0-beta01 এবং এর পরবর্তী সংস্করণগুলোতে এই একই আপডেটগুলো অন্তর্ভুক্ত রয়েছে।
আপনার ExoPlayer ডিপেন্ডেন্সিটি সর্বশেষ রিলিজে আপডেট করার পর, আপনার অ্যাপে শুধু স্পেশিয়ালাইজ করা যায় এমন কন্টেন্ট অন্তর্ভুক্ত করতে হবে।
অডিও চ্যানেল সংখ্যার সীমাবদ্ধতা
যখন স্পেশিয়াল অডিওর জন্য চারটি শর্তই পূরণ হয়, তখন এক্সোপ্লেয়ার একটি মাল্টি-চ্যানেল অডিও ট্র্যাক বেছে নেয়। অন্যথায়, এক্সোপ্লেয়ার এর পরিবর্তে একটি স্টেরিও ট্র্যাক বেছে নেয়। যদি Spatializer প্রোপার্টিজ পরিবর্তিত হয়, তাহলে এক্সোপ্লেয়ার বর্তমান প্রোপার্টিজের সাথে মেলে এমন একটি অডিও ট্র্যাক নির্বাচন করার জন্য একটি নতুন ট্র্যাক সিলেকশন প্রক্রিয়া শুরু করবে। উল্লেখ্য যে, এই নতুন ট্র্যাক সিলেকশনের কারণে একটি সংক্ষিপ্ত রিবফারিং পিরিয়ড হতে পারে।
অডিও চ্যানেল সংখ্যার সীমাবদ্ধতা নিষ্ক্রিয় করতে, প্লেয়ারে ট্র্যাক নির্বাচনের প্যারামিটারগুলো নিচে দেখানো অনুযায়ী সেট করুন:
কোটলিন
exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
জাভা
exoPlayer.setTrackSelectionParameters( new DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
একইভাবে, আপনি নিম্নলিখিত উপায়ে একটি বিদ্যমান ট্র্যাক সিলেক্টরের প্যারামিটার আপডেট করে অডিও চ্যানেল সংখ্যার সীমাবদ্ধতা নিষ্ক্রিয় করতে পারেন:
কোটলিন
val trackSelector = DefaultTrackSelector(context) ... trackSelector.parameters = trackSelector.buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
জাভা
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ... trackSelector.setParameters( trackSelector .buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
অডিও চ্যানেল সংখ্যার সীমাবদ্ধতা নিষ্ক্রিয় থাকলে, কোনো কন্টেন্টে একাধিক অডিও ট্র্যাক থাকলে, ExoPlayer প্রথমে সেই ট্র্যাকটি নির্বাচন করে যেটিতে সর্বাধিক সংখ্যক চ্যানেল রয়েছে এবং যা ডিভাইস থেকে প্লে করা যায়। উদাহরণস্বরূপ, যদি কন্টেন্টটিতে একটি মাল্টি-চ্যানেল অডিও ট্র্যাক এবং একটি স্টেরিও অডিও ট্র্যাক থাকে, এবং ডিভাইসটি উভয়ই প্লেব্যাক সমর্থন করে, তাহলে ExoPlayer মাল্টি-চ্যানেল ট্র্যাকটি নির্বাচন করবে। এই আচরণটি কীভাবে কাস্টমাইজ করা যায় সে সম্পর্কে বিস্তারিত জানতে অডিও ট্র্যাক নির্বাচন অংশটি দেখুন।
অডিও ট্র্যাক নির্বাচন
যখন ExoPlayer-এর অডিও চ্যানেল সংখ্যা সংক্রান্ত সীমাবদ্ধতা নিষ্ক্রিয় করা থাকে, তখন ExoPlayer ডিভাইসের স্পেশিয়ালাইজারের বৈশিষ্ট্যের সাথে মেলে এমন কোনো অডিও ট্র্যাক স্বয়ংক্রিয়ভাবে নির্বাচন করে না। এর পরিবর্তে, আপনি প্লেব্যাকের আগে বা চলাকালীন ট্র্যাক নির্বাচনের প্যারামিটার সেট করার মাধ্যমে ExoPlayer-এর ট্র্যাক নির্বাচন পদ্ধতিকে নিজের মতো করে সাজিয়ে নিতে পারেন। ডিফল্টরূপে, ExoPlayer সেইসব অডিও ট্র্যাক নির্বাচন করে যা MIME টাইপ (এনকোডিং), চ্যানেল সংখ্যা এবং স্যাম্পল রেটের দিক থেকে প্রাথমিক ট্র্যাকের মতোই।
ট্র্যাক নির্বাচনের প্যারামিটার পরিবর্তন করা
ExoPlayer-এর ট্র্যাক নির্বাচনের প্যারামিটার পরিবর্তন করতে, Player.setTrackSelectionParameters() ব্যবহার করুন। একইভাবে, আপনি Player.getTrackSelectionParameters() দিয়ে ExoPlayer-এর বর্তমান প্যারামিটারগুলো পেতে পারেন। উদাহরণস্বরূপ, প্লেব্যাকের মাঝপথে একটি স্টেরিও অডিও ট্র্যাক নির্বাচন করতে:
কোটলিন
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters .buildUpon() .setMaxAudioChannelCount(2) .build()
জাভা
exoPlayer.setTrackSelectionParameters( exoPlayer.getTrackSelectionParameters() .buildUpon() .setMaxAudioChannelCount(2) .build() );
মনে রাখবেন যে, প্লেব্যাকের মাঝখানে ট্র্যাক সিলেকশন প্যারামিটার পরিবর্তন করলে প্লেব্যাকে বিঘ্ন ঘটতে পারে। প্লেয়ারের ট্র্যাক সিলেকশন প্যারামিটারগুলো টিউন করার বিষয়ে আরও তথ্য ExoPlayer ডক্সের ট্র্যাক সিলেকশন বিভাগে পাওয়া যাবে।
ডিফল্ট স্থানিককরণ আচরণ
অ্যান্ড্রয়েডের ডিফল্ট স্পেশিয়ালাইজেশন আচরণে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকে, যা OEM-রা কাস্টমাইজ করতে পারে:
শুধুমাত্র মাল্টি-চ্যানেল কন্টেন্টই স্পেশিয়ালাইজ করা হয়, স্টেরিও কন্টেন্ট নয়। আপনি যদি ExoPlayer ব্যবহার না করেন, তবে আপনার মাল্টি-চ্যানেল অডিও কন্টেন্টের ফরম্যাটের উপর নির্ভর করে, একটি অডিও ডিকোডার দ্বারা আউটপুটযোগ্য চ্যানেলের সর্বোচ্চ সংখ্যা আপনাকে অনেক বেশি পরিমাণে কনফিগার করতে হতে পারে। এটি নিশ্চিত করে যে প্ল্যাটফর্মের স্পেশিয়ালাইজ করার জন্য অডিও ডিকোডারটি মাল্টি-চ্যানেল PCM আউটপুট করে।
কোটলিন
val mediaFormat = MediaFormat() mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)
জাভা
MediaFormat mediaFormat = new MediaFormat(); mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99);
এর একটি কার্যকরী উদাহরণের জন্য, ExoPlayer-এর
MediaCodecAudioRenderer.javaদেখুন। OEM কাস্টমাইজেশন নির্বিশেষে, নিজে থেকে স্পেশিয়ালাইজেশন বন্ধ করতে, স্পেশিয়াল অডিও নিষ্ক্রিয়করণ দেখুন।AudioAttributes: যদিusageUSAGE_MEDIAঅথবাUSAGE_GAMEএ সেট করা থাকে, তবে অডিওটি স্পেশিয়ালাইজেশনের জন্য যোগ্য হবে।AudioFormat: অডিওটিকে স্পেশিয়ালাইজেশনের জন্য উপযুক্ত করতে, এমন একটি চ্যানেল মাস্ক ব্যবহার করুন যাতে অন্ততAudioFormat.CHANNEL_OUT_QUADসংখ্যক চ্যানেল (ফ্রন্ট-লেফট, ফ্রন্ট-রাইট, ব্যাক-লেফট এবং ব্যাক-রাইট) থাকে। নিচের উদাহরণে, আমরা একটি 5.1 অডিও ট্র্যাকের জন্যAudioFormat.CHANNEL_OUT_5POINT1ব্যবহার করেছি। একটি স্টেরিও অডিও ট্র্যাকের জন্য,AudioFormat.CHANNEL_OUT_STEREOব্যবহার করুন।আপনি যদি Media3 ব্যবহার করেন, তাহলে চ্যানেল কাউন্টকে চ্যানেল মাস্কে রূপান্তর করতে
Util.getAudioTrackChannelConfig(int channelCount)ব্যবহার করতে পারেন।এছাড়াও, যদি আপনি ডিকোডারটিকে মাল্টি-চ্যানেল পিসিএম আউটপুট করার জন্য কনফিগার করে থাকেন, তাহলে এনকোডিংটি
AudioFormat.ENCODING_PCM_16BITএ সেট করুন।কোটলিন
val audioFormat = AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build()
জাভা
AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build();
স্থানিক অডিও পরীক্ষা করুন
আপনার টেস্ট ডিভাইসে স্পেশিয়াল অডিও চালু আছে কিনা তা নিশ্চিত করুন:
- তারযুক্ত হেডসেটের জন্য, সিস্টেম সেটিংস > সাউন্ড ও ভাইব্রেশন > স্পেশিয়াল অডিও- তে যান।
- ওয়্যারলেস হেডসেটের জন্য, সিস্টেম সেটিংস > সংযুক্ত ডিভাইস > আপনার ওয়্যারলেস ডিভাইসের গিয়ার আইকন > স্পেশিয়াল অডিও- তে যান।
বর্তমান রাউটিং-এর জন্য স্পেশিয়াল অডিও-র প্রাপ্যতা পরীক্ষা করতে, আপনার ডিভাইসে adb shell dumpsys audio কমান্ডটি চালান। প্লেব্যাক সক্রিয় থাকাকালীন আপনি আউটপুটে নিম্নলিখিত প্যারামিটারগুলি দেখতে পাবেন:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)