স্থানিক অডিও হল একটি নিমজ্জিত অডিও অভিজ্ঞতা যা আপনার ব্যবহারকারীদের কর্মের কেন্দ্রে রাখে, আপনার বিষয়বস্তুকে আরও বাস্তবসম্মত করে তোলে। একটি মাল্টি-স্পিকার ইফেক্ট তৈরি করতে সাউন্ডটিকে "স্পেশিয়ালাইজড" করা হয়, যা চারপাশের সাউন্ড সেটআপের মতো, কিন্তু পরিবর্তে হেডফোনের মাধ্যমে।
উদাহরণস্বরূপ, একটি মুভিতে, একটি গাড়ির শব্দ ব্যবহারকারীর পিছনে শুরু হতে পারে, এগিয়ে যেতে পারে এবং দূরত্বের দিকে যেতে পারে। একটি ভিডিও চ্যাটে, কণ্ঠস্বর আলাদা করা যায় এবং ব্যবহারকারীর চারপাশে স্থাপন করা যায়, যা স্পিকার সনাক্ত করা সহজ করে তোলে।
যদি আপনার সামগ্রী একটি সমর্থিত অডিও ফর্ম্যাট ব্যবহার করে, তাহলে আপনি Android 13 (API স্তর 33) দিয়ে শুরু করে আপনার অ্যাপে স্থানিক অডিও যোগ করতে পারেন।
ক্ষমতার জন্য ক্যোয়ারী
ডিভাইসের স্থানিকীকরণ ক্ষমতা এবং আচরণ জিজ্ঞাসা করতে 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-এর সাম্প্রতিক প্রকাশগুলি স্থানিক অডিও গ্রহণ করা সহজ করে তোলে৷ আপনি যদি স্বতন্ত্র ExoPlayer লাইব্রেরি ব্যবহার করেন (প্যাকেজের নাম com.google.android.exoplayer2
), সংস্করণ 2.17 প্ল্যাটফর্মটিকে স্থানিক অডিও আউটপুট করতে কনফিগার করে এবং সংস্করণ 2.18 অডিও চ্যানেল গণনার সীমাবদ্ধতা প্রবর্তন করে। আপনি যদি Media3 লাইব্রেরি থেকে ExoPlayer মডিউল ব্যবহার করেন, (প্যাকেজের নাম androidx.media3
), সংস্করণ 1.0.0-beta01
এবং নতুন এই একই আপডেটগুলি অন্তর্ভুক্ত করে।
আপনার ExoPlayer নির্ভরতা সর্বশেষ রিলিজে আপডেট করার পরে, আপনার অ্যাপে শুধু এমন সামগ্রী অন্তর্ভুক্ত করতে হবে যা স্থানিক করা যেতে পারে।
অডিও চ্যানেল গণনা সীমাবদ্ধতা
যখন স্থানিক অডিওর জন্য চারটি শর্ত পূরণ হয়, তখন ExoPlayer একটি মাল্টি-চ্যানেল অডিও ট্র্যাক বেছে নেয়। যদি না হয়, ExoPlayer পরিবর্তে একটি স্টেরিও ট্র্যাক বেছে নেয়। Spatializer
বৈশিষ্ট্য পরিবর্তন হলে, ExoPlayer বর্তমান বৈশিষ্ট্যের সাথে মেলে এমন একটি অডিও ট্র্যাক নির্বাচন করতে একটি নতুন ট্র্যাক নির্বাচন ট্রিগার করবে৷ মনে রাখবেন যে এই নতুন ট্র্যাক নির্বাচন একটি ছোট রিবাফারিং সময়কাল হতে পারে।
অডিও চ্যানেল গণনা সীমাবদ্ধতা নিষ্ক্রিয় করতে, প্লেয়ারে ট্র্যাক নির্বাচন পরামিতিগুলি নীচে দেখানো হিসাবে সেট করুন:
কোটলিন
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
: অডিও স্থানিককরণের জন্য যোগ্য যদিusage
USAGE_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
এ সেট করুন যদি আপনি ডিকোডারটিকে মাল্টি-চ্যানেল PCM আউটপুট করতে কনফিগার করে থাকেন।কোটলিন
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)