Jetpack SceneCore-এ স্পেশিয়াল অডিও ফিচার আপনাকে Android XR অ্যাপ্লিকেশনের মধ্যে ইমারসিভ অডিও অভিজ্ঞতা তৈরি করার ক্ষমতা দেয়।
স্পেশিয়াল অডিও, 3D পরিবেশে ব্যবহারকারী কীভাবে সাউন্ড অনুভব করেন তা সিমুলেট করে। এটি এমন অনুভূতি তৈরি করে যেন ব্যবহারকারীর উপর ও নিচ সহ সব দিক থেকে শব্দ আসছে। 3D স্পেসে নির্দিষ্ট লোকেশনে এক বা একাধিক "ভার্চুয়াল স্পিকার" সিমুলেট করার মাধ্যমে সিস্টেম এটি করে।
Android XR-এর জন্য ডিজাইন বা পরিবর্তন করা হয়নি এমন আগে থেকে থাকা অ্যাপের অডিও Android XR-এ অটোমেটিক স্পেশিয়ালাইজ করা হয়। ব্যবহারকারী তার স্পেসে ঘুরে বেড়ানোর সময়, অ্যাপের UI যে প্যানেলে রেন্ডার করা হয় সেখান থেকে সমস্ত অ্যাপ অডিও নির্গত হবে। যেমন, ঘড়ি অ্যাপ থেকে টাইমার বন্ধ হয়ে গেলে, অডিও এমনভাবে শোনাবে যেন এটি অ্যাপ প্যানেলের অবস্থান থেকে আসছে। Android XR পজিশনাল রিয়ালিজমের জন্য অটোমেটিক সাউন্ড পরিবর্তন করবে। যেমন, অ্যাপ প্যানেল ও ব্যবহারকারীর মধ্যে অনুভূত দূরত্ব, অডিও ভলিউমকে সূক্ষ্মভাবে প্রভাবিত করবে, যাতে আরও বাস্তবসম্মত অনুভূতি পাওয়া যায়।
আগে থেকে থাকা অ্যাপ কীভাবে স্পেশিয়াল অডিও রেন্ডার করে সেই সম্পর্কে আরও জানতে, এই পৃষ্ঠায় আপনার অ্যাপে স্টিরিও ও সারাউন্ড সাউন্ড যোগ করুন নিবন্ধটি পড়ুন।
আপনি যদি XR-এর জন্য আপনার অ্যাপ অপ্টিমাইজ করেন, তাহলে Jetpack SceneCore উন্নত স্পেশিয়াল অডিও কাস্টমাইজেশনের জন্য টুল প্রদান করে। আপনি 3D পরিবেশে সাউন্ডের পজিশন নিখুঁতভাবে সেট করতে, বাস্তবসম্মত সাউন্ড ফিল্ডের জন্য অ্যাম্বিসনিক অডিও ব্যবহার করতে এবং বিল্ট-ইন সারাউন্ড সাউন্ড ইন্টিগ্রেশনের সুবিধা নিতে পারবেন।
Android XR-এ উপলভ্য স্পেশিয়াল অডিওর ধরন
Android XR-এ পজিশনাল, স্টিরিও, সারাউন্ড সাউন্ড ও অ্যাম্বিসনিক অডিও কাজ করে।
পজিশনাল অডিও
পজিশনাল অডিওকে 3D স্পেসে নির্দিষ্ট পয়েন্ট থেকে চালানোর জন্য পজিশন করা যেতে পারে। যেমন, আপনার ভার্চুয়াল এনভায়রনমেন্টের কোণে একটি কুকুরের ঘেউ ঘেউ করার 3D মডেল দেখাতে পারেন। আপনার কাছে একাধিক এন্টিটি থাকতে পারে যা তাদের নিজ নিজ অবস্থান থেকে সাউন্ড নির্গত করে। পজিশনাল অডিও রেন্ডার করতে, ফাইল অবশ্যই মোনো বা স্টিরিও হতে হবে।
স্পেশিয়ালাইজড স্টিরিও এবং সারাউন্ড সাউন্ড
পোজিশনাল, স্টিরিও ও সারাউন্ড সাউন্ডের জন্য সব Android মিডিয়া ফর্ম্যাট কাজ করে। এইসব ফর্ম্যাট ছাড়াও, Android XR ডিভাইসে Dolby Atmos, Dolby Digital এবং Dolby Digital+ অডিও ফর্ম্যাট কাজ করতে পারে।
স্টিরিও অডিও বলতে দুটি চ্যানেল সহ অডিও ফর্ম্যাটকে বোঝায় এবং সারাউন্ড সাউন্ড বলতে দুটির বেশি চ্যানেল সহ অডিও ফর্ম্যাটকে বোঝায়, যেমন 5.1 সারাউন্ড সাউন্ড বা 7.1 সারাউন্ড সাউন্ড কনফিগারেশন। প্রতিটি চ্যানেলের সাউন্ড ডেটা একটি স্পিকারের সাথে যুক্ত। যেমন, স্টিরিওতে মিউজিক চালানোর সময়, বাঁদিকের স্পিকার চ্যানেল ডানদিকের থেকে আলাদা ইনস্ট্রুমেন্ট ট্র্যাক নির্গত করতে পারে।
সিনেমা ও টেলিভিশন শোতে প্রায়ই সারাউন্ড সাউন্ড ব্যবহার করা হয় যাতে একাধিক স্পিকার চ্যানেলের মাধ্যমে বাস্তবতা ও ইমার্সন বাড়ানো যায়। যেমন, সেন্টার স্পিকার চ্যানেল থেকে প্রায়ই ডায়ালগ চালানো হয়, যেখানে হেলিকপ্টার ওড়ার শব্দ বিভিন্ন চ্যানেলে ক্রমানুসারে চালানো হতে পারে, যাতে আপনার মনে হয় যে হেলিকপ্টারটি আপনার 3D স্পেসের চারপাশে উড়ছে।
অ্যাম্বিসনিক অডিও
অ্যাম্বিসনিক অডিও (বা অ্যাম্বিসনিক্স) হল অডিওর জন্য স্কাইবক্সের মতো,
যা আপনার ব্যবহারকারীদের জন্য একটি ইমারসিভ সাউন্ডস্কেপ প্রদান করে। ব্যাকগ্রাউন্ড এনভায়রনমেন্টাল সাউন্ড বা অন্যান্য পরিস্থিতিতে অ্যাম্বিসনিক্স ব্যবহার করুন যেখানে আপনি শ্রোতাকে ঘিরে থাকা সম্পূর্ণ-স্ফেরিক্যাল সাউন্ড ফিল্ডের রেপ্লিকা তৈরি করতে চান। Android XR-এ ফার্স্ট, সেকেন্ড ও থার্ড-অর্ডার অ্যাম্বিসনিক্সে
AmbiX অ্যাম্বিসনিক অডিও ফর্ম্যাট কাজ করে। আমরা Opus (.ogg) এবং
PCM/Wave (.wav) ফাইলের ধরন সাজেস্ট করি।
Jetpack SceneCore-এর সাথে স্পেশিয়াল অডিও ব্যবহার করা
Jetpack SceneCore-এর মাধ্যমে স্পেশিয়াল অডিও প্রয়োগ করার মধ্যে স্পেশিয়াল ক্ষমতা চেক করা এবং স্পেশিয়াল অডিও লোড করার জন্য API বেছে নেওয়া অন্তর্ভুক্ত।
স্পেশিয়াল ক্ষমতা চেক করুন
Spatial Audio ফিচার ব্যবহার করার আগে, Session-এ Spatial Audio কাজ করে কিনা
তা চেক করুন। নিচের বিভাগে সব কোড স্নিপেটে,
স্পেশিয়ালাইজড অডিও চালানোর চেষ্টা করার আগে ক্ষমতা চেক করা হয়।
স্পেশিয়াল অডিও লোড করুন
Jetpack SceneCore-এ ব্যবহার করার জন্য স্পেশিয়াল অডিও লোড করতে আপনি নিম্নলিখিত যেকোনও API ব্যবহার করতে পারেন।
SoundPool: ১ এমবির কম সাইজের ছোট সাউন্ড এফেক্টের জন্য আদর্শ, এগুলি সময়ের আগেই লোড হয়ে যায় এবং সাউন্ডগুলি বারবার ব্যবহার করা যায়। পজিশনাল অডিওর জন্য অডিও লোড করার এটি একটি দুর্দান্ত উপায়।ExoPlayer: মিউজিক ও ভিডিওর মতো স্টেরিও ও সারাউন্ড সাউন্ড কন্টেন্ট লোড করার জন্য আদর্শ। এছাড়াও, ব্যাকগ্রাউন্ডে মিডিয়া প্লেব্যাক করার অনুমতি দেয়।MediaPlayer: অ্যাম্বিসনিক অডিও লোড করার সবচেয়ে সহজ উপায় প্রদান করে।AudioTrack: অডিও ডেটা কীভাবে লোড করতে হবে তার উপর সবচেয়ে বেশি নিয়ন্ত্রণ প্রদান করে। সরাসরি অডিওর বাফার লেখার অনুমতি দেয় অথবা আপনি নিজের অডিও ফাইল সিন্থেসাইজ বা ডিকোড করলে।
মিডিয়া ফর্ম্যাট কাজ করে কিনা তা চেক করুন
কিছু মিডিয়া ফর্ম্যাট Android প্ল্যাটফর্মে কাজ করে। তবে, কোনও নির্দিষ্ট Android XR ডিভাইস অতিরিক্ত ফর্ম্যাট সাপোর্ট করতে পারে, যেমন
Dolby Atmos। মিডিয়া ফর্ম্যাট সাপোর্ট সংক্রান্ত কোয়েরি করতে, ExoPlayer-এর
AudioCapabilities ব্যবহার করুন:
val audioCapabilities = AudioCapabilities.getCapabilities( context, androidx.media3.common.AudioAttributes.DEFAULT, null, emptyList() ) 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-এর পজিশন ও ওরিয়েন্টেশন থেকে বোঝা যায়
3D স্পেসে PointSourceParams কোথায় রেন্ডার করা হয়েছে। MediaPlayer ইনস্ট্যান্সে PointSourceParams এবং
তার সাথে সম্পর্কিত entity সেট করতে
SpatialMediaPlayer-এ setPointSourceParams কল করুন।
পজিশনাল অডিওর উদাহরণ
নিম্নলিখিত উদাহরণে সাউন্ড এফেক্ট অডিও ফাইল সাউন্ড পুলে লোড করা হয় এবং
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() 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, entity = entity, soundPool = soundPool, soundID = pointSoundId, params = pointSource, volume = maxVolume, priority = lowPriority, loop = infiniteLoop, rate = normalSpeed ) } } } else { // The session does not have spatial audio capabilities }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- প্রথম ধাপ হল
spatialCapabilitiesব্যবহার করে স্পেশিয়াল অডিওর ক্ষমতা উপলভ্য আছে কিনা তা চেক করা। - 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() 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, entity = session.scene.mainPanelEntity, ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- পজিশনাল অডিওর উদাহরণ-এর মতো, প্রথম ধাপ হল
spatialCapabilitiesব্যবহার করে স্পেশিয়াল অডিওর ক্ষমতা উপলভ্য কিনা তা চেক করা। 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 }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- আগের স্নিপেটের মতো, প্রথম ধাপ হল
spatialCapabilitiesব্যবহার করে স্পেশিয়াল অডিও উপলভ্য কিনা তা চেক করা। contentTypeএবং ব্যবহার শুধুমাত্র তথ্যমূলক।SpatializerConstants.AmbisonicsOrder.FIRST_ORDER, SceneCore-কে সিগন্যাল পাঠায় যে সাউন্ড ফিল্ড ফাইল চারটি চ্যানেল নির্ধারণ করে।