জেটপ্যাক সিনকোরের স্থানিক অডিও বৈশিষ্ট্যগুলি আপনাকে আপনার অ্যান্ড্রয়েড এক্সআর অ্যাপ্লিকেশনগুলির মধ্যে নিমজ্জিত অডিও অভিজ্ঞতা তৈরি করতে সক্ষম করে।
স্থানিক অডিও ব্যবহারকারীরা 3D পরিবেশে শব্দ কীভাবে উপলব্ধি করে তা অনুকরণ করে। এটি ব্যবহারকারীর উপরে এবং নীচে সহ সমস্ত দিক থেকে নির্গত শব্দের অনুভূতি তৈরি করে। সিস্টেমটি 3D স্থানের নির্দিষ্ট স্থানে এক বা একাধিক "ভার্চুয়াল স্পিকার" অনুকরণ করে এটি করে।
যেসব অ্যাপ অ্যান্ড্রয়েড এক্সআর-এর জন্য ডিজাইন করা হয়নি বা পরিবর্তিত হয়নি, সেগুলোর অডিও অ্যান্ড্রয়েড এক্সআর-এ স্বয়ংক্রিয়ভাবে স্থানিকীকরণ করা হয়। ব্যবহারকারী যখন তাদের স্থানের চারপাশে ঘোরাফেরা করে, তখন সমস্ত অ্যাপ অডিও সেই প্যানেল থেকে নির্গত হবে যেখানে অ্যাপের UI রেন্ডার করা হয়েছে। উদাহরণস্বরূপ, যদি একটি ঘড়ি অ্যাপ থেকে একটি টাইমার বন্ধ হয়ে যায়, তাহলে অডিওটি অ্যাপ প্যানেলের অবস্থান থেকে আসা শব্দের মতো শোনাবে। অবস্থানগত বাস্তবতার জন্য অ্যান্ড্রয়েড এক্সআর স্বয়ংক্রিয়ভাবে শব্দ পরিবর্তন করবে। উদাহরণস্বরূপ, অ্যাপ প্যানেল এবং ব্যবহারকারীর মধ্যে অনুভূত দূরত্ব বাস্তবতার বৃহত্তর অনুভূতির জন্য অডিও ভলিউমকে সূক্ষ্মভাবে প্রভাবিত করবে।
বিদ্যমান অ্যাপগুলি কীভাবে স্থানিক অডিও রেন্ডার করে সে সম্পর্কে আরও তথ্যের জন্য, এই পৃষ্ঠায় আপনার অ্যাপে স্টেরিও এবং চারপাশের শব্দ যোগ করুন পড়ুন।
আপনি যদি XR-এর জন্য আপনার অ্যাপটি অপ্টিমাইজ করেন, তাহলে Jetpack SceneCore উন্নত স্থানিক অডিও কাস্টমাইজেশনের জন্য সরঞ্জাম সরবরাহ করে। আপনি 3D পরিবেশে শব্দগুলিকে সুনির্দিষ্টভাবে অবস্থান করতে পারেন, বাস্তবসম্মত শব্দ ক্ষেত্রের জন্য অ্যাম্বিসনিক অডিও ব্যবহার করতে পারেন এবং বিল্ট-ইন সার্উন্ড সাউন্ড ইন্টিগ্রেশনের সুবিধা নিতে পারেন।
অ্যান্ড্রয়েড এক্সআর-এ উপলব্ধ স্থানিক অডিওর ধরণ
অ্যান্ড্রয়েড এক্সআর পজিশনাল, স্টেরিও, সার্উন্ড সাউন্ড এবং অ্যাম্বিসনিক অডিও সমর্থন করে।
অবস্থানগত অডিও
একটি পজিশনাল অডিও 3D স্পেসে একটি নির্দিষ্ট বিন্দু থেকে প্লে করার জন্য স্থাপন করা যেতে পারে। উদাহরণস্বরূপ, আপনার ভার্চুয়াল পরিবেশের কোণে একটি কুকুরের ঘেউ ঘেউয়ের একটি 3D মডেল থাকতে পারে। আপনার প্রতিটি অবস্থান থেকে শব্দ নির্গত করে এমন একাধিক সত্তা থাকতে পারে। পজিশনাল অডিও রেন্ডার করার জন্য, ফাইলগুলিকে মনো বা স্টেরিও হতে হবে।
স্থানিক স্টেরিও এবং চারপাশের শব্দ
সমস্ত অ্যান্ড্রয়েড মিডিয়া ফর্ম্যাট পজিশনাল, স্টেরিও এবং চারপাশের সাউন্ডের জন্য সমর্থিত। এই ফর্ম্যাটগুলি ছাড়াও, অ্যান্ড্রয়েড এক্সআর ডিভাইসগুলি ডলবি অ্যাটমস , ডলবি ডিজিটাল এবং ডলবি ডিজিটাল+ অডিও ফর্ম্যাটগুলিকে সমর্থন করতে পারে।
স্টেরিও অডিও বলতে দুটি চ্যানেলের অডিও ফর্ম্যাট বোঝায় এবং সারাউন্ড সাউন্ড বলতে দুটির বেশি চ্যানেলের অডিও ফর্ম্যাট বোঝায়, যেমন ৫.১ সারাউন্ড সাউন্ড বা ৭.১ সারাউন্ড সাউন্ড কনফিগারেশন। প্রতিটি চ্যানেলের সাউন্ড ডেটা একটি স্পিকারের সাথে যুক্ত থাকে। উদাহরণস্বরূপ, স্টেরিওতে সঙ্গীত বাজানোর সময়, বাম স্পিকার চ্যানেলটি ডান থেকে ভিন্ন যন্ত্রের ট্র্যাক নির্গত করতে পারে।
সিনেমা এবং টেলিভিশন শোতে প্রায়শই একাধিক স্পিকার চ্যানেল ব্যবহারের মাধ্যমে বাস্তবতা এবং নিমজ্জন বৃদ্ধির জন্য চারপাশের শব্দ ব্যবহার করা হয়। উদাহরণস্বরূপ, সংলাপ প্রায়শই একটি কেন্দ্র স্পিকার চ্যানেল থেকে বাজানো হয় যখন একটি হেলিকপ্টার উড়ানোর শব্দ বিভিন্ন চ্যানেলকে ক্রমানুসারে ব্যবহার করে বোঝা যায় যে হেলিকপ্টারটি আপনার 3D স্থানের চারপাশে উড়ছে।
অ্যাম্বিসনিক অডিও
অ্যাম্বিসনিক অডিও (অথবা অ্যাম্বিসনিকস) হল অডিওর জন্য একটি স্কাইবক্সের মতো, যা আপনার ব্যবহারকারীদের জন্য একটি নিমজ্জিত সাউন্ডস্কেপ প্রদান করে। ব্যাকগ্রাউন্ড পরিবেশগত শব্দ বা অন্যান্য পরিস্থিতিতে যেখানে আপনি শ্রোতাকে ঘিরে একটি পূর্ণ-গোলাকার শব্দ ক্ষেত্র প্রতিলিপি করতে চান তার জন্য অ্যাম্বিসনিকস ব্যবহার করুন। অ্যান্ড্রয়েড এক্সআর প্রথম, দ্বিতীয় এবং তৃতীয়-ক্রমের অ্যাম্বিসনিকগুলিতে অ্যাম্বিসনিক অডিও ফর্ম্যাট সমর্থন করে। আমরা ওপাস ( .ogg ) এবং পিসিএম/ওয়েভ ( .wav ) ফাইল প্রকারের সুপারিশ করি।
জেটপ্যাক সিনকোরের সাথে স্থানিক অডিও ব্যবহার করুন
Jetpack SceneCore-এর সাহায্যে স্থানিক অডিও বাস্তবায়নের জন্য স্থানিক ক্ষমতা পরীক্ষা করা এবং স্থানিক অডিও লোড করার জন্য একটি API নির্বাচন করা জড়িত।
স্থানিক ক্ষমতা পরীক্ষা করুন
স্পেশাল অডিও বৈশিষ্ট্যগুলি ব্যবহার করার আগে, Session স্পেশাল অডিও সমর্থন করে কিনা তা পরীক্ষা করে নিন। নিম্নলিখিত বিভাগগুলির সমস্ত কোড স্নিপেটে, স্পেশালাইজড অডিও চালানোর চেষ্টা করার আগে ক্ষমতাগুলি পরীক্ষা করা হয়।
স্থানিক অডিও লোড করুন
জেটপ্যাক সিনকোরে ব্যবহারের জন্য স্থানিক অডিও লোড করতে আপনি নিম্নলিখিত যেকোনো API ব্যবহার করতে পারেন।
-
SoundPool: ১ এমবি-র কম আকারের ছোট সাউন্ড এফেক্টের জন্য আদর্শ, এগুলি আগে থেকেই লোড করা হয় এবং শব্দগুলি বারবার ব্যবহার করা যেতে পারে। পজিশনাল অডিওর জন্য অডিও লোড করার এটি একটি দুর্দান্ত উপায়। -
ExoPlayer: সঙ্গীত এবং ভিডিওর মতো স্টেরিও এবং চারপাশের শব্দ সামগ্রী লোড করার জন্য আদর্শ। এছাড়াও ব্যাকগ্রাউন্ড মিডিয়া প্লেব্যাকের জন্য অনুমতি দেয়। -
MediaPlayer: অ্যাম্বিসনিক অডিও লোড করার সবচেয়ে সহজ উপায় প্রদান করে। -
AudioTrack: অডিও ডেটা কীভাবে লোড করতে হয় তার উপর সর্বাধিক নিয়ন্ত্রণ প্রদান করে। অডিওর বাফারগুলি সরাসরি লেখার অনুমতি দেয় অথবা আপনি যদি নিজের অডিও ফাইলগুলি সংশ্লেষিত বা ডিকোড করেন।
মিডিয়া ফর্ম্যাট সাপোর্টের জন্য পরীক্ষা করুন
কিছু মিডিয়া ফরম্যাট অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা সমর্থিত । তবে, একটি নির্দিষ্ট অ্যান্ড্রয়েড এক্সআর ডিভাইস অতিরিক্ত ফরম্যাট সমর্থন করতে পারে, যেমন ডলবি অ্যাটমস । মিডিয়া ফরম্যাট সাপোর্টের জন্য জিজ্ঞাসা করতে, এক্সোপ্লেয়ারের AudioCapabilities ব্যবহার করুন:
val audioCapabilities = AudioCapabilities.getCapabilities(context, androidx.media3.common.AudioAttributes.DEFAULT, null) if (audioCapabilities.supportsEncoding(C.ENCODING_AC3)) { // Device supports playback of the Dolby Digital media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3)) { // Device supports playback of the Dolby Digital Plus media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3_JOC)) { // Device supports playback of the Dolby Digital Plus with Dolby Atmos media format. }
এই ক্ষমতাগুলি পরীক্ষা করার ক্ষেত্রে সম্ভাব্যভাবে কল ব্লক করা জড়িত থাকতে পারে এবং মূল থ্রেডে কল করা উচিত নয় ।
আপনার অ্যাপে অবস্থানগত অডিও যোগ করুন
পজিশনাল সাউন্ড সোর্সগুলি PointSourceParams এবং একটি সংশ্লিষ্ট Entity দ্বারা সংজ্ঞায়িত করা হয়। Entity এর অবস্থান এবং ওরিয়েন্টেশন নির্দেশ করে যে PointSourceParams 3D স্পেসে কোথায় রেন্ডার করা হবে।
অবস্থানগত অডিও উদাহরণ
নিচের উদাহরণটি একটি সাউন্ড পুলে একটি সাউন্ড এফেক্ট অডিও ফাইল লোড করে এবং Entity এর অবস্থানে এটি প্লে করে।
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO) ) { // The session has spatial audio capabilities val maxVolume = 1F val lowPriority = 0 val infiniteLoop = -1 val normalSpeed = 1F val soundPool = SoundPool.Builder() .setAudioAttributes( AudioAttributes.Builder() .setContentType(CONTENT_TYPE_SONIFICATION) .setUsage(USAGE_ASSISTANCE_SONIFICATION) .build() ) .build() val pointSource = PointSourceParams(entity) val soundEffect = appContext.assets.openFd("sounds/tiger_16db.mp3") val pointSoundId = soundPool.load(soundEffect, lowPriority) soundPool.setOnLoadCompleteListener { soundPool, sampleId, status -> // wait for the sound file to be loaded into the soundPool if (status == 0) { SpatialSoundPool.play( session = session, soundPool = soundPool, soundID = pointSoundId, params = pointSource, volume = maxVolume, priority = lowPriority, loop = infiniteLoop, rate = normalSpeed ) } } } else { // The session does not have spatial audio capabilities }
কোড সম্পর্কে গুরুত্বপূর্ণ বিষয়সমূহ
- প্রথম ধাপ হল
spatialCapabilitiesব্যবহার করে Spatial Audio ক্ষমতা বর্তমানে উপলব্ধ কিনা তা পরীক্ষা করা। - contentType কে
CONTENT_TYPE_SONIFICATIONএবং ব্যবহারকেUSAGE_ASSISTANCE_SONIFICATIONএ সেট করলে সিস্টেমটি এই অডিও ফাইলটিকে একটি সাউন্ড এফেক্ট হিসেবে বিবেচনা করতে পারবে। - আগের উদাহরণে অডিও ফাইলটি ব্যবহারের ঠিক আগে পুলে লোড করা হয় যাতে কোডটি সরলতার জন্য একসাথে রাখা যায়। আদর্শভাবে, আপনার অ্যাপ লোড করার সময় আপনার সমস্ত সাউন্ড এফেক্ট অ্যাসিঙ্ক্রোনাসভাবে লোড করা উচিত যাতে আপনার প্রয়োজনের সময় সমস্ত অডিও ফাইল পুলে পাওয়া যায়।
আপনার অ্যাপে স্টেরিও এবং চারপাশের শব্দ যোগ করুন
আপনার অ্যাপে স্টেরিও এবং চারপাশের শব্দ যোগ করার প্রস্তাবিত উপায় হল Exoplayer ব্যবহার করা। Exoplayer সাথে স্পেশিয়াল অডিও কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য, স্পেশিয়াল অডিও গাইডটি দেখুন।
স্টেরিও এবং চারপাশের শব্দ স্পিকারের অবস্থান
সার্উন্ড সাউন্ড স্পিকার পজিশনিং সহ, ভার্চুয়াল সার্উন্ড সাউন্ড স্পিকারগুলি একটি সেন্টার স্পিকারের সাপেক্ষে অবস্থান এবং ওরিয়েন্টেড থাকে, একটি স্ট্যান্ডার্ড ITU কনফিগারেশনে ব্যবহারকারীর চারপাশে।
ডিফল্টরূপে, সেন্টার চ্যানেল স্পিকারটি অ্যাপের mainPanelEntity তে স্থাপন করা হয়। এর মধ্যে এমন মোবাইল অ্যাপও অন্তর্ভুক্ত থাকে যেগুলির অডিও Android XR দ্বারা স্বয়ংক্রিয়ভাবে স্থানিকীকরণ করা হয়।
স্টেরিওর ক্ষেত্রে, স্পিকার স্থাপন চারপাশের শব্দের মতোই, কেবল বাম এবং ডান চ্যানেলগুলি যথাক্রমে প্যানেলের বাম এবং ডান দিকে অবস্থিত।
যদি আপনার একাধিক প্যানেল থাকে এবং আপনি কোন প্যানেলটি অডিও নির্গত করে তা বেছে নিতে চান, অথবা যদি আপনি চান যে স্টেরিও বা চারপাশের অডিও অন্য Entity এর সাথে সাপেক্ষে রেন্ডার করা হোক, তাহলে আপনি PointSourceAttributes ব্যবহার করে সেন্টার চ্যানেলের অবস্থান নির্ধারণ করতে পারেন। বাকি চ্যানেলগুলি পূর্বে উল্লিখিত হিসাবে স্থাপন করা হবে। এই পরিস্থিতিতে, আপনাকে MediaPlayer ব্যবহার করতে হবে।
ব্যবহারকারী যখন তাদের স্থানের চারপাশে ঘোরাফেরা করবেন, তখন স্টেরিও এবং চারপাশের সাউন্ড ভার্চুয়াল স্পিকারগুলি নড়াচড়া করবে এবং সামঞ্জস্য করবে যাতে স্পিকারগুলি সর্বদা একটি সর্বোত্তম অবস্থানে থাকে।
যদি আপনি MediaPlayer বা ExoPlayer ব্যাকগ্রাউন্ড থেকে স্টেরিও বা চারপাশের শব্দ বাজানো চালিয়ে যাওয়ার জন্য কনফিগার করে থাকেন, তাহলে অ্যাপটি ব্যাকগ্রাউন্ডে চালানোর সময় ভার্চুয়াল স্পিকারের অবস্থান পরিবর্তন করা হবে। যেহেতু শব্দকে অ্যাঙ্কর করার জন্য কোনও প্যানেল বা অন্য কোনও স্থান নেই, তাই স্থানিক অডিও ব্যবহারকারীর সাথে চলে (অন্য কথায়, এটি "হেড-লকড")।
চারপাশের শব্দের উদাহরণ
নিম্নলিখিত উদাহরণটি MediaPlayer ব্যবহার করে একটি 5.1 অডিও ফাইল লোড করে এবং ফাইলের কেন্দ্র চ্যানেলটিকে একটি Entity হিসেবে সেট করে।
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val pointSourceAttributes = PointSourceParams(session.scene.mainPanelEntity) val mediaPlayer = MediaPlayer() val fivePointOneAudio = appContext.assets.openFd("sounds/aac_51.ogg") mediaPlayer.reset() mediaPlayer.setDataSource(fivePointOneAudio) val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() SpatialMediaPlayer.setPointSourceParams( session, mediaPlayer, pointSourceAttributes ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
কোড সম্পর্কে গুরুত্বপূর্ণ বিষয়সমূহ
- পজিশনাল অডিও উদাহরণের মতো, প্রথম ধাপ হল
spatialCapabilitiesব্যবহার করে spatial অডিও ক্ষমতা উপলব্ধ কিনা তা পরীক্ষা করা। -
contentTypeকেAudioAttributes.CONTENT_TYPE_MUSICএবং ব্যবহার কেAudioAttributes.USAGE_MEDIAএ সেট করলে সিস্টেমটি এই অডিও ফাইলটিকে সার্উন্ড সাউন্ড হিসেবে বিবেচনা করতে পারে।
আপনার অ্যাপে অ্যাম্বিসনিক সাউন্ড ফিল্ড যোগ করুন
অ্যাম্বিসনিক সাউন্ড ফিল্ড প্লে ব্যাক করার সবচেয়ে সহজ উপায় হল একটি MediaPlayer দিয়ে ফাইলটি লোড করা। যেহেতু অ্যাম্বিসনিক সাউন্ড পুরো সাউন্ডস্কেপে প্রযোজ্য, তাই আপনাকে একটি অবস্থান প্রদানের জন্য একটি Entity নির্দিষ্ট করার প্রয়োজন নেই। পরিবর্তে, আপনি চ্যানেলের সংখ্যা নির্দিষ্ট করে উপযুক্ত অ্যাম্বিসনিক ক্রম সহ SoundFieldAttributes এর একটি উদাহরণ তৈরি করেন।
অ্যাম্বিওনিক্সের উদাহরণ
নিম্নলিখিত উদাহরণটি MediaPlayer ব্যবহার করে একটি অ্যাম্বিসনিক শব্দ ক্ষেত্র বাজায়।
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val soundFieldAttributes = SoundFieldAttributes(SpatializerConstants.AmbisonicsOrder.FIRST_ORDER) val mediaPlayer = MediaPlayer() val soundFieldAudio = appContext.assets.openFd("sounds/foa_basketball_16bit.wav") mediaPlayer.reset() mediaPlayer.setDataSource(soundFieldAudio) val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() SpatialMediaPlayer.setSoundFieldAttributes( session, mediaPlayer, soundFieldAttributes ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
কোড সম্পর্কে গুরুত্বপূর্ণ বিষয়সমূহ
- পূর্ববর্তী স্নিপেটগুলির মতো, প্রথম ধাপ হল
hasCapability()ব্যবহার করে স্থানিক অডিও ক্ষমতা উপলব্ধ কিনা তা পরীক্ষা করা। -
contentTypeএবং ব্যবহার সম্পূর্ণ তথ্যবহুল। -
AMBISONICS_ORDER_FIRST_ORDERSceneCore কে সংকেত দেয় যে সাউন্ড ফিল্ড ফাইলটি চারটি চ্যানেলকে সংজ্ঞায়িত করে।